From a453ac31f3428614cceb99027f8efbdb9258a40b Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Tue, 14 May 2024 22:03:01 +0200 Subject: Adding upstream version 2.10.7+merged+base+2.10.8+dfsg. Signed-off-by: Daniel Baumann --- .../ansible_collections/cisco/nxos/.gitignore | 108 + .../cisco/nxos/.pre-commit-config.yaml | 21 + .../ansible_collections/cisco/nxos/FILES.json | 15244 +++++++++++++++++++ .../ansible_collections/cisco/nxos/LICENSE | 674 + .../ansible_collections/cisco/nxos/MANIFEST.json | 36 + .../ansible_collections/cisco/nxos/README.md | 220 + .../ansible_collections/cisco/nxos/bindep.txt | 6 + .../cisco/nxos/changelogs/CHANGELOG.rst | 269 + .../cisco/nxos/changelogs/changelog.yaml | 449 + .../cisco/nxos/changelogs/config.yaml | 32 + .../cisco.nxos.nxos_aaa_server_host_module.rst | 576 + .../docs/cisco.nxos.nxos_aaa_server_module.rst | 481 + .../docs/cisco.nxos.nxos_acl_interface_module.rst | 438 + .../docs/cisco.nxos.nxos_acl_interfaces_module.rst | 609 + .../cisco/nxos/docs/cisco.nxos.nxos_acl_module.rst | 835 + .../nxos/docs/cisco.nxos.nxos_acls_module.rst | 2789 ++++ .../nxos/docs/cisco.nxos.nxos_banner_module.rst | 404 + .../docs/cisco.nxos.nxos_bfd_global_module.rst | 559 + .../docs/cisco.nxos.nxos_bfd_interfaces_module.rst | 393 + .../nxos/docs/cisco.nxos.nxos_bgp_af_module.rst | 899 ++ .../docs/cisco.nxos.nxos_bgp_global_module.rst | 5376 +++++++ .../cisco/nxos/docs/cisco.nxos.nxos_bgp_module.rst | 1073 ++ .../cisco.nxos.nxos_bgp_neighbor_af_module.rst | 971 ++ .../docs/cisco.nxos.nxos_bgp_neighbor_module.rst | 794 + .../cisco/nxos/docs/cisco.nxos.nxos_cliconf.rst | 43 + .../nxos/docs/cisco.nxos.nxos_command_module.rst | 490 + .../nxos/docs/cisco.nxos.nxos_config_module.rst | 799 + .../docs/cisco.nxos.nxos_devicealias_module.rst | 273 + .../docs/cisco.nxos.nxos_evpn_global_module.rst | 355 + .../nxos/docs/cisco.nxos.nxos_evpn_vni_module.rst | 445 + .../nxos/docs/cisco.nxos.nxos_facts_module.rst | 766 + .../nxos/docs/cisco.nxos.nxos_feature_module.rst | 382 + .../nxos/docs/cisco.nxos.nxos_file_copy_module.rst | 691 + .../cisco/nxos/docs/cisco.nxos.nxos_gir_module.rst | 535 + ...sco.nxos.nxos_gir_profile_management_module.rst | 468 + .../cisco.nxos.nxos_hsrp_interfaces_module.rst | 343 + .../nxos/docs/cisco.nxos.nxos_hsrp_module.rst | 539 + .../cisco/nxos/docs/cisco.nxos.nxos_httpapi.rst | 43 + .../docs/cisco.nxos.nxos_igmp_interface_module.rst | 693 + .../nxos/docs/cisco.nxos.nxos_igmp_module.rst | 424 + .../docs/cisco.nxos.nxos_igmp_snooping_module.rst | 458 + .../docs/cisco.nxos.nxos_install_os_module.rst | 416 + .../nxos/docs/cisco.nxos.nxos_interface_module.rst | 1042 ++ .../docs/cisco.nxos.nxos_interface_ospf_module.rst | 622 + .../docs/cisco.nxos.nxos_interfaces_module.rst | 576 + .../docs/cisco.nxos.nxos_l2_interface_module.rst | 639 + .../docs/cisco.nxos.nxos_l2_interfaces_module.rst | 537 + .../docs/cisco.nxos.nxos_l3_interface_module.rst | 515 + .../docs/cisco.nxos.nxos_l3_interfaces_module.rst | 620 + .../cisco.nxos.nxos_lacp_interfaces_module.rst | 575 + .../nxos/docs/cisco.nxos.nxos_lacp_module.rst | 399 + .../docs/cisco.nxos.nxos_lag_interfaces_module.rst | 482 + .../nxos/docs/cisco.nxos.nxos_linkagg_module.rst | 637 + .../docs/cisco.nxos.nxos_lldp_global_module.rst | 660 + .../cisco.nxos.nxos_lldp_interfaces_module.rst | 406 + .../nxos/docs/cisco.nxos.nxos_lldp_module.rst | 372 + .../nxos/docs/cisco.nxos.nxos_logging_module.rst | 680 + .../nxos/docs/cisco.nxos.nxos_ntp_auth_module.rst | 446 + .../cisco/nxos/docs/cisco.nxos.nxos_ntp_module.rst | 536 + .../docs/cisco.nxos.nxos_ntp_options_module.rst | 414 + .../nxos/docs/cisco.nxos.nxos_nxapi_module.rst | 533 + .../cisco.nxos.nxos_ospf_interfaces_module.rst | 1986 +++ .../nxos/docs/cisco.nxos.nxos_ospf_module.rst | 381 + .../nxos/docs/cisco.nxos.nxos_ospf_vrf_module.rst | 601 + .../nxos/docs/cisco.nxos.nxos_ospfv2_module.rst | 5400 +++++++ .../nxos/docs/cisco.nxos.nxos_ospfv3_module.rst | 4452 ++++++ .../docs/cisco.nxos.nxos_overlay_global_module.rst | 353 + .../docs/cisco.nxos.nxos_pim_interface_module.rst | 612 + .../cisco/nxos/docs/cisco.nxos.nxos_pim_module.rst | 380 + .../docs/cisco.nxos.nxos_pim_rp_address_module.rst | 436 + .../nxos/docs/cisco.nxos.nxos_ping_module.rst | 503 + .../nxos/docs/cisco.nxos.nxos_reboot_module.rst | 356 + .../nxos/docs/cisco.nxos.nxos_rollback_module.rst | 392 + .../cisco/nxos/docs/cisco.nxos.nxos_rpm_module.rst | 459 + .../cisco/nxos/docs/cisco.nxos.nxos_smu_module.rst | 380 + .../nxos/docs/cisco.nxos.nxos_snapshot_module.rst | 596 + .../docs/cisco.nxos.nxos_snmp_community_module.rst | 423 + .../docs/cisco.nxos.nxos_snmp_contact_module.rst | 374 + .../nxos/docs/cisco.nxos.nxos_snmp_host_module.rst | 510 + .../docs/cisco.nxos.nxos_snmp_location_module.rst | 378 + .../docs/cisco.nxos.nxos_snmp_traps_module.rst | 411 + .../nxos/docs/cisco.nxos.nxos_snmp_user_module.rst | 457 + .../docs/cisco.nxos.nxos_static_route_module.rst | 630 + .../docs/cisco.nxos.nxos_static_routes_module.rst | 722 + .../nxos/docs/cisco.nxos.nxos_system_module.rst | 468 + .../nxos/docs/cisco.nxos.nxos_telemetry_module.rst | 753 + .../docs/cisco.nxos.nxos_udld_interface_module.rst | 483 + .../nxos/docs/cisco.nxos.nxos_udld_module.rst | 489 + .../nxos/docs/cisco.nxos.nxos_user_module.rst | 592 + .../nxos/docs/cisco.nxos.nxos_vlan_module.rst | 804 + .../nxos/docs/cisco.nxos.nxos_vlans_module.rst | 581 + .../docs/cisco.nxos.nxos_vpc_interface_module.rst | 409 + .../cisco/nxos/docs/cisco.nxos.nxos_vpc_module.rst | 585 + .../nxos/docs/cisco.nxos.nxos_vrf_af_module.rst | 538 + .../docs/cisco.nxos.nxos_vrf_interface_module.rst | 399 + .../cisco/nxos/docs/cisco.nxos.nxos_vrf_module.rst | 727 + .../nxos/docs/cisco.nxos.nxos_vrrp_module.rst | 510 + .../nxos/docs/cisco.nxos.nxos_vsan_module.rst | 225 + .../docs/cisco.nxos.nxos_vtp_domain_module.rst | 428 + .../docs/cisco.nxos.nxos_vtp_password_module.rst | 454 + .../docs/cisco.nxos.nxos_vtp_version_module.rst | 430 + .../docs/cisco.nxos.nxos_vxlan_vtep_module.rst | 546 + .../docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst | 519 + .../docs/cisco.nxos.nxos_zone_zoneset_module.rst | 537 + .../cisco/nxos/meta/runtime.yml | 658 + .../cisco/nxos/plugins/action/__init__.py | 0 .../cisco/nxos/plugins/action/nxos.py | 264 + .../cisco/nxos/plugins/action/nxos_file_copy.py | 632 + .../cisco/nxos/plugins/cliconf/__init__.py | 0 .../cisco/nxos/plugins/cliconf/nxos.py | 391 + .../cisco/nxos/plugins/doc_fragments/__init__.py | 0 .../cisco/nxos/plugins/doc_fragments/nxos.py | 119 + .../cisco/nxos/plugins/filter/__init__.py | 0 .../cisco/nxos/plugins/httpapi/__init__.py | 0 .../cisco/nxos/plugins/httpapi/nxos.py | 271 + .../cisco/nxos/plugins/inventory/__init__.py | 0 .../cisco/nxos/plugins/module_utils/__init__.py | 0 .../nxos/plugins/module_utils/network/__init__.py | 0 .../plugins/module_utils/network/nxos/__init__.py | 0 .../module_utils/network/nxos/argspec/__init__.py | 0 .../nxos/argspec/acl_interfaces/__init__.py | 0 .../nxos/argspec/acl_interfaces/acl_interfaces.py | 85 + .../network/nxos/argspec/acls/__init__.py | 0 .../module_utils/network/nxos/argspec/acls/acls.py | 361 + .../nxos/argspec/bfd_interfaces/__init__.py | 0 .../nxos/argspec/bfd_interfaces/bfd_interfaces.py | 64 + .../network/nxos/argspec/bgp_global/__init__.py | 0 .../network/nxos/argspec/bgp_global/bgp_global.py | 516 + .../network/nxos/argspec/facts/__init__.py | 0 .../network/nxos/argspec/facts/facts.py | 26 + .../nxos/argspec/hsrp_interfaces/__init__.py | 0 .../argspec/hsrp_interfaces/hsrp_interfaces.py | 63 + .../network/nxos/argspec/interfaces/__init__.py | 0 .../network/nxos/argspec/interfaces/interfaces.py | 69 + .../network/nxos/argspec/l2_interfaces/__init__.py | 0 .../nxos/argspec/l2_interfaces/l2_interfaces.py | 76 + .../network/nxos/argspec/l3_interfaces/__init__.py | 0 .../nxos/argspec/l3_interfaces/l3_interfaces.py | 85 + .../network/nxos/argspec/lacp/__init__.py | 0 .../module_utils/network/nxos/argspec/lacp/lacp.py | 74 + .../nxos/argspec/lacp_interfaces/__init__.py | 0 .../argspec/lacp_interfaces/lacp_interfaces.py | 79 + .../nxos/argspec/lag_interfaces/__init__.py | 0 .../nxos/argspec/lag_interfaces/lag_interfaces.py | 73 + .../network/nxos/argspec/lldp_global/__init__.py | 0 .../nxos/argspec/lldp_global/lldp_global.py | 91 + .../nxos/argspec/lldp_interfaces/__init__.py | 0 .../argspec/lldp_interfaces/lldp_interfaces.py | 70 + .../nxos/argspec/ospf_interfaces/__init__.py | 0 .../argspec/ospf_interfaces/ospf_interfaces.py | 130 + .../network/nxos/argspec/ospfv2/__init__.py | 0 .../network/nxos/argspec/ospfv2/ospfv2.py | 697 + .../network/nxos/argspec/ospfv3/__init__.py | 0 .../network/nxos/argspec/ospfv3/ospfv3.py | 551 + .../network/nxos/argspec/static_routes/__init__.py | 0 .../nxos/argspec/static_routes/static_routes.py | 94 + .../network/nxos/argspec/telemetry/__init__.py | 0 .../network/nxos/argspec/telemetry/telemetry.py | 118 + .../network/nxos/argspec/vlans/__init__.py | 0 .../network/nxos/argspec/vlans/vlans.py | 67 + .../module_utils/network/nxos/cmdref/__init__.py | 0 .../network/nxos/cmdref/telemetry/__init__.py | 0 .../network/nxos/cmdref/telemetry/telemetry.py | 146 + .../module_utils/network/nxos/config/__init__.py | 0 .../network/nxos/config/acl_interfaces/__init__.py | 0 .../nxos/config/acl_interfaces/acl_interfaces.py | 350 + .../network/nxos/config/acls/__init__.py | 0 .../module_utils/network/nxos/config/acls/acls.py | 765 + .../network/nxos/config/bfd_interfaces/__init__.py | 0 .../nxos/config/bfd_interfaces/bfd_interfaces.py | 323 + .../network/nxos/config/bgp_global/__init__.py | 0 .../network/nxos/config/bgp_global/bgp_global.py | 412 + .../nxos/config/hsrp_interfaces/__init__.py | 0 .../nxos/config/hsrp_interfaces/hsrp_interfaces.py | 302 + .../network/nxos/config/interfaces/__init__.py | 0 .../network/nxos/config/interfaces/interfaces.py | 495 + .../network/nxos/config/l2_interfaces/__init__.py | 0 .../nxos/config/l2_interfaces/l2_interfaces.py | 355 + .../network/nxos/config/l3_interfaces/__init__.py | 0 .../nxos/config/l3_interfaces/l3_interfaces.py | 568 + .../network/nxos/config/lacp/__init__.py | 0 .../module_utils/network/nxos/config/lacp/lacp.py | 234 + .../nxos/config/lacp_interfaces/__init__.py | 0 .../nxos/config/lacp_interfaces/lacp_interfaces.py | 336 + .../network/nxos/config/lag_interfaces/__init__.py | 0 .../nxos/config/lag_interfaces/lag_interfaces.py | 335 + .../network/nxos/config/lldp_global/__init__.py | 0 .../network/nxos/config/lldp_global/lldp_global.py | 285 + .../nxos/config/lldp_interfaces/__init__.py | 0 .../nxos/config/lldp_interfaces/lldp_interfaces.py | 325 + .../nxos/config/ospf_interfaces/__init__.py | 0 .../nxos/config/ospf_interfaces/ospf_interfaces.py | 206 + .../network/nxos/config/ospfv2/__init__.py | 0 .../network/nxos/config/ospfv2/ospfv2.py | 238 + .../network/nxos/config/ospfv3/__init__.py | 0 .../network/nxos/config/ospfv3/ospfv3.py | 253 + .../network/nxos/config/static_routes/__init__.py | 0 .../nxos/config/static_routes/static_routes.py | 616 + .../network/nxos/config/telemetry/__init__.py | 0 .../network/nxos/config/telemetry/telemetry.py | 665 + .../network/nxos/config/vlans/__init__.py | 0 .../network/nxos/config/vlans/vlans.py | 338 + .../module_utils/network/nxos/facts/__init__.py | 0 .../network/nxos/facts/acl_interfaces/__init__.py | 0 .../nxos/facts/acl_interfaces/acl_interfaces.py | 135 + .../network/nxos/facts/acls/__init__.py | 0 .../module_utils/network/nxos/facts/acls/acls.py | 283 + .../network/nxos/facts/bfd_interfaces/__init__.py | 0 .../nxos/facts/bfd_interfaces/bfd_interfaces.py | 114 + .../network/nxos/facts/bgp_global/__init__.py | 0 .../network/nxos/facts/bgp_global/bgp_global.py | 135 + .../module_utils/network/nxos/facts/facts.py | 145 + .../network/nxos/facts/hsrp_interfaces/__init__.py | 0 .../nxos/facts/hsrp_interfaces/hsrp_interfaces.py | 100 + .../network/nxos/facts/interfaces/__init__.py | 0 .../network/nxos/facts/interfaces/interfaces.py | 119 + .../network/nxos/facts/l2_interfaces/__init__.py | 0 .../nxos/facts/l2_interfaces/l2_interfaces.py | 109 + .../network/nxos/facts/l3_interfaces/__init__.py | 0 .../nxos/facts/l3_interfaces/l3_interfaces.py | 144 + .../network/nxos/facts/lacp/__init__.py | 0 .../module_utils/network/nxos/facts/lacp/lacp.py | 93 + .../network/nxos/facts/lacp_interfaces/__init__.py | 0 .../nxos/facts/lacp_interfaces/lacp_interfaces.py | 119 + .../network/nxos/facts/lag_interfaces/__init__.py | 0 .../nxos/facts/lag_interfaces/lag_interfaces.py | 112 + .../network/nxos/facts/legacy/__init__.py | 0 .../module_utils/network/nxos/facts/legacy/base.py | 822 + .../network/nxos/facts/lldp_global/__init__.py | 0 .../network/nxos/facts/lldp_global/lldp_global.py | 113 + .../network/nxos/facts/lldp_interfaces/__init__.py | 0 .../nxos/facts/lldp_interfaces/lldp_interfaces.py | 129 + .../network/nxos/facts/ospf_interfaces/__init__.py | 0 .../nxos/facts/ospf_interfaces/ospf_interfaces.py | 82 + .../network/nxos/facts/ospfv2/__init__.py | 0 .../network/nxos/facts/ospfv2/ospfv2.py | 97 + .../network/nxos/facts/ospfv3/__init__.py | 0 .../network/nxos/facts/ospfv3/ospfv3.py | 93 + .../network/nxos/facts/static_routes/__init__.py | 0 .../nxos/facts/static_routes/static_routes.py | 245 + .../network/nxos/facts/telemetry/__init__.py | 0 .../network/nxos/facts/telemetry/telemetry.py | 210 + .../network/nxos/facts/vlans/__init__.py | 0 .../module_utils/network/nxos/facts/vlans/vlans.py | 192 + .../nxos/plugins/module_utils/network/nxos/nxos.py | 1501 ++ .../network/nxos/rm_templates/__init__.py | 0 .../network/nxos/rm_templates/bgp_global.py | 1455 ++ .../network/nxos/rm_templates/ospf_interfaces.py | 505 + .../network/nxos/rm_templates/ospfv2.py | 1105 ++ .../network/nxos/rm_templates/ospfv3.py | 951 ++ .../module_utils/network/nxos/utils/__init__.py | 0 .../network/nxos/utils/telemetry/__init__.py | 0 .../network/nxos/utils/telemetry/telemetry.py | 276 + .../module_utils/network/nxos/utils/utils.py | 145 + .../cisco/nxos/plugins/modules/__init__.py | 0 .../cisco/nxos/plugins/modules/nxos_aaa_server.py | 364 + .../nxos/plugins/modules/nxos_aaa_server_host.py | 383 + .../cisco/nxos/plugins/modules/nxos_acl.py | 698 + .../nxos/plugins/modules/nxos_acl_interface.py | 227 + .../nxos/plugins/modules/nxos_acl_interfaces.py | 437 + .../cisco/nxos/plugins/modules/nxos_acls.py | 819 + .../cisco/nxos/plugins/modules/nxos_banner.py | 229 + .../cisco/nxos/plugins/modules/nxos_bfd_global.py | 336 + .../nxos/plugins/modules/nxos_bfd_interfaces.py | 299 + .../cisco/nxos/plugins/modules/nxos_bgp.py | 786 + .../cisco/nxos/plugins/modules/nxos_bgp_af.py | 935 ++ .../cisco/nxos/plugins/modules/nxos_bgp_global.py | 1657 ++ .../nxos/plugins/modules/nxos_bgp_neighbor.py | 588 + .../nxos/plugins/modules/nxos_bgp_neighbor_af.py | 815 + .../cisco/nxos/plugins/modules/nxos_command.py | 235 + .../cisco/nxos/plugins/modules/nxos_config.py | 598 + .../cisco/nxos/plugins/modules/nxos_devicealias.py | 593 + .../cisco/nxos/plugins/modules/nxos_evpn_global.py | 109 + .../cisco/nxos/plugins/modules/nxos_evpn_vni.py | 310 + .../cisco/nxos/plugins/modules/nxos_facts.py | 248 + .../cisco/nxos/plugins/modules/nxos_feature.py | 285 + .../cisco/nxos/plugins/modules/nxos_file_copy.py | 201 + .../cisco/nxos/plugins/modules/nxos_gir.py | 371 + .../plugins/modules/nxos_gir_profile_management.py | 218 + .../cisco/nxos/plugins/modules/nxos_hsrp.py | 537 + .../nxos/plugins/modules/nxos_hsrp_interfaces.py | 261 + .../cisco/nxos/plugins/modules/nxos_igmp.py | 168 + .../nxos/plugins/modules/nxos_igmp_interface.py | 687 + .../nxos/plugins/modules/nxos_igmp_snooping.py | 321 + .../cisco/nxos/plugins/modules/nxos_install_os.py | 607 + .../cisco/nxos/plugins/modules/nxos_interface.py | 991 ++ .../nxos/plugins/modules/nxos_interface_ospf.py | 614 + .../cisco/nxos/plugins/modules/nxos_interfaces.py | 403 + .../nxos/plugins/modules/nxos_l2_interface.py | 702 + .../nxos/plugins/modules/nxos_l2_interfaces.py | 404 + .../nxos/plugins/modules/nxos_l3_interface.py | 290 + .../nxos/plugins/modules/nxos_l3_interfaces.py | 404 + .../cisco/nxos/plugins/modules/nxos_lacp.py | 275 + .../nxos/plugins/modules/nxos_lacp_interfaces.py | 378 + .../nxos/plugins/modules/nxos_lag_interfaces.py | 365 + .../cisco/nxos/plugins/modules/nxos_linkagg.py | 559 + .../cisco/nxos/plugins/modules/nxos_lldp.py | 129 + .../cisco/nxos/plugins/modules/nxos_lldp_global.py | 342 + .../nxos/plugins/modules/nxos_lldp_interfaces.py | 260 + .../cisco/nxos/plugins/modules/nxos_logging.py | 979 ++ .../cisco/nxos/plugins/modules/nxos_ntp.py | 459 + .../cisco/nxos/plugins/modules/nxos_ntp_auth.py | 347 + .../cisco/nxos/plugins/modules/nxos_ntp_options.py | 173 + .../cisco/nxos/plugins/modules/nxos_nxapi.py | 442 + .../cisco/nxos/plugins/modules/nxos_ospf.py | 171 + .../nxos/plugins/modules/nxos_ospf_interfaces.py | 1445 ++ .../cisco/nxos/plugins/modules/nxos_ospf_vrf.py | 495 + .../cisco/nxos/plugins/modules/nxos_ospfv2.py | 1981 +++ .../cisco/nxos/plugins/modules/nxos_ospfv3.py | 1699 +++ .../nxos/plugins/modules/nxos_overlay_global.py | 204 + .../cisco/nxos/plugins/modules/nxos_pim.py | 220 + .../nxos/plugins/modules/nxos_pim_interface.py | 621 + .../nxos/plugins/modules/nxos_pim_rp_address.py | 256 + .../cisco/nxos/plugins/modules/nxos_ping.py | 237 + .../cisco/nxos/plugins/modules/nxos_reboot.py | 94 + .../cisco/nxos/plugins/modules/nxos_rollback.py | 134 + .../cisco/nxos/plugins/modules/nxos_rpm.py | 421 + .../cisco/nxos/plugins/modules/nxos_smu.py | 163 + .../cisco/nxos/plugins/modules/nxos_snapshot.py | 425 + .../nxos/plugins/modules/nxos_snmp_community.py | 253 + .../nxos/plugins/modules/nxos_snmp_contact.py | 151 + .../cisco/nxos/plugins/modules/nxos_snmp_host.py | 521 + .../nxos/plugins/modules/nxos_snmp_location.py | 156 + .../cisco/nxos/plugins/modules/nxos_snmp_traps.py | 331 + .../cisco/nxos/plugins/modules/nxos_snmp_user.py | 413 + .../nxos/plugins/modules/nxos_static_route.py | 383 + .../nxos/plugins/modules/nxos_static_routes.py | 476 + .../cisco/nxos/plugins/modules/nxos_system.py | 402 + .../cisco/nxos/plugins/modules/nxos_telemetry.py | 337 + .../cisco/nxos/plugins/modules/nxos_udld.py | 266 + .../nxos/plugins/modules/nxos_udld_interface.py | 315 + .../cisco/nxos/plugins/modules/nxos_user.py | 483 + .../cisco/nxos/plugins/modules/nxos_vlan.py | 849 ++ .../cisco/nxos/plugins/modules/nxos_vlans.py | 438 + .../cisco/nxos/plugins/modules/nxos_vpc.py | 482 + .../nxos/plugins/modules/nxos_vpc_interface.py | 353 + .../cisco/nxos/plugins/modules/nxos_vrf.py | 643 + .../cisco/nxos/plugins/modules/nxos_vrf_af.py | 283 + .../nxos/plugins/modules/nxos_vrf_interface.py | 278 + .../cisco/nxos/plugins/modules/nxos_vrrp.py | 442 + .../cisco/nxos/plugins/modules/nxos_vsan.py | 385 + .../cisco/nxos/plugins/modules/nxos_vtp_domain.py | 220 + .../nxos/plugins/modules/nxos_vtp_password.py | 287 + .../cisco/nxos/plugins/modules/nxos_vtp_version.py | 217 + .../cisco/nxos/plugins/modules/nxos_vxlan_vtep.py | 488 + .../nxos/plugins/modules/nxos_vxlan_vtep_vni.py | 482 + .../nxos/plugins/modules/nxos_zone_zoneset.py | 990 ++ .../cisco/nxos/plugins/modules/storage/__init__.py | 0 .../plugins/modules/storage/nxos_devicealias.py | 593 + .../nxos/plugins/modules/storage/nxos_vsan.py | 385 + .../plugins/modules/storage/nxos_zone_zoneset.py | 990 ++ .../cisco/nxos/plugins/terminal/__init__.py | 0 .../cisco/nxos/plugins/terminal/nxos.py | 142 + .../cisco/nxos/requirements.txt | 2 + .../cisco/nxos/test-requirements.txt | 7 + .../cisco/nxos/tests/.gitignore | 1 + .../network-integration.requirements.txt | 6 + .../nxos/tests/integration/target-prefixes.network | 1 + .../targets/nxos_aaa_server/defaults/main.yaml | 2 + .../targets/nxos_aaa_server/meta/main.yml | 3 + .../targets/nxos_aaa_server/tasks/cli.yaml | 28 + .../targets/nxos_aaa_server/tasks/main.yaml | 8 + .../targets/nxos_aaa_server/tasks/nxapi.yaml | 28 + .../nxos_aaa_server/tests/common/radius.yaml | 98 + .../nxos_aaa_server/tests/common/tacacs.yaml | 108 + .../nxos_aaa_server_host/defaults/main.yaml | 2 + .../targets/nxos_aaa_server_host/meta/main.yml | 3 + .../targets/nxos_aaa_server_host/tasks/cli.yaml | 28 + .../targets/nxos_aaa_server_host/tasks/main.yaml | 8 + .../targets/nxos_aaa_server_host/tasks/nxapi.yaml | 28 + .../nxos_aaa_server_host/tests/common/radius.yaml | 199 + .../nxos_aaa_server_host/tests/common/tacacs.yaml | 202 + .../targets/nxos_acl/defaults/main.yaml | 2 + .../integration/targets/nxos_acl/meta/main.yml | 3 + .../integration/targets/nxos_acl/tasks/cli.yaml | 28 + .../integration/targets/nxos_acl/tasks/main.yaml | 8 + .../integration/targets/nxos_acl/tasks/nxapi.yaml | 28 + .../targets/nxos_acl/tests/common/sanity.yaml | 230 + .../targets/nxos_acl_interface/defaults/main.yaml | 2 + .../targets/nxos_acl_interface/meta/main.yml | 3 + .../targets/nxos_acl_interface/tasks/cli.yaml | 28 + .../targets/nxos_acl_interface/tasks/main.yaml | 8 + .../targets/nxos_acl_interface/tasks/nxapi.yaml | 28 + .../nxos_acl_interface/tests/common/sanity.yaml | 122 + .../targets/nxos_acl_interfaces/defaults/main.yaml | 2 + .../targets/nxos_acl_interfaces/meta/main.yml | 3 + .../targets/nxos_acl_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_acl_interfaces/tasks/main.yaml | 8 + .../targets/nxos_acl_interfaces/tasks/nxapi.yaml | 28 + .../templates/populate_config.cfg | 11 + .../nxos_acl_interfaces/tests/common/deleted.yml | 59 + .../tests/common/empty_config.yml | 62 + .../nxos_acl_interfaces/tests/common/gathered.yml | 35 + .../nxos_acl_interfaces/tests/common/merged.yml | 72 + .../tests/common/overridden.yml | 77 + .../nxos_acl_interfaces/tests/common/parsed.yml | 32 + .../tests/common/populate_acl.yaml | 9 + .../tests/common/populate_config.yaml | 4 + .../tests/common/remove_config.yaml | 37 + .../nxos_acl_interfaces/tests/common/rendered.yml | 57 + .../nxos_acl_interfaces/tests/common/replaced.yml | 70 + .../nxos_acl_interfaces/tests/common/rtt.yml | 116 + .../targets/nxos_acl_interfaces/vars/main.yml | 21 + .../targets/nxos_acls/defaults/main.yaml | 2 + .../integration/targets/nxos_acls/meta/main.yml | 3 + .../integration/targets/nxos_acls/tasks/cli.yaml | 27 + .../integration/targets/nxos_acls/tasks/main.yaml | 15 + .../integration/targets/nxos_acls/tasks/nxapi.yaml | 27 + .../targets/nxos_acls/tests/common/deleted.yml | 56 + .../targets/nxos_acls/tests/common/gathered.yml | 35 + .../targets/nxos_acls/tests/common/merged.yml | 118 + .../targets/nxos_acls/tests/common/overridden.yml | 107 + .../targets/nxos_acls/tests/common/parsed.yml | 39 + .../nxos_acls/tests/common/populate_config.yaml | 15 + .../nxos_acls/tests/common/remove_config.yaml | 9 + .../targets/nxos_acls/tests/common/rendered.yml | 61 + .../targets/nxos_acls/tests/common/replaced.yml | 71 + .../targets/nxos_acls/tests/common/rtt.yml | 95 + .../targets/nxos_banner/defaults/main.yaml | 3 + .../integration/targets/nxos_banner/meta/main.yaml | 3 + .../integration/targets/nxos_banner/tasks/cli.yaml | 28 + .../targets/nxos_banner/tasks/main.yaml | 12 + .../targets/nxos_banner/tasks/nxapi.yaml | 28 + .../targets/nxos_banner/tests/common/sanity.yaml | 78 + .../targets/nxos_bfd_global/defaults/main.yaml | 2 + .../targets/nxos_bfd_global/meta/main.yml | 3 + .../targets/nxos_bfd_global/tasks/cli.yaml | 28 + .../targets/nxos_bfd_global/tasks/main.yaml | 8 + .../targets/nxos_bfd_global/tasks/nxapi.yaml | 28 + .../nxos_bfd_global/tests/common/sanity.yaml | 167 + .../targets/nxos_bfd_interfaces/defaults/main.yaml | 2 + .../targets/nxos_bfd_interfaces/meta/main.yml | 3 + .../targets/nxos_bfd_interfaces/tasks/cli.yaml | 29 + .../targets/nxos_bfd_interfaces/tasks/main.yaml | 8 + .../targets/nxos_bfd_interfaces/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 14 + .../tests/common/_remove_config.yaml | 8 + .../nxos_bfd_interfaces/tests/common/deleted.yaml | 75 + .../tests/common/empty_config.yaml | 62 + .../nxos_bfd_interfaces/tests/common/gathered.yaml | 26 + .../nxos_bfd_interfaces/tests/common/merged.yaml | 73 + .../tests/common/overridden.yaml | 79 + .../nxos_bfd_interfaces/tests/common/parsed.yaml | 34 + .../nxos_bfd_interfaces/tests/common/rendered.yaml | 41 + .../nxos_bfd_interfaces/tests/common/replaced.yaml | 70 + .../targets/nxos_bfd_interfaces/vars/main.yml | 32 + .../targets/nxos_bgp/defaults/main.yaml | 5 + .../integration/targets/nxos_bgp/meta/main.yml | 3 + .../integration/targets/nxos_bgp/tasks/cli.yaml | 28 + .../integration/targets/nxos_bgp/tasks/main.yaml | 8 + .../integration/targets/nxos_bgp/tasks/nxapi.yaml | 28 + .../targets/nxos_bgp/tests/common/dis_policy.yaml | 80 + .../targets/nxos_bgp/tests/common/hels.yaml | 96 + .../targets/nxos_bgp/tests/common/isolate.yaml | 76 + .../targets/nxos_bgp/tests/common/param.yaml | 258 + .../targets/nxos_bgp/tests/common/sanity.yaml | 133 + .../targets/nxos_bgp/tests/common/supp_fib.yaml | 112 + .../targets/nxos_bgp_af/defaults/main.yaml | 5 + .../integration/targets/nxos_bgp_af/meta/main.yml | 3 + .../integration/targets/nxos_bgp_af/tasks/cli.yaml | 28 + .../targets/nxos_bgp_af/tasks/main.yaml | 8 + .../targets/nxos_bgp_af/tasks/nxapi.yaml | 28 + .../nxos_bgp_af/tests/common/multisite.yaml | 131 + .../targets/nxos_bgp_af/tests/common/sanity.yaml | 336 + .../targets/nxos_bgp_global/defaults/main.yaml | 2 + .../targets/nxos_bgp_global/meta/main.yml | 0 .../targets/nxos_bgp_global/tasks/cli.yaml | 28 + .../targets/nxos_bgp_global/tasks/main.yaml | 32 + .../targets/nxos_bgp_global/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 63 + .../tests/common/_remove_config.yaml | 7 + .../nxos_bgp_global/tests/common/deleted.yaml | 45 + .../nxos_bgp_global/tests/common/deleted_af.yaml | 115 + .../nxos_bgp_global/tests/common/empty_config.yaml | 50 + .../tests/common/fixtures/parsed.cfg | 36 + .../nxos_bgp_global/tests/common/gathered.yaml | 20 + .../nxos_bgp_global/tests/common/merged.yaml | 95 + .../nxos_bgp_global/tests/common/parsed.yaml | 14 + .../nxos_bgp_global/tests/common/purged.yaml | 42 + .../nxos_bgp_global/tests/common/rendered.yaml | 80 + .../nxos_bgp_global/tests/common/replaced.yaml | 81 + .../nxos_bgp_global/tests/common/replaced_af.yaml | 158 + .../targets/nxos_bgp_global/vars/main.yml | 168 + .../targets/nxos_bgp_neighbor/defaults/main.yaml | 5 + .../targets/nxos_bgp_neighbor/meta/main.yml | 3 + .../targets/nxos_bgp_neighbor/tasks/cli.yaml | 28 + .../targets/nxos_bgp_neighbor/tasks/main.yaml | 8 + .../targets/nxos_bgp_neighbor/tasks/nxapi.yaml | 28 + .../nxos_bgp_neighbor/tests/common/multisite.yaml | 119 + .../nxos_bgp_neighbor/tests/common/sanity.yaml | 350 + .../nxos_bgp_neighbor_af/defaults/main.yaml | 2 + .../targets/nxos_bgp_neighbor_af/meta/main.yml | 3 + .../targets/nxos_bgp_neighbor_af/tasks/cli.yaml | 28 + .../targets/nxos_bgp_neighbor_af/tasks/main.yaml | 8 + .../targets/nxos_bgp_neighbor_af/tasks/nxapi.yaml | 28 + .../tests/common/multisite.yaml | 116 + .../nxos_bgp_neighbor_af/tests/common/sanity.yaml | 295 + .../targets/nxos_command/defaults/main.yaml | 3 + .../integration/targets/nxos_command/meta/main.yml | 3 + .../targets/nxos_command/tasks/cli.yaml | 28 + .../targets/nxos_command/tasks/main.yaml | 8 + .../targets/nxos_command/tasks/nxapi.yaml | 28 + .../nxos_command/tests/cli/cli_command.yaml | 26 + .../targets/nxos_command/tests/cli/contains.yaml | 18 + .../targets/nxos_command/tests/cli/sanity.yaml | 67 + .../nxos_command/tests/common/bad_operator.yaml | 20 + .../targets/nxos_command/tests/common/equal.yaml | 30 + .../nxos_command/tests/common/greaterthan.yaml | 31 + .../tests/common/greaterthanorequal.yaml | 32 + .../targets/nxos_command/tests/common/invalid.yaml | 27 + .../nxos_command/tests/common/lessthan.yaml | 30 + .../nxos_command/tests/common/lessthanorequal.yaml | 32 + .../tests/common/not_comparison_operator.yaml | 20 + .../nxos_command/tests/common/notequal.yaml | 32 + .../targets/nxos_command/tests/common/output.yaml | 25 + .../targets/nxos_command/tests/common/timeout.yaml | 18 + .../targets/nxos_command/tests/nxapi/contains.yaml | 22 + .../targets/nxos_command/tests/nxapi/sanity.yaml | 67 + .../targets/nxos_config/defaults/main.yaml | 3 + .../integration/targets/nxos_config/meta/main.yml | 3 + .../integration/targets/nxos_config/tasks/cli.yaml | 28 + .../targets/nxos_config/tasks/cli_config.yaml | 16 + .../targets/nxos_config/tasks/main.yaml | 24 + .../targets/nxos_config/tasks/nxapi.yaml | 28 + .../targets/nxos_config/tasks/redirection.yaml | 16 + .../templates/basic/base_running_config | 10 + .../targets/nxos_config/templates/basic/config.j2 | 4 + .../nxos_config/templates/basic/configblock.j2 | 5 + .../nxos_config/templates/basic/configexact1.j2 | 5 + .../nxos_config/templates/basic/configexact2.j2 | 6 + .../nxos_config/templates/basic/configstrict1.j2 | 6 + .../templates/basic/intended_running_config | 10 + .../nxos_config/templates/basic/setupexact.j2 | 7 + .../nxos_config/templates/basic/setupstrict.j2 | 7 + .../targets/nxos_config/templates/config.js | 4 + .../nxos_config/templates/defaults/config.j2 | 4 + .../targets/nxos_config/templates/defaults/test.j2 | 4 + .../targets/nxos_config/tests/cli/diff.yaml | 36 + .../targets/nxos_config/tests/cli/multilevel.yaml | 52 + .../targets/nxos_config/tests/cli/sublevel.yaml | 36 + .../nxos_config/tests/cli/sublevel_exact.yaml | 58 + .../nxos_config/tests/cli/sublevel_strict.yaml | 59 + .../nxos_config/tests/cli/toplevel_after.yaml | 40 + .../nxos_config/tests/cli/toplevel_before.yaml | 40 + .../nxos_config/tests/cli_config/cli_backup.yaml | 114 + .../nxos_config/tests/cli_config/cli_basic.yaml | 44 + .../tests/cli_config/cli_block_replace.yaml | 32 + .../tests/cli_config/cli_exact_match.yaml | 35 + .../tests/cli_config/cli_strict_match.yaml | 27 + .../targets/nxos_config/tests/common/backup.yaml | 125 + .../targets/nxos_config/tests/common/defaults.yaml | 49 + .../targets/nxos_config/tests/common/sanity.yaml | 71 + .../targets/nxos_config/tests/common/save.yaml | 33 + .../nxos_config/tests/common/src_basic.yaml | 36 + .../nxos_config/tests/common/src_invalid.yaml | 16 + .../nxos_config/tests/common/src_match_none.yaml | 48 + .../nxos_config/tests/common/sublevel_block.yaml | 50 + .../targets/nxos_config/tests/common/toplevel.yaml | 33 + .../tests/common/toplevel_nonidempotent.yaml | 37 + .../nxos_config/tests/nxapi/multilevel.yaml | 41 + .../targets/nxos_config/tests/nxapi/sublevel.yaml | 37 + .../nxos_config/tests/nxapi/sublevel_exact.yaml | 59 + .../nxos_config/tests/nxapi/sublevel_strict.yaml | 58 + .../nxos_config/tests/nxapi/toplevel_after.yaml | 40 + .../nxos_config/tests/nxapi/toplevel_before.yaml | 40 + .../tests/redirection/cli/shortname.yaml | 37 + .../targets/nxos_devicealias/defaults/main.yaml | 2 + .../targets/nxos_devicealias/meta/main.yml | 2 + .../targets/nxos_devicealias/tasks/cli.yaml | 28 + .../targets/nxos_devicealias/tasks/main.yaml | 18 + .../nxos_devicealias/tests/common/sanity.yaml | 57 + .../targets/nxos_evpn_global/defaults/main.yaml | 2 + .../targets/nxos_evpn_global/meta/main.yml | 3 + .../targets/nxos_evpn_global/tasks/cli.yaml | 28 + .../targets/nxos_evpn_global/tasks/main.yaml | 8 + .../targets/nxos_evpn_global/tasks/nxapi.yaml | 28 + .../nxos_evpn_global/tests/common/sanity.yaml | 70 + .../targets/nxos_evpn_vni/defaults/main.yaml | 2 + .../targets/nxos_evpn_vni/meta/main.yml | 3 + .../targets/nxos_evpn_vni/tasks/cli.yaml | 28 + .../targets/nxos_evpn_vni/tasks/main.yaml | 8 + .../targets/nxos_evpn_vni/tasks/nxapi.yaml | 28 + .../targets/nxos_evpn_vni/tests/common/sanity.yaml | 112 + .../targets/nxos_facts/defaults/main.yaml | 2 + .../integration/targets/nxos_facts/meta/main.yml | 3 + .../integration/targets/nxos_facts/tasks/cli.yaml | 28 + .../integration/targets/nxos_facts/tasks/main.yaml | 8 + .../targets/nxos_facts/tasks/nxapi.yaml | 28 + .../targets/nxos_facts/tests/common/all_facts.yaml | 24 + .../nxos_facts/tests/common/default_facts.yaml | 22 + .../nxos_facts/tests/common/invalid_subset.yaml | 17 + .../nxos_facts/tests/common/not_hardware.yaml | 19 + .../targets/nxos_facts/tests/common/sanity.yaml | 61 + .../targets/nxos_feature/defaults/main.yaml | 2 + .../integration/targets/nxos_feature/meta/main.yml | 3 + .../targets/nxos_feature/tasks/cli.yaml | 28 + .../targets/nxos_feature/tasks/main.yaml | 8 + .../targets/nxos_feature/tasks/nxapi.yaml | 28 + .../nxos_feature/tests/common/configure.yaml | 96 + .../targets/nxos_feature/tests/common/invalid.yaml | 14 + .../targets/nxos_file_copy/defaults/main.yaml | 2 + .../targets/nxos_file_copy/fixtures/data.cfg | 1 + .../targets/nxos_file_copy/meta/main.yml | 3 + .../targets/nxos_file_copy/tasks/cli.yaml | 27 + .../targets/nxos_file_copy/tasks/main.yaml | 34 + .../targets/nxos_file_copy/tasks/nxapi.yaml | 27 + .../nxos_file_copy/tests/cli/input_validation.yaml | 86 + .../targets/nxos_file_copy/tests/cli/negative.yaml | 130 + .../targets/nxos_file_copy/tests/cli/sanity.yaml | 202 + .../nxos_file_copy/tests/nxapi/badtransport.yaml | 16 + .../targets/nxos_gir/defaults/main.yaml | 2 + .../integration/targets/nxos_gir/meta/main.yml | 3 + .../integration/targets/nxos_gir/tasks/cli.yaml | 28 + .../integration/targets/nxos_gir/tasks/main.yaml | 8 + .../integration/targets/nxos_gir/tasks/nxapi.yaml | 28 + .../targets/nxos_gir/tests/common/sanity.yaml | 110 + .../nxos_gir_profile_management/defaults/main.yaml | 2 + .../nxos_gir_profile_management/meta/main.yml | 3 + .../nxos_gir_profile_management/tasks/cli.yaml | 28 + .../nxos_gir_profile_management/tasks/main.yaml | 8 + .../nxos_gir_profile_management/tasks/nxapi.yaml | 28 + .../tests/common/sanity.yaml | 105 + .../targets/nxos_hsrp/defaults/main.yaml | 2 + .../integration/targets/nxos_hsrp/meta/main.yml | 3 + .../integration/targets/nxos_hsrp/tasks/cli.yaml | 28 + .../integration/targets/nxos_hsrp/tasks/main.yaml | 11 + .../integration/targets/nxos_hsrp/tasks/nxapi.yaml | 28 + .../targets/nxos_hsrp/tests/common/sanity.yaml | 153 + .../nxos_hsrp_interfaces/defaults/main.yaml | 2 + .../targets/nxos_hsrp_interfaces/meta/main.yml | 3 + .../targets/nxos_hsrp_interfaces/tasks/cli.yaml | 29 + .../targets/nxos_hsrp_interfaces/tasks/main.yaml | 8 + .../targets/nxos_hsrp_interfaces/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 15 + .../tests/common/_remove_config.yaml | 8 + .../nxos_hsrp_interfaces/tests/common/deleted.yaml | 57 + .../tests/common/empty_config.yaml | 62 + .../tests/common/gathered.yaml | 26 + .../nxos_hsrp_interfaces/tests/common/merged.yaml | 65 + .../tests/common/overridden.yaml | 59 + .../nxos_hsrp_interfaces/tests/common/parsed.yaml | 26 + .../tests/common/rendered.yaml | 39 + .../tests/common/replaced.yaml | 58 + .../targets/nxos_hsrp_interfaces/vars/main.yml | 17 + .../targets/nxos_igmp/defaults/main.yaml | 2 + .../integration/targets/nxos_igmp/meta/main.yml | 3 + .../integration/targets/nxos_igmp/tasks/cli.yaml | 28 + .../integration/targets/nxos_igmp/tasks/main.yaml | 8 + .../integration/targets/nxos_igmp/tasks/nxapi.yaml | 28 + .../targets/nxos_igmp/tests/common/sanity.yaml | 68 + .../targets/nxos_igmp_interface/defaults/main.yaml | 2 + .../targets/nxos_igmp_interface/meta/main.yml | 3 + .../targets/nxos_igmp_interface/tasks/cli.yaml | 28 + .../targets/nxos_igmp_interface/tasks/main.yaml | 8 + .../targets/nxos_igmp_interface/tasks/nxapi.yaml | 28 + .../nxos_igmp_interface/tests/common/sanity.yaml | 185 + .../targets/nxos_igmp_snooping/defaults/main.yaml | 2 + .../targets/nxos_igmp_snooping/meta/main.yml | 3 + .../targets/nxos_igmp_snooping/tasks/cli.yaml | 28 + .../targets/nxos_igmp_snooping/tasks/main.yaml | 8 + .../targets/nxos_igmp_snooping/tasks/nxapi.yaml | 28 + .../nxos_igmp_snooping/tests/common/sanity.yaml | 120 + .../targets/nxos_install_os/defaults/main.yaml | 3 + .../targets/nxos_install_os/meta/main.yml | 2 + .../targets/nxos_install_os/tasks/httpapi.yaml | 17 + .../targets/nxos_install_os/tasks/main.yaml | 6 + .../targets/nxos_install_os/tasks/network_cli.yaml | 17 + .../tasks/upgrade/clear_persistent_sockets.yaml | 15 + .../tasks/upgrade/copy_kick_system_images.yaml | 42 + .../tasks/upgrade/delete_files.yaml | 10 + .../tasks/upgrade/enable_scp_server.yaml | 5 + .../nxos_install_os/tasks/upgrade/install_os.yaml | 24 + .../tasks/upgrade/install_system.yaml | 53 + .../tasks/upgrade/install_with_kick.yaml | 45 + .../tasks/upgrade/main_os_install.yaml | 6 + .../nxos_install_os/tests/common/upgrade.yaml | 48 + .../tests/common/upgrade_n3172_greensboro.yaml | 25 + .../tests/common/upgrade_n3172_u61a.yaml | 27 + .../tests/common/upgrade_n3172_u62a.yaml | 27 + .../tests/common/upgrade_n3172_u63a.yaml | 27 + .../tests/common/upgrade_n35_62a88.yaml | 27 + .../tests/common/upgrade_n35_greensboro.yaml | 25 + .../tests/common/upgrade_n5k_730_N11.yaml | 26 + .../tests/common/upgrade_n5k_733_N11.yaml | 26 + .../tests/common/upgrade_n7k_atherton.yaml | 26 + .../tests/common/upgrade_n7k_helsinki.yaml | 26 + .../tests/common/upgrade_n9k_greensboro.yaml | 34 + .../tests/common/upgrade_n9k_greensboro_force.yaml | 34 + .../tests/common/upgrade_n9k_hamilton.yaml | 32 + .../targets/nxos_interface/defaults/main.yaml | 2 + .../targets/nxos_interface/meta/main.yml | 3 + .../targets/nxos_interface/tasks/cli.yaml | 28 + .../targets/nxos_interface/tasks/main.yaml | 8 + .../targets/nxos_interface/tasks/nxapi.yaml | 28 + .../nxos_interface/tests/common/intent.yaml | 69 + .../nxos_interface/tests/common/sanity.yaml | 135 + .../tests/common/set_state_absent.yaml | 29 + .../tests/common/set_state_present.yaml | 32 + .../nxos_interface/tests/common/sub_int.yaml | 75 + .../targets/nxos_interface_ospf/defaults/main.yaml | 2 + .../targets/nxos_interface_ospf/meta/main.yml | 3 + .../targets/nxos_interface_ospf/tasks/cli.yaml | 28 + .../targets/nxos_interface_ospf/tasks/main.yaml | 11 + .../targets/nxos_interface_ospf/tasks/nxapi.yaml | 28 + .../nxos_interface_ospf/tests/common/sanity.yaml | 295 + .../targets/nxos_interfaces/defaults/main.yaml | 2 + .../targets/nxos_interfaces/meta/main.yml | 3 + .../targets/nxos_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_interfaces/tasks/main.yaml | 13 + .../targets/nxos_interfaces/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 15 + .../tests/common/_remove_config.yaml | 9 + .../nxos_interfaces/tests/common/deleted.yaml | 66 + .../nxos_interfaces/tests/common/empty_config.yaml | 62 + .../nxos_interfaces/tests/common/gathered.yaml | 24 + .../nxos_interfaces/tests/common/merged.yaml | 89 + .../nxos_interfaces/tests/common/overridden.yaml | 71 + .../nxos_interfaces/tests/common/parsed.yaml | 31 + .../nxos_interfaces/tests/common/rendered.yaml | 46 + .../nxos_interfaces/tests/common/replaced.yaml | 100 + .../targets/nxos_interfaces/tests/common/rtt.yaml | 77 + .../targets/nxos_interfaces/vars/main.yml | 31 + .../targets/nxos_l2_interface/defaults/main.yaml | 2 + .../targets/nxos_l2_interface/meta/main.yml | 3 + .../targets/nxos_l2_interface/tasks/cli.yaml | 28 + .../targets/nxos_l2_interface/tasks/main.yaml | 8 + .../targets/nxos_l2_interface/tasks/nxapi.yaml | 28 + .../nxos_l2_interface/tests/common/agg.yaml | 122 + .../nxos_l2_interface/tests/common/sanity.yaml | 156 + .../targets/nxos_l2_interfaces/defaults/main.yaml | 2 + .../targets/nxos_l2_interfaces/meta/main.yml | 3 + .../targets/nxos_l2_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_l2_interfaces/tasks/main.yaml | 7 + .../targets/nxos_l2_interfaces/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 18 + .../tests/common/_remove_config.yaml | 8 + .../nxos_l2_interfaces/tests/common/deleted.yaml | 69 + .../tests/common/empty_config.yaml | 62 + .../nxos_l2_interfaces/tests/common/gathered.yaml | 26 + .../nxos_l2_interfaces/tests/common/merged.yaml | 103 + .../tests/common/overridden.yaml | 79 + .../nxos_l2_interfaces/tests/common/parsed.yaml | 35 + .../nxos_l2_interfaces/tests/common/rendered.yaml | 52 + .../nxos_l2_interfaces/tests/common/replaced.yaml | 83 + .../nxos_l2_interfaces/tests/common/rtt.yaml | 74 + .../targets/nxos_l2_interfaces/vars/main.yml | 40 + .../targets/nxos_l3_interface/defaults/main.yaml | 2 + .../targets/nxos_l3_interface/meta/main.yml | 3 + .../targets/nxos_l3_interface/tasks/cli.yaml | 28 + .../targets/nxos_l3_interface/tasks/main.yaml | 8 + .../targets/nxos_l3_interface/tasks/nxapi.yaml | 28 + .../nxos_l3_interface/tests/cli/sanity.yaml | 125 + .../nxos_l3_interface/tests/nxapi/sanity.yaml | 121 + .../targets/nxos_l3_interfaces/defaults/main.yaml | 2 + .../targets/nxos_l3_interfaces/meta/main.yml | 3 + .../targets/nxos_l3_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_l3_interfaces/tasks/main.yaml | 11 + .../targets/nxos_l3_interfaces/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 17 + .../tests/common/_remove_config.yaml | 7 + .../nxos_l3_interfaces/tests/common/deleted.yaml | 70 + .../tests/common/empty_config.yaml | 62 + .../nxos_l3_interfaces/tests/common/gathered.yaml | 24 + .../nxos_l3_interfaces/tests/common/merged.yaml | 73 + .../nxos_l3_interfaces/tests/common/multisite.yaml | 379 + .../tests/common/overridden.yaml | 91 + .../nxos_l3_interfaces/tests/common/parsed.yaml | 30 + .../nxos_l3_interfaces/tests/common/rendered.yaml | 50 + .../nxos_l3_interfaces/tests/common/replaced.yaml | 119 + .../nxos_l3_interfaces/tests/common/rtt.yaml | 89 + .../targets/nxos_l3_interfaces/vars/main.yml | 65 + .../targets/nxos_lacp/defaults/main.yaml | 2 + .../integration/targets/nxos_lacp/meta/main.yml | 3 + .../integration/targets/nxos_lacp/tasks/cli.yaml | 28 + .../integration/targets/nxos_lacp/tasks/main.yaml | 7 + .../integration/targets/nxos_lacp/tasks/nxapi.yaml | 28 + .../nxos_lacp/tests/common/_populate_config.yaml | 5 + .../nxos_lacp/tests/common/_remove_config.yaml | 5 + .../targets/nxos_lacp/tests/common/deleted.yaml | 72 + .../nxos_lacp/tests/common/empty_config.yaml | 51 + .../targets/nxos_lacp/tests/common/gathered.yaml | 32 + .../targets/nxos_lacp/tests/common/merged.yaml | 67 + .../targets/nxos_lacp/tests/common/parsed.yaml | 18 + .../targets/nxos_lacp/tests/common/rendered.yaml | 37 + .../targets/nxos_lacp/tests/common/replaced.yaml | 101 + .../integration/targets/nxos_lacp/vars/main.yml | 18 + .../nxos_lacp_interfaces/defaults/main.yaml | 2 + .../targets/nxos_lacp_interfaces/meta/main.yml | 3 + .../targets/nxos_lacp_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_lacp_interfaces/tasks/main.yaml | 7 + .../targets/nxos_lacp_interfaces/tasks/nxapi.yaml | 27 + .../tests/common/_populate_config.yaml | 13 + .../tests/common/_remove_config.yaml | 10 + .../nxos_lacp_interfaces/tests/common/deleted.yaml | 76 + .../tests/common/empty_config.yaml | 62 + .../tests/common/gathered.yaml | 24 + .../nxos_lacp_interfaces/tests/common/merged.yaml | 84 + .../tests/common/overridden.yaml | 90 + .../nxos_lacp_interfaces/tests/common/parsed.yaml | 27 + .../tests/common/rendered.yaml | 43 + .../tests/common/replaced.yaml | 78 + .../targets/nxos_lacp_interfaces/vars/main.yml | 30 + .../targets/nxos_lag_interfaces/defaults/main.yaml | 2 + .../targets/nxos_lag_interfaces/meta/main.yml | 3 + .../targets/nxos_lag_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_lag_interfaces/tasks/main.yaml | 7 + .../targets/nxos_lag_interfaces/tasks/nxapi.yaml | 27 + .../tests/common/_populate_config.yaml | 8 + .../tests/common/_remove_config.yaml | 10 + .../nxos_lag_interfaces/tests/common/deleted.yaml | 67 + .../tests/common/empty_config.yaml | 62 + .../nxos_lag_interfaces/tests/common/gathered.yaml | 26 + .../nxos_lag_interfaces/tests/common/merged.yaml | 108 + .../tests/common/overridden.yaml | 85 + .../nxos_lag_interfaces/tests/common/parsed.yaml | 32 + .../nxos_lag_interfaces/tests/common/rendered.yaml | 43 + .../nxos_lag_interfaces/tests/common/replaced.yaml | 86 + .../targets/nxos_lag_interfaces/vars/main.yml | 33 + .../targets/nxos_linkagg/defaults/main.yaml | 3 + .../integration/targets/nxos_linkagg/meta/main.yml | 3 + .../targets/nxos_linkagg/tasks/cli.yaml | 28 + .../targets/nxos_linkagg/tasks/main.yaml | 8 + .../targets/nxos_linkagg/tasks/nxapi.yaml | 28 + .../targets/nxos_linkagg/tests/common/sanity.yaml | 201 + .../targets/nxos_lldp/defaults/main.yaml | 2 + .../integration/targets/nxos_lldp/meta/main.yml | 3 + .../integration/targets/nxos_lldp/tasks/cli.yaml | 28 + .../integration/targets/nxos_lldp/tasks/main.yaml | 8 + .../integration/targets/nxos_lldp/tasks/nxapi.yaml | 28 + .../targets/nxos_lldp/tests/cli/sanity.yaml | 47 + .../targets/nxos_lldp/tests/nxapi/sanity.yaml | 47 + .../targets/nxos_lldp_global/defaults/main.yaml | 2 + .../targets/nxos_lldp_global/meta/main.yml | 3 + .../targets/nxos_lldp_global/tasks/cli.yaml | 28 + .../targets/nxos_lldp_global/tasks/main.yaml | 8 + .../targets/nxos_lldp_global/tasks/nxapi.yaml | 27 + .../tests/common/_populate_config.yml | 8 + .../tests/common/_remove_config.yml | 5 + .../nxos_lldp_global/tests/common/deleted.yml | 84 + .../nxos_lldp_global/tests/common/gathered.yml | 24 + .../nxos_lldp_global/tests/common/merged.yml | 72 + .../nxos_lldp_global/tests/common/parsed.yml | 20 + .../nxos_lldp_global/tests/common/rendered.yml | 38 + .../nxos_lldp_global/tests/common/replaced.yml | 93 + .../targets/nxos_lldp_global/vars/main.yml | 22 + .../nxos_lldp_interfaces/defaults/main.yaml | 2 + .../targets/nxos_lldp_interfaces/meta/main.yml | 3 + .../targets/nxos_lldp_interfaces/tasks/cli.yaml | 27 + .../targets/nxos_lldp_interfaces/tasks/main.yaml | 7 + .../targets/nxos_lldp_interfaces/tasks/nxapi.yaml | 27 + .../nxos_lldp_interfaces/tests/common/deleted.yml | 76 + .../nxos_lldp_interfaces/tests/common/gathered.yml | 53 + .../nxos_lldp_interfaces/tests/common/merged.yml | 62 + .../tests/common/overridden.yml | 69 + .../nxos_lldp_interfaces/tests/common/parsed.yml | 42 + .../tests/common/remove_config.yaml | 7 + .../nxos_lldp_interfaces/tests/common/rendered.yml | 44 + .../nxos_lldp_interfaces/tests/common/replaced.yml | 64 + .../nxos_lldp_interfaces/tests/common/rtt.yml | 75 + .../targets/nxos_lldp_interfaces/vars/main.yml | 12 + .../targets/nxos_logging/defaults/main.yaml | 2 + .../targets/nxos_logging/meta/main.yaml | 3 + .../targets/nxos_logging/tasks/cli.yaml | 28 + .../targets/nxos_logging/tasks/main.yaml | 18 + .../targets/nxos_logging/tasks/nxapi.yaml | 28 + .../targets/nxos_logging/tests/common/basic.yaml | 519 + .../nxos_logging/tests/common/net_logging.yaml | 30 + .../targets/nxos_logging/tests/common/purge.yaml | 112 + .../targets/nxos_ntp/defaults/main.yaml | 2 + .../integration/targets/nxos_ntp/meta/main.yml | 3 + .../integration/targets/nxos_ntp/tasks/cli.yaml | 28 + .../integration/targets/nxos_ntp/tasks/main.yaml | 11 + .../integration/targets/nxos_ntp/tasks/nxapi.yaml | 28 + .../targets/nxos_ntp/tests/common/sanity.yaml | 114 + .../targets/nxos_ntp_auth/defaults/main.yaml | 2 + .../targets/nxos_ntp_auth/meta/main.yml | 3 + .../targets/nxos_ntp_auth/tasks/cli.yaml | 28 + .../targets/nxos_ntp_auth/tasks/main.yaml | 8 + .../targets/nxos_ntp_auth/tasks/nxapi.yaml | 28 + .../targets/nxos_ntp_auth/tests/common/sanity.yaml | 133 + .../targets/nxos_ntp_options/defaults/main.yaml | 2 + .../targets/nxos_ntp_options/meta/main.yml | 3 + .../targets/nxos_ntp_options/tasks/cli.yaml | 28 + .../targets/nxos_ntp_options/tasks/main.yaml | 8 + .../targets/nxos_ntp_options/tasks/nxapi.yaml | 28 + .../nxos_ntp_options/tests/common/sanity.yaml | 101 + .../targets/nxos_nxapi/defaults/main.yaml | 2 + .../integration/targets/nxos_nxapi/meta/main.yml | 3 + .../integration/targets/nxos_nxapi/tasks/cli.yaml | 28 + .../integration/targets/nxos_nxapi/tasks/main.yaml | 8 + .../targets/nxos_nxapi/tasks/nxapi.yaml | 35 + .../platform/default/assert_changes_http.yaml | 17 + .../platform/default/assert_changes_https.yaml | 17 + .../default/assert_changes_https_http.yaml | 23 + .../default/assert_changes_https_http_ports.yaml | 23 + .../tasks/platform/n5k/assert_changes_http.yaml | 6 + .../tasks/platform/n5k/assert_changes_https.yaml | 6 + .../platform/n5k/assert_changes_https_http.yaml | 8 + .../n5k/assert_changes_https_http_ports.yaml | 8 + .../tasks/platform/n7k/assert_changes_http.yaml | 7 + .../tasks/platform/n7k/assert_changes_https.yaml | 7 + .../platform/n7k/assert_changes_https_http.yaml | 9 + .../n7k/assert_changes_https_http_ports.yaml | 9 + .../targets/nxos_nxapi/tests/cli/configure.yaml | 142 + .../targets/nxos_nxapi/tests/cli/disable.yaml | 28 + .../targets/nxos_nxapi/tests/cli/enable.yaml | 32 + .../targets/nxos_nxapi/tests/cli/nxapi_ssl.yaml | 248 + .../nxos_nxapi/tests/nxapi/badtransport.yaml | 17 + .../targets/nxos_ospf/defaults/main.yaml | 2 + .../integration/targets/nxos_ospf/meta/main.yml | 3 + .../integration/targets/nxos_ospf/tasks/cli.yaml | 28 + .../integration/targets/nxos_ospf/tasks/main.yaml | 11 + .../integration/targets/nxos_ospf/tasks/nxapi.yaml | 28 + .../targets/nxos_ospf/tests/common/sanity.yaml | 52 + .../nxos_ospf_interfaces/defaults/main.yaml | 2 + .../targets/nxos_ospf_interfaces/meta/main.yml | 0 .../targets/nxos_ospf_interfaces/tasks/cli.yaml | 28 + .../targets/nxos_ospf_interfaces/tasks/main.yaml | 27 + .../targets/nxos_ospf_interfaces/tasks/nxapi.yaml | 28 + .../tests/common/_populate_config.yaml | 20 + .../tests/common/_remove_config.yaml | 9 + .../nxos_ospf_interfaces/tests/common/_setup.yaml | 11 + .../nxos_ospf_interfaces/tests/common/deleted.yaml | 101 + .../tests/common/empty_config.yaml | 62 + .../tests/common/fixtures/parsed.cfg | 16 + .../tests/common/gathered.yaml | 25 + .../nxos_ospf_interfaces/tests/common/merged.yaml | 89 + .../tests/common/overridden.yaml | 59 + .../nxos_ospf_interfaces/tests/common/parsed.yaml | 14 + .../tests/common/rendered.yaml | 58 + .../tests/common/replaced.yaml | 61 + .../targets/nxos_ospf_interfaces/vars/main.yml | 153 + .../targets/nxos_ospf_vrf/defaults/main.yaml | 2 + .../targets/nxos_ospf_vrf/meta/main.yml | 3 + .../targets/nxos_ospf_vrf/tasks/cli.yaml | 28 + .../targets/nxos_ospf_vrf/tasks/main.yaml | 11 + .../targets/nxos_ospf_vrf/tasks/nxapi.yaml | 28 + .../targets/nxos_ospf_vrf/tests/common/sanity.yaml | 139 + .../targets/nxos_ospfv2/defaults/main.yaml | 2 + .../integration/targets/nxos_ospfv2/meta/main.yml | 0 .../integration/targets/nxos_ospfv2/tasks/cli.yaml | 28 + .../targets/nxos_ospfv2/tasks/main.yaml | 24 + .../targets/nxos_ospfv2/tasks/nxapi.yaml | 28 + .../nxos_ospfv2/tests/common/_populate_config.yaml | 26 + .../nxos_ospfv2/tests/common/_remove_config.yaml | 9 + .../targets/nxos_ospfv2/tests/common/deleted.yaml | 93 + .../nxos_ospfv2/tests/common/fixtures/parsed.cfg | 21 + .../targets/nxos_ospfv2/tests/common/gathered.yaml | 21 + .../targets/nxos_ospfv2/tests/common/merged.yaml | 92 + .../nxos_ospfv2/tests/common/overridden.yaml | 57 + .../targets/nxos_ospfv2/tests/common/parsed.yaml | 14 + .../targets/nxos_ospfv2/tests/common/rendered.yaml | 66 + .../targets/nxos_ospfv2/tests/common/replaced.yaml | 83 + .../integration/targets/nxos_ospfv2/vars/main.yml | 158 + .../targets/nxos_ospfv3/defaults/main.yaml | 2 + .../integration/targets/nxos_ospfv3/meta/main.yml | 0 .../integration/targets/nxos_ospfv3/tasks/cli.yaml | 28 + .../targets/nxos_ospfv3/tasks/main.yaml | 24 + .../targets/nxos_ospfv3/tasks/nxapi.yaml | 28 + .../nxos_ospfv3/tests/common/_populate_config.yaml | 23 + .../nxos_ospfv3/tests/common/_remove_config.yaml | 9 + .../targets/nxos_ospfv3/tests/common/deleted.yaml | 93 + .../nxos_ospfv3/tests/common/empty_config.yaml | 62 + .../nxos_ospfv3/tests/common/fixtures/parsed.cfg | 18 + .../targets/nxos_ospfv3/tests/common/gathered.yaml | 21 + .../targets/nxos_ospfv3/tests/common/merged.yaml | 85 + .../nxos_ospfv3/tests/common/overridden.yaml | 57 + .../targets/nxos_ospfv3/tests/common/parsed.yaml | 14 + .../targets/nxos_ospfv3/tests/common/rendered.yaml | 60 + .../targets/nxos_ospfv3/tests/common/replaced.yaml | 79 + .../integration/targets/nxos_ospfv3/vars/main.yml | 142 + .../targets/nxos_overlay_global/defaults/main.yaml | 2 + .../targets/nxos_overlay_global/meta/main.yml | 3 + .../targets/nxos_overlay_global/tasks/cli.yaml | 28 + .../targets/nxos_overlay_global/tasks/main.yaml | 11 + .../targets/nxos_overlay_global/tasks/nxapi.yaml | 28 + .../tasks/platform/n7k/cleanup.yaml | 24 + .../tasks/platform/n7k/setup.yaml | 39 + .../nxos_overlay_global/tests/common/sanity.yaml | 97 + .../targets/nxos_pim/defaults/main.yaml | 2 + .../integration/targets/nxos_pim/meta/main.yml | 3 + .../integration/targets/nxos_pim/tasks/cli.yaml | 28 + .../integration/targets/nxos_pim/tasks/main.yaml | 11 + .../integration/targets/nxos_pim/tasks/nxapi.yaml | 28 + .../targets/nxos_pim/tests/common/sanity.yaml | 85 + .../targets/nxos_pim_interface/defaults/main.yaml | 2 + .../targets/nxos_pim_interface/meta/main.yml | 3 + .../targets/nxos_pim_interface/tasks/cli.yaml | 28 + .../targets/nxos_pim_interface/tasks/main.yaml | 11 + .../targets/nxos_pim_interface/tasks/nxapi.yaml | 28 + .../nxos_pim_interface/tests/common/sanity.yaml | 197 + .../targets/nxos_pim_rp_address/defaults/main.yaml | 2 + .../targets/nxos_pim_rp_address/meta/main.yml | 3 + .../targets/nxos_pim_rp_address/tasks/cli.yaml | 28 + .../targets/nxos_pim_rp_address/tasks/main.yaml | 8 + .../targets/nxos_pim_rp_address/tasks/nxapi.yaml | 28 + .../tests/common/configure.yaml | 220 + .../targets/nxos_reboot/defaults/main.yaml | 2 + .../integration/targets/nxos_reboot/meta/main.yml | 3 + .../integration/targets/nxos_reboot/tasks/cli.yaml | 28 + .../targets/nxos_reboot/tasks/main.yaml | 6 + .../targets/nxos_reboot/tasks/nxapi.yaml | 29 + .../targets/nxos_reboot/tests/common/sanity.yaml | 24 + .../targets/nxos_rollback/defaults/main.yaml | 2 + .../targets/nxos_rollback/meta/main.yml | 3 + .../targets/nxos_rollback/tasks/cli.yaml | 28 + .../targets/nxos_rollback/tasks/main.yaml | 8 + .../targets/nxos_rollback/tasks/nxapi.yaml | 28 + .../targets/nxos_rollback/tests/common/sanity.yaml | 24 + .../targets/nxos_rpm/defaults/main.yaml | 2 + .../integration/targets/nxos_rpm/meta/main.yml | 3 + .../integration/targets/nxos_rpm/tasks/cli.yaml | 28 + .../integration/targets/nxos_rpm/tasks/main.yaml | 8 + .../integration/targets/nxos_rpm/tasks/nxapi.yaml | 28 + .../targets/nxos_rpm/tests/common/sanity.yaml | 155 + .../targets/nxos_smoke/defaults/main.yaml | 3 + .../integration/targets/nxos_smoke/meta/main.yml | 2 + .../integration/targets/nxos_smoke/tasks/cli.yaml | 33 + .../integration/targets/nxos_smoke/tasks/main.yaml | 14 + .../targets/nxos_smoke/tasks/nxapi.yaml | 33 + .../targets/nxos_smoke/tests/cli/misc_tests.yaml | 10 + .../nxos_smoke/tests/common/common_config.yaml | 160 + .../nxos_smoke/tests/common/common_utils.yaml | 102 + .../nxos_smoke/tests/common/misc_tests.yaml | 30 + .../targets/nxos_snapshot/defaults/main.yaml | 2 + .../targets/nxos_snapshot/meta/main.yml | 3 + .../targets/nxos_snapshot/tasks/cli.yaml | 28 + .../targets/nxos_snapshot/tasks/main.yaml | 8 + .../targets/nxos_snapshot/tasks/nxapi.yaml | 28 + .../targets/nxos_snapshot/tests/common/sanity.yaml | 129 + .../targets/nxos_snmp_community/defaults/main.yaml | 2 + .../targets/nxos_snmp_community/meta/main.yml | 3 + .../targets/nxos_snmp_community/tasks/cli.yaml | 28 + .../targets/nxos_snmp_community/tasks/main.yaml | 11 + .../targets/nxos_snmp_community/tasks/nxapi.yaml | 28 + .../nxos_snmp_community/tests/common/sanity.yaml | 163 + .../targets/nxos_snmp_contact/defaults/main.yaml | 2 + .../targets/nxos_snmp_contact/meta/main.yml | 3 + .../targets/nxos_snmp_contact/tasks/cli.yaml | 28 + .../targets/nxos_snmp_contact/tasks/main.yaml | 8 + .../targets/nxos_snmp_contact/tasks/nxapi.yaml | 28 + .../nxos_snmp_contact/tests/common/sanity.yaml | 61 + .../targets/nxos_snmp_host/defaults/main.yaml | 2 + .../targets/nxos_snmp_host/meta/main.yml | 3 + .../targets/nxos_snmp_host/tasks/cli.yaml | 28 + .../targets/nxos_snmp_host/tasks/main.yaml | 11 + .../targets/nxos_snmp_host/tasks/nxapi.yaml | 28 + .../tests/common/sanity_snmp_v1_trap.yaml | 125 + .../tests/common/sanity_snmp_v2_inform.yaml | 125 + .../tests/common/sanity_snmp_v3_inform.yaml | 131 + .../tests/common/sanity_snmp_v3_trap.yaml | 130 + .../targets/nxos_snmp_location/defaults/main.yaml | 2 + .../targets/nxos_snmp_location/meta/main.yml | 3 + .../targets/nxos_snmp_location/tasks/cli.yaml | 28 + .../targets/nxos_snmp_location/tasks/main.yaml | 11 + .../targets/nxos_snmp_location/tasks/nxapi.yaml | 28 + .../nxos_snmp_location/tests/common/sanity.yaml | 62 + .../targets/nxos_snmp_traps/defaults/main.yaml | 2 + .../targets/nxos_snmp_traps/meta/main.yml | 3 + .../targets/nxos_snmp_traps/tasks/cli.yaml | 28 + .../targets/nxos_snmp_traps/tasks/main.yaml | 11 + .../targets/nxos_snmp_traps/tasks/nxapi.yaml | 28 + .../nxos_snmp_traps/tests/common/sanity.yaml | 77 + .../targets/nxos_snmp_user/defaults/main.yaml | 2 + .../targets/nxos_snmp_user/meta/main.yml | 3 + .../targets/nxos_snmp_user/tasks/cli.yaml | 28 + .../targets/nxos_snmp_user/tasks/main.yaml | 11 + .../targets/nxos_snmp_user/tasks/nxapi.yaml | 28 + .../nxos_snmp_user/tests/common/sanity.yaml | 109 + .../targets/nxos_static_route/defaults/main.yaml | 5 + .../targets/nxos_static_route/meta/main.yml | 3 + .../targets/nxos_static_route/tasks/cli.yaml | 28 + .../targets/nxos_static_route/tasks/main.yaml | 11 + .../targets/nxos_static_route/tasks/nxapi.yaml | 28 + .../nxos_static_route/tests/common/sanity.yaml | 211 + .../targets/nxos_static_routes/defaults/main.yaml | 2 + .../targets/nxos_static_routes/meta/main.yml | 2 + .../targets/nxos_static_routes/tasks/cli.yaml | 28 + .../targets/nxos_static_routes/tasks/main.yaml | 2 + .../tests/common/_populate_config.yaml | 11 + .../tests/common/_remove_config.yaml | 15 + .../nxos_static_routes/tests/common/deleted.yml | 81 + .../nxos_static_routes/tests/common/gathered.yml | 34 + .../nxos_static_routes/tests/common/merged.yml | 61 + .../nxos_static_routes/tests/common/overridden.yml | 60 + .../nxos_static_routes/tests/common/parsed.yml | 26 + .../nxos_static_routes/tests/common/rendered.yml | 49 + .../nxos_static_routes/tests/common/replaced.yml | 52 + .../nxos_static_routes/tests/common/rtt.yml | 80 + .../targets/nxos_static_routes/vars/main.yml | 53 + .../targets/nxos_system/defaults/main.yaml | 2 + .../integration/targets/nxos_system/meta/main.yml | 3 + .../integration/targets/nxos_system/tasks/cli.yaml | 28 + .../targets/nxos_system/tasks/main.yaml | 8 + .../targets/nxos_system/tasks/nxapi.yaml | 28 + .../targets/nxos_system/tests/cli/net_system.yaml | 32 + .../nxos_system/tests/cli/set_domain_list.yaml | 112 + .../nxos_system/tests/cli/set_domain_name.yaml | 32 + .../nxos_system/tests/cli/set_name_servers.yaml | 73 + .../targets/nxos_system/tests/common/sanity.yaml | 131 + .../nxos_system/tests/common/set_hostname.yaml | 35 + .../nxos_system/tests/nxapi/net_system.yaml | 34 + .../nxos_system/tests/nxapi/set_domain_list.yaml | 118 + .../nxos_system/tests/nxapi/set_domain_name.yaml | 33 + .../nxos_system/tests/nxapi/set_name_servers.yaml | 80 + .../targets/nxos_telemetry/defaults/main.yaml | 2 + .../targets/nxos_telemetry/meta/main.yml | 3 + .../targets/nxos_telemetry/tasks/cli.yaml | 27 + .../targets/nxos_telemetry/tasks/main.yaml | 16 + .../targets/nxos_telemetry/tasks/nxapi.yaml | 27 + .../nxos_telemetry/templates/populate_config.cfg | 38 + .../nxos_telemetry/tests/common/deleted.yaml | 160 + .../nxos_telemetry/tests/common/merged.yaml | 309 + .../nxos_telemetry/tests/common/replaced.yaml | 166 + .../targets/nxos_udld/defaults/main.yaml | 2 + .../integration/targets/nxos_udld/meta/main.yml | 3 + .../integration/targets/nxos_udld/tasks/cli.yaml | 28 + .../integration/targets/nxos_udld/tasks/main.yaml | 11 + .../integration/targets/nxos_udld/tasks/nxapi.yaml | 28 + .../targets/nxos_udld/tests/common/sanity.yaml | 95 + .../targets/nxos_udld_interface/defaults/main.yaml | 2 + .../targets/nxos_udld_interface/meta/main.yml | 3 + .../targets/nxos_udld_interface/tasks/cli.yaml | 28 + .../targets/nxos_udld_interface/tasks/main.yaml | 11 + .../targets/nxos_udld_interface/tasks/nxapi.yaml | 28 + .../nxos_udld_interface/tests/common/sanity.yaml | 113 + .../targets/nxos_user/defaults/main.yaml | 2 + .../integration/targets/nxos_user/meta/main.yaml | 3 + .../integration/targets/nxos_user/tasks/cli.yaml | 28 + .../integration/targets/nxos_user/tasks/main.yaml | 8 + .../integration/targets/nxos_user/tasks/nxapi.yaml | 28 + .../targets/nxos_user/tests/common/auth.yaml | 39 + .../targets/nxos_user/tests/common/basic.yaml | 143 + .../targets/nxos_user/tests/common/net_user.yaml | 27 + .../targets/nxos_user/tests/common/sanity.yaml | 99 + .../targets/nxos_vlan/defaults/main.yaml | 2 + .../integration/targets/nxos_vlan/meta/main.yml | 3 + .../integration/targets/nxos_vlan/tasks/cli.yaml | 28 + .../integration/targets/nxos_vlan/tasks/main.yaml | 8 + .../integration/targets/nxos_vlan/tasks/nxapi.yaml | 28 + .../targets/nxos_vlan/tests/common/agg.yaml | 123 + .../targets/nxos_vlan/tests/common/interface.yaml | 125 + .../targets/nxos_vlan/tests/common/sanity.yaml | 226 + .../targets/nxos_vlans/defaults/main.yaml | 2 + .../targets/nxos_vlans/fixtures/parsed.cfg | 67 + .../integration/targets/nxos_vlans/meta/main.yml | 2 + .../integration/targets/nxos_vlans/tasks/cli.yaml | 28 + .../integration/targets/nxos_vlans/tasks/main.yaml | 8 + .../targets/nxos_vlans/tasks/nxapi.yaml | 28 + .../nxos_vlans/tests/common/_populate_config.yaml | 13 + .../nxos_vlans/tests/common/_remove_config.yaml | 6 + .../targets/nxos_vlans/tests/common/deleted.yaml | 53 + .../nxos_vlans/tests/common/empty_config.yaml | 62 + .../targets/nxos_vlans/tests/common/gathered.yaml | 26 + .../targets/nxos_vlans/tests/common/merged.yaml | 60 + .../nxos_vlans/tests/common/overridden.yaml | 71 + .../targets/nxos_vlans/tests/common/parsed.yaml | 19 + .../targets/nxos_vlans/tests/common/rendered.yaml | 44 + .../targets/nxos_vlans/tests/common/replaced.yaml | 64 + .../targets/nxos_vlans/tests/common/rtt.yaml | 65 + .../integration/targets/nxos_vlans/vars/main.yml | 57 + .../targets/nxos_vpc/defaults/main.yaml | 2 + .../integration/targets/nxos_vpc/meta/main.yml | 3 + .../integration/targets/nxos_vpc/tasks/cli.yaml | 28 + .../integration/targets/nxos_vpc/tasks/main.yaml | 11 + .../integration/targets/nxos_vpc/tasks/nxapi.yaml | 28 + .../targets/nxos_vpc/tests/common/sanity.yaml | 181 + .../targets/nxos_vpc_interface/defaults/main.yaml | 2 + .../targets/nxos_vpc_interface/meta/main.yml | 3 + .../targets/nxos_vpc_interface/tasks/cli.yaml | 28 + .../targets/nxos_vpc_interface/tasks/main.yaml | 11 + .../targets/nxos_vpc_interface/tasks/nxapi.yaml | 28 + .../nxos_vpc_interface/tests/common/sanity.yaml | 140 + .../targets/nxos_vrf/defaults/main.yaml | 2 + .../integration/targets/nxos_vrf/meta/main.yml | 3 + .../integration/targets/nxos_vrf/tasks/cli.yaml | 28 + .../integration/targets/nxos_vrf/tasks/main.yaml | 8 + .../integration/targets/nxos_vrf/tasks/nxapi.yaml | 28 + .../targets/nxos_vrf/tests/common/intent.yaml | 196 + .../targets/nxos_vrf/tests/common/sanity.yaml | 112 + .../targets/nxos_vrf_af/defaults/main.yaml | 2 + .../integration/targets/nxos_vrf_af/meta/main.yml | 3 + .../integration/targets/nxos_vrf_af/tasks/cli.yaml | 28 + .../targets/nxos_vrf_af/tasks/main.yaml | 11 + .../targets/nxos_vrf_af/tasks/nxapi.yaml | 28 + .../targets/nxos_vrf_af/tests/common/sanity.yaml | 146 + .../targets/nxos_vrf_interface/defaults/main.yaml | 2 + .../targets/nxos_vrf_interface/meta/main.yml | 3 + .../targets/nxos_vrf_interface/tasks/cli.yaml | 28 + .../targets/nxos_vrf_interface/tasks/main.yaml | 11 + .../targets/nxos_vrf_interface/tasks/nxapi.yaml | 28 + .../nxos_vrf_interface/tests/common/sanity.yaml | 59 + .../targets/nxos_vrrp/defaults/main.yaml | 2 + .../integration/targets/nxos_vrrp/meta/main.yml | 3 + .../integration/targets/nxos_vrrp/tasks/cli.yaml | 28 + .../integration/targets/nxos_vrrp/tasks/main.yaml | 8 + .../integration/targets/nxos_vrrp/tasks/nxapi.yaml | 28 + .../targets/nxos_vrrp/tests/common/sanity.yaml | 133 + .../targets/nxos_vsan/defaults/main.yaml | 2 + .../integration/targets/nxos_vsan/meta/main.yml | 2 + .../integration/targets/nxos_vsan/tasks/cli.yaml | 28 + .../integration/targets/nxos_vsan/tasks/main.yaml | 18 + .../targets/nxos_vsan/tests/common/sanity.yaml | 65 + .../integration/targets/nxos_vsan/vars/main.yml | 5 + .../targets/nxos_vtp_domain/defaults/main.yaml | 2 + .../targets/nxos_vtp_domain/meta/main.yml | 3 + .../targets/nxos_vtp_domain/tasks/cli.yaml | 28 + .../targets/nxos_vtp_domain/tasks/main.yaml | 8 + .../targets/nxos_vtp_domain/tasks/nxapi.yaml | 28 + .../nxos_vtp_domain/tests/common/sanity.yaml | 46 + .../targets/nxos_vtp_password/defaults/main.yaml | 2 + .../targets/nxos_vtp_password/meta/main.yml | 3 + .../targets/nxos_vtp_password/tasks/cli.yaml | 28 + .../targets/nxos_vtp_password/tasks/main.yaml | 11 + .../targets/nxos_vtp_password/tasks/nxapi.yaml | 28 + .../nxos_vtp_password/tests/common/sanity.yaml | 66 + .../targets/nxos_vtp_version/defaults/main.yaml | 2 + .../targets/nxos_vtp_version/meta/main.yml | 3 + .../targets/nxos_vtp_version/tasks/cli.yaml | 28 + .../targets/nxos_vtp_version/tasks/main.yaml | 8 + .../targets/nxos_vtp_version/tasks/nxapi.yaml | 28 + .../nxos_vtp_version/tests/common/sanity.yaml | 51 + .../targets/nxos_vxlan_vtep/defaults/main.yaml | 2 + .../targets/nxos_vxlan_vtep/meta/main.yml | 3 + .../targets/nxos_vxlan_vtep/tasks/cli.yaml | 28 + .../targets/nxos_vxlan_vtep/tasks/main.yaml | 8 + .../targets/nxos_vxlan_vtep/tasks/nxapi.yaml | 28 + .../tasks/platform/n7k/cleanup.yaml | 24 + .../nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml | 32 + .../nxos_vxlan_vtep/tests/common/multisite.yaml | 112 + .../nxos_vxlan_vtep/tests/common/sanity.yaml | 225 + .../targets/nxos_vxlan_vtep_vni/defaults/main.yaml | 2 + .../targets/nxos_vxlan_vtep_vni/meta/main.yml | 3 + .../targets/nxos_vxlan_vtep_vni/tasks/cli.yaml | 28 + .../targets/nxos_vxlan_vtep_vni/tasks/main.yaml | 11 + .../targets/nxos_vxlan_vtep_vni/tasks/nxapi.yaml | 28 + .../tests/common/multisite.yaml | 108 + .../nxos_vxlan_vtep_vni/tests/common/sanity.yaml | 253 + .../targets/nxos_zone_zoneset/defaults/main.yaml | 2 + .../targets/nxos_zone_zoneset/meta/main.yml | 2 + .../targets/nxos_zone_zoneset/tasks/cli.yaml | 28 + .../targets/nxos_zone_zoneset/tasks/main.yaml | 18 + .../nxos_zone_zoneset/tests/common/sanity.yaml | 222 + .../targets/nxos_zone_zoneset/vars/main.yml | 5 + .../targets/prepare_nxos_tests/tasks/main.yml | 149 + .../cisco/nxos/tests/sanity/ignore-2.10.txt | 1 + .../cisco/nxos/tests/sanity/ignore-2.9.txt | 31 + .../cisco/nxos/tests/sanity/requirements.txt | 4 + .../cisco/nxos/tests/unit/__init__.py | 0 .../cisco/nxos/tests/unit/compat/__init__.py | 0 .../cisco/nxos/tests/unit/compat/builtins.py | 34 + .../cisco/nxos/tests/unit/compat/mock.py | 127 + .../cisco/nxos/tests/unit/compat/unittest.py | 39 + .../cisco/nxos/tests/unit/mock/__init__.py | 0 .../cisco/nxos/tests/unit/mock/loader.py | 116 + .../cisco/nxos/tests/unit/mock/path.py | 10 + .../cisco/nxos/tests/unit/mock/procenv.py | 94 + .../cisco/nxos/tests/unit/mock/vault_helper.py | 42 + .../cisco/nxos/tests/unit/mock/yaml_helper.py | 167 + .../cisco/nxos/tests/unit/modules/__init__.py | 0 .../cisco/nxos/tests/unit/modules/conftest.py | 40 + .../nxos/tests/unit/modules/network/__init__.py | 0 .../tests/unit/modules/network/nxos/__init__.py | 0 .../unit/modules/network/nxos/fixtures/__init__.py | 0 .../network/nxos/fixtures/_nxos_ip_interface.cfg | 30 + .../nxos/fixtures/cliconf/mds/show_inventory | 53 + .../network/nxos/fixtures/cliconf/mds/show_version | 40 + .../nxos/fixtures/cliconf/nxos/show_inventory | 8 + .../nxos/fixtures/cliconf/nxos/show_version | 38 + .../network/nxos/fixtures/nxos_acl/__init__.py | 0 .../nxos/fixtures/nxos_acl/show_ip_access-list.txt | 227 + .../nxos/fixtures/nxos_acl_interface/__init__.py | 0 .../show_running-config_aclmgr.txt | 4 + .../nxos/fixtures/nxos_acl_interfaces/__init__.py | 0 .../nxos_acl_interfaces/nxos_acl_interfaces.cfg | 2 + .../network/nxos/fixtures/nxos_bfd_global/N7K.cfg | 16 + .../network/nxos/fixtures/nxos_bfd_global/N9K.cfg | 13 + .../nxos/fixtures/nxos_bfd_global/__init__.py | 0 .../network/nxos/fixtures/nxos_bgp/__init__.py | 0 .../network/nxos/fixtures/nxos_bgp/config.cfg | 26 + .../nxos/fixtures/nxos_bgp/config_32_bits_as.cfg | 6 + .../network/nxos/fixtures/nxos_command/__init__.py | 0 .../nxos/fixtures/nxos_command/show_version.txt | 68 + .../network/nxos/fixtures/nxos_config/__init__.py | 0 .../nxos/fixtures/nxos_config/candidate.cfg | 7 + .../network/nxos/fixtures/nxos_config/config.cfg | 26 + .../nxos/fixtures/nxos_devicealias/__init__.py | 0 .../nxos/fixtures/nxos_devicealias/shdadatabse.cfg | 5 + .../nxos/fixtures/nxos_devicealias/shdastatus.cfg | 4 + .../fixtures/nxos_devicealias/shdastatus_mansi.cfg | 4 + .../fixtures/nxos_devicealias/shdastatuslock.cfg | 6 + .../nxos/fixtures/nxos_evpn_global/__init__.py | 0 .../nxos/fixtures/nxos_evpn_global/configured.cfg | 3 + .../fixtures/nxos_evpn_global/unconfigured.cfg | 1 + .../network/nxos/fixtures/nxos_evpn_vni_config.cfg | 8 + .../network/nxos/fixtures/nxos_feature/__init__.py | 0 .../nxos/fixtures/nxos_feature/show_feature.txt | 4 + .../nxos/fixtures/nxos_interface/__init__.py | 0 .../nxos/fixtures/nxos_interface/show_interface | 129 + .../nxos_interface/show_interface_Ethernet2_1 | 96 + .../nxos_interface/show_interface_loopback0 | 0 .../nxos_interface/show_run_interface_Ethernet2_1 | 8 + .../nxos_interface/show_run_interface_loopback0 | 0 .../nxos/fixtures/nxos_interface_ospf/__init__.py | 0 .../nxos/fixtures/nxos_interface_ospf/config.cfg | 17 + .../nxos/fixtures/nxos_l3_interface/__init__.py | 0 .../fixtures/nxos_l3_interface/ethernet_noshut | 3 + .../nxos_l3_interface/ethernet_noshut_ipv4_ipv6 | 5 + .../ethernet_noshut_multiple_ipv6 | 7 + .../network/nxos/fixtures/nxos_nxapi/__init__.py | 0 .../nxos/fixtures/nxos_nxapi/n3k/__init__.py | 0 .../nxos/fixtures/nxos_nxapi/n3k/show_run_all | 2 + .../nxos/fixtures/nxos_nxapi/n7k/__init__.py | 0 .../nxos/fixtures/nxos_nxapi/n7k/show_run_all | 5 + .../nxos/fixtures/nxos_overlay_global_config.cfg | 1 + .../network/nxos/fixtures/nxos_pim/__init__.py | 0 .../network/nxos/fixtures/nxos_pim/config.cfg | 2 + .../nxos/fixtures/nxos_pim_interface/__init__.py | 0 .../nxos/fixtures/nxos_pim_interface/config.cfg | 11 + .../nxos_pim_interface/sh_run_interface_eth2_1_all | 0 .../nxos_pim_interface/show_interface_eth2_1 | 96 + .../show_ip_pim_interface_eth2_1 | 68 + .../nxos/fixtures/nxos_pim_rp_address/__init__.py | 0 .../nxos/fixtures/nxos_pim_rp_address/config.cfg | 1 + .../network/nxos/fixtures/nxos_static_route.cfg | 3 + .../nxos/fixtures/nxos_switchport/__init__.py | 0 .../nxos_switchport/show_interface_ethernet | 97 + .../show_interface_ethernet_switchport | 14 + .../nxos/fixtures/nxos_switchport/show_vlan | 18 + .../network/nxos/fixtures/nxos_system/config.cfg | 16 + .../nxos/fixtures/nxos_system/vrf_only/config.cfg | 4 + .../network/nxos/fixtures/nxos_telemetry/N9K.cfg | 43 + .../nxos/fixtures/nxos_telemetry/N9K_SGs.cfg | 19 + .../nxos/fixtures/nxos_telemetry/__init__.py | 0 .../network/nxos/fixtures/nxos_vlan/__init__.py | 0 .../fixtures/nxos_vlan/agg_show_vlan_brief.txt | 27 + .../network/nxos/fixtures/nxos_vlan/config.cfg | 4 + .../nxos/fixtures/nxos_vlan/show_vlan_brief.txt | 11 + .../network/nxos/fixtures/nxos_vlans/__init__.py | 0 .../nxos/fixtures/nxos_vlans/show_running-config | 13 + .../nxos_vlans/show_running-config_no_facts | 1 + .../network/nxos/fixtures/nxos_vlans/show_vlan | 45 + .../nxos/fixtures/nxos_vlans/show_vlan_no_facts | 1 + .../network/nxos/fixtures/nxos_vpc/__init__.py | 0 .../network/nxos/fixtures/nxos_vpc/show_vpc | 20 + .../network/nxos/fixtures/nxos_vpc/show_vrf_all | 30 + .../nxos/fixtures/nxos_vpc/vrf_test_show_hardware | 3 + .../nxos/fixtures/nxos_vpc/vrf_test_show_inventory | 13 + .../nxos/fixtures/nxos_vpc/vrf_test_show_vpc | 3 + .../nxos/fixtures/nxos_vpc/vrf_test_show_vrf_all | 36 + .../nxos/fixtures/nxos_vpc/vrf_test_vpc_config | 2 + .../nxos/fixtures/nxos_vpc_interface/__init__.py | 0 .../nxos_vpc_interface/show_port-channel_summary | 22 + .../fixtures/nxos_vpc_interface/show_vpc_brief | 14 + .../network/nxos/fixtures/nxos_vrf/__init__.py | 0 .../network/nxos/fixtures/nxos_vrf/show_run_all | 4 + .../nxos/fixtures/nxos_vrf/show_vrf_default | 0 .../fixtures/nxos_vrf/show_vrf_default_interface | 0 .../nxos/fixtures/nxos_vrf/show_vrf_management | 10 + .../nxos_vrf/show_vrf_management_interface | 0 .../network/nxos/fixtures/nxos_vrf/show_vrf_ntc | 0 .../nxos/fixtures/nxos_vrf/show_vrf_ntc_interface | 0 .../network/nxos/fixtures/nxos_vrf_af/__init__.py | 0 .../network/nxos/fixtures/nxos_vrf_af/config.cfg | 22 + .../network/nxos/fixtures/nxos_vsan/__init__.py | 0 .../network/nxos/fixtures/nxos_vsan/shvsan.cfg | 35 + .../network/nxos/fixtures/nxos_vsan/shvsanmem.cfg | 30 + .../nxos/fixtures/nxos_vxlan_vtep/__init__.py | 0 .../nxos/fixtures/nxos_vxlan_vtep/config.cfg | 3 + .../nxos/fixtures/nxos_vxlan_vtep_vni/__init__.py | 0 .../nxos/fixtures/nxos_vxlan_vtep_vni/config.cfg | 3 + .../nxos/fixtures/nxos_zone_zoneset/__init__.py | 0 .../nxos_zone_zoneset/show_zone_status_vsan.out | 22 + .../fixtures/nxos_zone_zoneset/show_zone_vsan.out | 946 ++ .../nxos_zone_zoneset/show_zoneset_active_vsan.out | 606 + .../nxos_zone_zoneset/show_zoneset_vsan.out | 947 ++ .../nxos/fixtures/nxos_zone_zoneset/shzone_0.cfg | 8 + .../nxos/fixtures/nxos_zone_zoneset/shzone_1.cfg | 8 + .../nxos/fixtures/nxos_zone_zoneset/shzone_2.cfg | 6 + .../fixtures/nxos_zone_zoneset/shzoneset_0.cfg | 10 + .../fixtures/nxos_zone_zoneset/shzoneset_1.cfg | 9 + .../fixtures/nxos_zone_zoneset/shzoneset_2.cfg | 7 + .../nxos_zone_zoneset/shzonesetactive_0.cfg | 8 + .../fixtures/nxos_zone_zoneset/shzonestatus_0.cfg | 23 + .../fixtures/nxos_zone_zoneset/shzonestatus_1.cfg | 23 + .../fixtures/nxos_zone_zoneset/shzonestatus_2.cfg | 24 + .../fixtures/nxos_zone_zoneset/shzonestatus_3.cfg | 24 + .../fixtures/nxos_zone_zoneset/shzonestatus_4.cfg | 23 + .../tests/unit/modules/network/nxos/nxos_module.py | 137 + .../unit/modules/network/nxos/storage/__init__.py | 0 .../network/nxos/storage/test_nxos_devicealias.py | 454 + .../modules/network/nxos/storage/test_nxos_vsan.py | 260 + .../network/nxos/storage/test_nxos_zone_zoneset.py | 797 + .../tests/unit/modules/network/nxos/test_nxos.py | 127 + .../unit/modules/network/nxos/test_nxos_acl.py | 104 + .../network/nxos/test_nxos_acl_interface.py | 98 + .../network/nxos/test_nxos_acl_interfaces.py | 407 + .../unit/modules/network/nxos/test_nxos_acls.py | 517 + .../unit/modules/network/nxos/test_nxos_banner.py | 101 + .../modules/network/nxos/test_nxos_bfd_global.py | 336 + .../network/nxos/test_nxos_bfd_interfaces.py | 357 + .../unit/modules/network/nxos/test_nxos_bgp.py | 162 + .../unit/modules/network/nxos/test_nxos_bgp_af.py | 192 + .../modules/network/nxos/test_nxos_bgp_global.py | 795 + .../modules/network/nxos/test_nxos_bgp_neighbor.py | 155 + .../network/nxos/test_nxos_bgp_neighbor_af.py | 260 + .../unit/modules/network/nxos/test_nxos_command.py | 124 + .../unit/modules/network/nxos/test_nxos_config.py | 295 + .../modules/network/nxos/test_nxos_evpn_global.py | 81 + .../modules/network/nxos/test_nxos_evpn_vni.py | 80 + .../unit/modules/network/nxos/test_nxos_feature.py | 96 + .../unit/modules/network/nxos/test_nxos_hsrp.py | 84 + .../network/nxos/test_nxos_hsrp_interfaces.py | 351 + .../modules/network/nxos/test_nxos_interface.py | 116 + .../network/nxos/test_nxos_interface_ospf.py | 296 + .../modules/network/nxos/test_nxos_interfaces.py | 681 + .../modules/network/nxos/test_nxos_l3_interface.py | 395 + .../network/nxos/test_nxos_l3_interfaces.py | 1037 ++ .../network/nxos/test_nxos_lacp_interfaces.py | 113 + .../network/nxos/test_nxos_lldp_interfaces.py | 272 + .../unit/modules/network/nxos/test_nxos_nxapi.py | 100 + .../unit/modules/network/nxos/test_nxos_ospf.py | 62 + .../network/nxos/test_nxos_ospf_interfaces.py | 1572 ++ .../modules/network/nxos/test_nxos_ospf_vrf.py | 116 + .../unit/modules/network/nxos/test_nxos_ospfv2.py | 588 + .../unit/modules/network/nxos/test_nxos_ospfv3.py | 2260 +++ .../network/nxos/test_nxos_overlay_global.py | 62 + .../unit/modules/network/nxos/test_nxos_pim.py | 107 + .../network/nxos/test_nxos_pim_interface.py | 265 + .../network/nxos/test_nxos_pim_rp_address.py | 75 + .../modules/network/nxos/test_nxos_static_route.py | 126 + .../network/nxos/test_nxos_static_routes.py | 531 + .../unit/modules/network/nxos/test_nxos_system.py | 208 + .../modules/network/nxos/test_nxos_telemetry.py | 1834 +++ .../unit/modules/network/nxos/test_nxos_user.py | 104 + .../unit/modules/network/nxos/test_nxos_vlan.py | 235 + .../unit/modules/network/nxos/test_nxos_vlans.py | 294 + .../unit/modules/network/nxos/test_nxos_vpc.py | 235 + .../network/nxos/test_nxos_vpc_interface.py | 81 + .../unit/modules/network/nxos/test_nxos_vrf.py | 91 + .../unit/modules/network/nxos/test_nxos_vrf_af.py | 1090 ++ .../modules/network/nxos/test_nxos_vxlan_vtep.py | 105 + .../network/nxos/test_nxos_vxlan_vtep_vni.py | 119 + .../cisco/nxos/tests/unit/modules/utils.py | 51 + .../cisco/nxos/tests/unit/requirements.txt | 42 + .../ansible_collections/cisco/nxos/tox.ini | 31 + 1446 files changed, 211516 insertions(+) create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/.gitignore create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/.pre-commit-config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/FILES.json create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/LICENSE create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/MANIFEST.json create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/README.md create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/bindep.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/changelogs/CHANGELOG.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/changelogs/changelog.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/changelogs/config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_host_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acls_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_banner_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_global_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_af_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_global_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_af_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_cliconf.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_command_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_config_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_devicealias_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_global_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_vni_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_facts_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_feature_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_file_copy_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_profile_management_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_httpapi.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_snooping_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_install_os_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_ospf_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lag_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_linkagg_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_global_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_logging_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_auth_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_options_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_nxapi_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_interfaces_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_vrf_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv2_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv3_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_overlay_global_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_rp_address_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ping_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_reboot_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rollback_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rpm_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_smu_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snapshot_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_community_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_contact_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_host_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_location_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_traps_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_user_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_route_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_routes_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_system_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_telemetry_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_user_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlan_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlans_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_af_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_interface_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrrp_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vsan_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_domain_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_password_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_version_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_zone_zoneset_module.rst create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/meta/runtime.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos_file_copy.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/filter/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/inventory/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acl_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acl_interfaces/acl_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/acls.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/bfd_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/bgp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/facts.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/hsrp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/l2_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/l3_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/lacp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/lacp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lag_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lag_interfaces/lag_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/lldp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/lldp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/ospf_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/ospfv2.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/ospfv3.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/static_routes.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/vlans.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/acl_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/acls.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/bfd_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/bgp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/hsrp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/l2_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/l3_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/lacp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/lacp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/lag_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/lldp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/lldp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/ospf_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/ospfv2.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/ospfv3.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/static_routes.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/vlans.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/acl_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/acls.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/bfd_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/bgp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/facts.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/hsrp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/l2_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/l3_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/lacp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/lacp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/lag_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/base.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/lldp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/lldp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/ospf_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/ospfv2.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/ospfv3.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/static_routes.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/vlans.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/bgp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospf_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv2.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv3.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/utils.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server_host.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acls.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_banner.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_af.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor_af.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_command.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_config.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_devicealias.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_vni.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_facts.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_feature.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_file_copy.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir_profile_management.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_snooping.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_install_os.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface_ospf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lag_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_linkagg.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_logging.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_auth.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_options.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_nxapi.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_vrf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv2.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv3.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_overlay_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_rp_address.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ping.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_reboot.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rollback.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rpm.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_smu.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snapshot.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_community.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_contact.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_host.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_location.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_traps.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_user.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_route.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_routes.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_system.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_user.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlan.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlans.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_af.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrrp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vsan.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_domain.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_password.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_version.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep_vni.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_zone_zoneset.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_devicealias.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_vsan.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_zone_zoneset.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/requirements.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/test-requirements.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/.gitignore create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/network-integration.requirements.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/target-prefixes.network create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/radius.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/tacacs.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/radius.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/tacacs.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/templates/populate_config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/deleted.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/empty_config.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/gathered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/merged.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/overridden.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/parsed.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_acl.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rendered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/replaced.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rtt.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/deleted.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/gathered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/merged.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/overridden.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/parsed.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rendered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/replaced.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rtt.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/meta/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/dis_policy.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/hels.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/isolate.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/param.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/supp_fib.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/multisite.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted_af.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/fixtures/parsed.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/purged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced_af.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/multisite.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/multisite.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/cli_command.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/contains.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/bad_operator.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/equal.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthan.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthanorequal.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/invalid.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthan.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthanorequal.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/not_comparison_operator.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/notequal.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/output.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/timeout.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/contains.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/redirection.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/base_running_config create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/config.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configblock.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact1.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact2.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configstrict1.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/intended_running_config create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupexact.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupstrict.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/config.js create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/config.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/test.j2 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/diff.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/multilevel.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_exact.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_strict.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_after.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_before.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_backup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_basic.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_block_replace.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_exact_match.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_strict_match.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/backup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/defaults.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/save.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_basic.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_invalid.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_match_none.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sublevel_block.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel_nonidempotent.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/multilevel.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_exact.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_strict.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_after.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_before.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/redirection/cli/shortname.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/all_facts.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/default_facts.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/invalid_subset.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/not_hardware.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/configure.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/invalid.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/fixtures/data.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/input_validation.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/negative.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/nxapi/badtransport.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/httpapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/network_cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/delete_files.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_os.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_system.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/main_os_install.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_greensboro.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u61a.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u62a.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u63a.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_62a88.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_greensboro.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_730_N11.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_733_N11.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_atherton.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_helsinki.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro_force.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_hamilton.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/intent.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_absent.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_present.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sub_int.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rtt.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/agg.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rtt.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/cli/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/nxapi/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/multisite.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rtt.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/cli/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/nxapi/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_populate_config.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_remove_config.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/deleted.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/gathered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/merged.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/parsed.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/rendered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/replaced.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/deleted.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/gathered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/merged.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/overridden.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/parsed.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rendered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/replaced.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rtt.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/meta/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/basic.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/net_logging.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/purge.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_http.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http_ports.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_http.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http_ports.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_http.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http_ports.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/configure.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/disable.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/enable.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/nxapi_ssl.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/nxapi/badtransport.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_setup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/fixtures/parsed.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/fixtures/parsed.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/fixtures/parsed.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/cleanup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/setup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tests/common/configure.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/cli/misc_tests.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_utils.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/misc_tests.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v1_trap.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v2_inform.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_inform.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_trap.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/deleted.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/gathered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/merged.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/overridden.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/parsed.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rendered.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/replaced.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rtt.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/net_system.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_list.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_name.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_name_servers.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/set_hostname.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/net_system.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_list.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_name.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_name_servers.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/templates/populate_config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/meta/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/auth.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/basic.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/net_user.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/agg.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/interface.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/fixtures/parsed.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_populate_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_remove_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/deleted.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/empty_config.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/gathered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/merged.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/overridden.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/parsed.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rendered.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/replaced.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rtt.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/intent.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/multisite.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/nxapi.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/multisite.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/defaults/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/meta/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/cli.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/main.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tests/common/sanity.yaml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/vars/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/prepare_nxos_tests/tasks/main.yml create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.10.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.9.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/requirements.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/builtins.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/mock.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/unittest.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/loader.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/path.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/procenv.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/vault_helper.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/yaml_helper.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/conftest.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/_nxos_ip_interface.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_inventory create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_version create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_inventory create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_version create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/show_ip_access-list.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/show_running-config_aclmgr.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/nxos_acl_interfaces.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N7K.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N9K.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config_32_bits_as.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/show_version.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/candidate.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdadatabse.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus_mansi.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatuslock.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/configured.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/unconfigured.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_vni_config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/show_feature.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_Ethernet2_1 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_loopback0 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_Ethernet2_1 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_loopback0 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_ipv4_ipv6 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_multiple_ipv6 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/show_run_all create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/show_run_all create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_overlay_global_config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/sh_run_interface_eth2_1_all create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_static_route.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet_switchport create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_vlan create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/vrf_only/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K_SGs.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/agg_show_vlan_brief.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/show_vlan_brief.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config_no_facts create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan_no_facts create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vpc create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vrf_all create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_hardware create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_inventory create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vpc create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vrf_all create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_vpc_config create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_port-channel_summary create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_vpc_brief create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_run_all create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default_interface create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management_interface create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc_interface create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsan.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsanmem.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/config.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_status_vsan.out create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_vsan.out create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_active_vsan.out create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_vsan.out create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_0.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_1.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_2.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_0.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_1.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_2.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonesetactive_0.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_0.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_1.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_2.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_3.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_4.cfg create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/nxos_module.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/__init__.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_devicealias.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_vsan.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_zone_zoneset.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acls.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_banner.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_af.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor_af.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_command.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_config.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_vni.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_feature.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface_ospf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lacp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lldp_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_nxapi.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_interfaces.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_vrf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv2.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv3.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_overlay_global.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_rp_address.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_route.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_routes.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_system.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_telemetry.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_user.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlan.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlans.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc_interface.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf_af.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep_vni.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/utils.py create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/requirements.txt create mode 100644 collections-debian-merged/ansible_collections/cisco/nxos/tox.ini (limited to 'collections-debian-merged/ansible_collections/cisco/nxos') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/.gitignore b/collections-debian-merged/ansible_collections/cisco/nxos/.gitignore new file mode 100644 index 00000000..37bfb543 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/.gitignore @@ -0,0 +1,108 @@ +# 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/ + +# ide +*.code-workspace +.vscode/ diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/.pre-commit-config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/.pre-commit-config.yaml new file mode 100644 index 00000000..4ff769f4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +--- +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.1.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/psf/black + rev: 19.3b0 + hooks: + - id: black + args: [-l, "79"] + - repo: https://github.com/ansible-network/collection_prep + rev: master + hooks: + - id: update-docs diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/FILES.json b/collections-debian-merged/ansible_collections/cisco/nxos/FILES.json new file mode 100644 index 00000000..81e89acf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/FILES.json @@ -0,0 +1,15244 @@ +{ + "files": [ + { + "name": ".", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tox.ini", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3657204d8989588ff66aaea8ea60820048963b185dd20406c6ac8b86c59ed5c", + "format": 1 + }, + { + "name": "plugins", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "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/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/doc_fragments", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/doc_fragments/nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e7ca9dd75d21bf040070da2ea5b306e682b6ac146f293bf553a716352ee1fdd1", + "format": 1 + }, + { + "name": "plugins/doc_fragments/__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/nxos", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7dae1232e5092a957f5720a5223952cf9b32b8a485c0a3922b5e6ce52d6eb224", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/interfaces/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cc177b51c537bd10eeb1fc7c7c9f51955e41e715682fd79716f361785630f790", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/legacy", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/legacy/base.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "977a6440fb49e930efda1cc5743a8d545328794bf69c162369edcc81b547dde0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/legacy/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lag_interfaces/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "15d045a61371856388e0a70722d71fc641b1265f6ed0f0e1455c12dc72ad962b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lag_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c38ace1225c3a6343b8b1ca9ce785cce8fca565c7cb00aedf6781f9c377aa3c1", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospf_interfaces/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2704ddf4b48d8959cc21866e95fa7247b8ebe4925b73b630f26012ffcdc18e92", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospf_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lacp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lacp_interfaces/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "185aa29fb3446e714498ca14d5e47db36162d4ba1ea4598e2d2dc62db2763a4a", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/hsrp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/hsrp_interfaces/hsrp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "28f522115e221fbdeb231b085ffca48efb72b0c602dbfb4f5145229782853028", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/hsrp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lldp_global/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "125c05100fa28c5940d71631a1f1b87e784556a60ac51cc33d373c155d550572", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lldp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/l2_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/l2_interfaces/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "80dfa9eb2491032fef610c35857cb32a4f317c36f26433d5ff1170f8ed3deb03", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/bfd_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/bfd_interfaces/bfd_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24a1bfa05715952e13608cbdc317c254c011625a241fce6bf4523dceee65526e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/bfd_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/static_routes/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6adbf0232b2820a224b2ba44c97603bd095ff9951075aabf54e50f9dd0f0164", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/static_routes/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/acls/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fcecc2918e08c336307ac1278a8079b514428d1b2ca7d49c127a2bd95e5efc11", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/acls/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lldp_interfaces/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f24dca56b47c8cb25467aac8a554db1c201977299591b8aa260212cda3469826", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lldp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/bgp_global/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f9c4f05126c79f4ab4b54fdf876c1a5abf20255e57f6c880f029a42ed79e910c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/bgp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lacp/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8548fffbe6123bbc4c0ef8e786f41110959eb133ef85baa2f4c1a6aaf4ad9837", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/lacp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospfv2/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d8b47d549019ce630fbefc3c684b4771399e19561c3e2c0658aaf1360742d1a8", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospfv2/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/vlans/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c5646cafdb19060cb40df9701d47fff87713ff6d07165ca655b9e9df8b36a58", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/acl_interfaces/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0f0096f36a24209380a0177c09d66d95d6807e946af5c01cda1414f444472b84", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/l3_interfaces/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de78e5a0c84292ac3198c11ca00d24137d6106cd457f2d7a1ef4e35b89924d01", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/l3_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospfv3/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4567a654e3a4d79aa9d0d4f9c1b3fb7a88ee3e87b58ece7f510c95c3701c298c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/ospfv3/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/telemetry/telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b4592397205f7363f224fd2a0372555790bd5cd51717539eb64943c97b4b3c2b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/facts/telemetry/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/interfaces/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ea311b9c66639168400b63fcafb790ca736f91b5950b1f6e3b3a9c03bc6e747f", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lag_interfaces/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ffa93ed80f4f67c5514501dddc831143a9c0a75c595138926edffd2eddf7170e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lag_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospf_interfaces/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2848f506da0d5423efb114e59d5611c054665376ad02e903398471296b43f029", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospf_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lacp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lacp_interfaces/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d3335ab79692ea1d7365d2c55ecaf37907c500cb8b4ba16758a1cda9ad2b2ea", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/hsrp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/hsrp_interfaces/hsrp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d27a45987318a4a74c9b6553e9aae114bfb3e850738eaefe6c8757511983832", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/hsrp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lldp_global/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b64a0b5fd0fb23b41c542a2d32b265fa4db6028e1582d68bacc2325c499d23b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lldp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/l2_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/l2_interfaces/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d237c9991cd88a5f042080508726eb7c2ff258e81348a247fc3d5c53bd52743", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/bfd_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/bfd_interfaces/bfd_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2b34d3a15ca8419eb364c560fadfb0a5636f783a9a6a1321ed7588219cad5be", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/bfd_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/static_routes/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8956944b722706f138003ae7278a7de6905d97099fb56e8c6e7e8f82febcbd9", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/static_routes/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/acls/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2212e6b5647833521e2adffc521283a252e6c23a989fda72dba5568bb152432a", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/acls/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lldp_interfaces/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bc714299884155858f0de642ba578117d1672b64ea96d53b908478cab121d047", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lldp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/bgp_global/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e3d0400a504466a8159527f91fa60edbcb22d484aa9ab39a9ec90ed5aa36349", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/bgp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lacp/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5d175fc1ea408eea4f2b9acd28daca31a77c1573c350980f6ced7b65b2c5795", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/lacp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospfv2/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "60fae18306722d9e17595325b136fe91f03c5b25abf8ebe5de89ec572a483d3b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospfv2/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/vlans/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "59cd248ed5907cc438507cf8b249ba042a3ca97f4d5d86a123993a9370708e49", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/acl_interfaces/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a8770244731cba1abe60cfecf273804273c8a9a7c5862f8bbd7b9b5fb77e9880", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/l3_interfaces/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1451e82b19748b1aa6286e328b895f391f296cbd9396dbdfcde5ad505871c661", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/l3_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospfv3/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eb640891bc39e2475879ed916b8632196dee352cd92729cf8a1370ddba8e1fd2", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/ospfv3/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/telemetry/telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dd98125236fa8242aa7027f988335938239012898619e2d4c692a10fb0c2f713", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/config/telemetry/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/rm_templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/rm_templates/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "72981391359be297438fab53e13fbf32898186b1e19c1f9c040b6b06a91ae7be", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/rm_templates/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aaaeb302c5edd8d06329dca0759aa0050190e333009e50e8e38a34f89b0a55fb", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/rm_templates/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5def8d72c7b7cc0ab188fa5de449e4d299215c352de9526bb926a5ed867425a8", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/rm_templates/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "84fbb8d7a7efcaebfe45d4ef4b4c6f2957e64b95ae1d071653d3dd15e7773143", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/rm_templates/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/interfaces/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bf923784eccef48b2d2ca6041f13dcb9a2e8c6f79a9927102a4b613301c9fba0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lag_interfaces/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b06d0631188daeb4c102ca9b790c8ab898f0f38a0075e1e2e54c808b8f0acfd", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lag_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/facts", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/facts/facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "27d54a0d5e17c737a84a01a577fb76bd42f12962ea29eb01d7ece93c0ca7afe3", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/facts/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospf_interfaces/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c64c39527db33199c06d1d0e99592cc2baf7c7451f97483b6531c70ea9cedea3", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospf_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lacp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lacp_interfaces/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d362100023340da8779e4b01e347659d46944942aa956a07f1ada732b290a704", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/hsrp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/hsrp_interfaces/hsrp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c3996eb8f0c9919c2d8cfe386979f2611fe69c9498ff30778191c77797a482f4", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/hsrp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lldp_global/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7cd2abb2f49ab36121dca0e4d1c2109970e304550f7785f15c3c0e4b1cf998c2", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lldp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/l2_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/l2_interfaces/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bbecd9ecc850f0895fd370acccd1455b51d10b5d688587517f7f2fa850c4664e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/bfd_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/bfd_interfaces/bfd_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8fd0f3f66752dfb83eff2c6e945455fda66ff1da1feaf0cc1b0a725061dee264", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/bfd_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/static_routes/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a203109610a957447d9d672097742ce3ae3aa7e592a1b9f9e15ff4cf04016df9", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/static_routes/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/acls/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d842a518affc54f310121f40f0ba89773082bd198fe704b8a4b84b37a31c17f0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/acls/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lldp_interfaces/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3484050ea237247732f9d707f67a8b8ecda0be4be0226c90a0eadeb3c5670b56", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lldp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/bgp_global/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ea0596b230cf41f7bca62cdcffbf2ba6036e52c6cf5de7555751d549c1548ee9", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/bgp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lacp/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6b071a84e700fc47bd9e16e99cbf1bfbf5eb7235071749e715aff11b8daba52", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/lacp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospfv2/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a5330946ed4c3425cbbc7c07eb3e5d80c06655cbe49456a17e41476336a99f51", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospfv2/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/vlans/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "21bb7a0eb9c8ca46584964facd6efc1be50ea12601ea00ebe4b15a7627d2904a", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/acl_interfaces/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "56c4b84e7e21a7a38084921fd0ec38b6d2d43ba5bd2a67bb790be4952c7d19d1", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/l3_interfaces/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c5d9a989757652d02341fe7a0f2003cfecd2fbe18558ad892a8b61c654fc3f52", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/l3_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospfv3/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c4a71325d8c766e47cde6f272c81fe126c7601ae81ab95d2b6d4a837a4d2e4b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/ospfv3/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/telemetry/telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b10ed162445d467b123f7e92adfcbcb932fb1e0b36fd4705e6a3763e77a233c0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/argspec/telemetry/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/utils", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/utils/utils.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3239e6e467c12829cfb1d1fa980ddfcab7a4ac3077eda47d23d76ea1610e280e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/utils/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/utils/telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/utils/telemetry/telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7f0c175b11c0268b9f6c18a4b61950967a258c198c8b4a636ceb68acf03c7ecd", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/utils/telemetry/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/cmdref", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/cmdref/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/cmdref/telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/cmdref/telemetry/telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c1e506f11872fd7d5be612cc2a081fb11a2855f755b2f7080eeb265e3eaaea2e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/nxos/cmdref/telemetry/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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/terminal", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/terminal/nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "726cf1938c92d19dbb3fddab4518a3ed5b35b3453e3c492f163f68ede889edc9", + "format": 1 + }, + { + "name": "plugins/terminal/__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/nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b9fad4129f6f9c21763b686664ecb3d6f9bcc679134d0dac47c2e8bf2aec5839", + "format": 1 + }, + { + "name": "plugins/httpapi/__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/nxos_snmp_host.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a6d32d457fe4abe9d315c22f454f8a86f8dcdc4b760e12f1cf4c5f899fc485ee", + "format": 1 + }, + { + "name": "plugins/modules/nxos_feature.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "36d67b92b0599482ae7ba45918df210f0472cd44107c9164f89675f4fca82014", + "format": 1 + }, + { + "name": "plugins/modules/nxos_config.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "407ee97120552ce31737335b2739c9e8c9bbbc557e2c3a5aff5c614e381c2836", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vrrp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fdc8582484fc68db240abc10f51a00c09d6ff115c551371ab1a08477a6b82c4b", + "format": 1 + }, + { + "name": "plugins/modules/nxos_file_copy.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6f71c10798468de746930f4bfad9ac2b551d89463dbc4bc029e229e02f44f10", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bd1c8dbc4404d07d16d3a2746d61b644d259c338fa808c45d42724ec920016d6", + "format": 1 + }, + { + "name": "plugins/modules/storage", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/modules/storage/nxos_devicealias.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3380a2d5be590e051149ffbb3dd055017f3c2662bbae5ef6813a651984b3cd4e", + "format": 1 + }, + { + "name": "plugins/modules/storage/nxos_vsan.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bf471a22ff45309d8ede86eec93d3ce33de50c21500cf65d8a72b4f488a485e3", + "format": 1 + }, + { + "name": "plugins/modules/storage/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/modules/storage/nxos_zone_zoneset.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b804da40c969c3b0846763bc841f903e82e0df80c5112cafd20a9de4d8508745", + "format": 1 + }, + { + "name": "plugins/modules/nxos_l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "257be968e59a46b0aa73b5b6d9e0bd8e4ace6ef1b09a5f90dc6be582fd036f89", + "format": 1 + }, + { + "name": "plugins/modules/nxos_devicealias.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3380a2d5be590e051149ffbb3dd055017f3c2662bbae5ef6813a651984b3cd4e", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bgp_af.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7a020171a7644d06144bea46f3b5bee8edc9008b3072a565b22cbd213da843c9", + "format": 1 + }, + { + "name": "plugins/modules/nxos_nxapi.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "94cac0f1275b7dd6cfee9f62d0ca192b2af78cfc169400d235bd88abac716810", + "format": 1 + }, + { + "name": "plugins/modules/nxos_pim_rp_address.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9fa0b52adf5c14baa6ba6f4740ced9c1fcb059e70169f14dba3f87db42e910a7", + "format": 1 + }, + { + "name": "plugins/modules/nxos_reboot.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0b4373dd7311603a0be8f5a5030c9523e5aeb498f321e5c528a72df7d3676899", + "format": 1 + }, + { + "name": "plugins/modules/nxos_aaa_server_host.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bba468383931b22ee502d25890085600289b1901e49126021528aa6370bf999a", + "format": 1 + }, + { + "name": "plugins/modules/nxos_rpm.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "46f29f34b52e6066e1a28f71477f7ba0a237a1502c550aaceace1fc9070e8ad0", + "format": 1 + }, + { + "name": "plugins/modules/nxos_aaa_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "57e28dc0f2bb88d4061f9dd9d0d451fc47751f149f06130ead1e30611bced799", + "format": 1 + }, + { + "name": "plugins/modules/nxos_udld.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "95a97096371a5f8dd62c2c20da3eebd7d59cb6c88b4f11d1fceb3b05e3ecc200", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b15ecbbed67cbb6398bd74e7ebed5dfaa3b80fef655c122fdcd0ddfa426e56ae", + "format": 1 + }, + { + "name": "plugins/modules/nxos_static_route.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "56e0414dbcaa314deeb56b427ba5ce8b505c51651e891b0b0292412073c945c0", + "format": 1 + }, + { + "name": "plugins/modules/nxos_snapshot.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "51a8d0d9293d8e91b2d6b25186a871d5aa4b0c99202f949f5d3d826b90b7ec11", + "format": 1 + }, + { + "name": "plugins/modules/nxos_user.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "322a8f4bc581cfb481bc96799ca608c864fb86b5bd613113dd219e0fdb0840b9", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ntp_options.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "66267ca557d7a6dfd771d9eda169ead6540066a919cb3e66414bb6aafe55ba18", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64e735057bc6f048d30aec3d441156b9d3cf728107d1d4d4106ee26b817cfc08", + "format": 1 + }, + { + "name": "plugins/modules/nxos_gir_profile_management.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "82540ac730ab81c8c27f5383e8b8f6f903c471d6386d05a403662bdb0cfd7c57", + "format": 1 + }, + { + "name": "plugins/modules/nxos_pim.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "173313c7ba31275de65bdc10e1a9593c0d9c92c0c2bb5cdfc7e131a2430ec84e", + "format": 1 + }, + { + "name": "plugins/modules/nxos_smu.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cf708033b1f144f67b6e871d36d9b266b1d22682aa4c952bac3056de8e691d72", + "format": 1 + }, + { + "name": "plugins/modules/nxos_gir.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "57427a6dd3a90b954b56b5fd0f907fab277d4e6e599d7b80b262f2f1e42274a3", + "format": 1 + }, + { + "name": "plugins/modules/nxos_acl.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b2b978b9157660d9c30fb4d5f57ad0fbad79cdd8208026d17fae8e57a4f46bf", + "format": 1 + }, + { + "name": "plugins/modules/nxos_install_os.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bfca715c00f4f40d6e4473691ba6c3f6598807caed98a4447e8d888f95e73d0f", + "format": 1 + }, + { + "name": "plugins/modules/nxos_snmp_contact.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "734893f07acbbfc0933c27258b4ed180d859d1626668f813d1f12d5a95ab4775", + "format": 1 + }, + { + "name": "plugins/modules/nxos_banner.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "621cb9a780c668367b89df3d8e08eb9d745706dcb9a166ea9f190d706eb8ca87", + "format": 1 + }, + { + "name": "plugins/modules/nxos_command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1721ca1bd987fa620715f93fca2d852603fadd13ebfb7b33f54340a84b6e6e35", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vpc.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7209e596daa7c95acf5489738be78dacc94bbfa63b9064894157a2530ee1050f", + "format": 1 + }, + { + "name": "plugins/modules/nxos_snmp_traps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3b2f60a05da6315e71302a65ab736599ef730ccdad29a750f4af27ccfab18fd7", + "format": 1 + }, + { + "name": "plugins/modules/nxos_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "452ea709ecf983c340594655fafe73acb7e0999d4d9ad90d6c53ebf1ecc294e1", + "format": 1 + }, + { + "name": "plugins/modules/nxos_lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6afef077735f8bcd0544c81c7a6de71a719cb4d1013ddda75dcad648e843bf93", + "format": 1 + }, + { + "name": "plugins/modules/nxos_acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eb95809e64c3aeedb4781b12f1f027c35fa861fe300965c258bb0561037255bc", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vrf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "72f0710a91ab560bfeb16f1951f87c23d9189f924696e256c25578d55f801aba", + "format": 1 + }, + { + "name": "plugins/modules/nxos_interface_ospf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fe66710a8c2d5b1470f16136305d55519d8ae4c7b8f5e0087e7edbe80264e4a4", + "format": 1 + }, + { + "name": "plugins/modules/nxos_hsrp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24fb5e46a7da3d1fc7daf97ffb2eef49ef2bd82ebf2acf6128e0b8529d1b3d1f", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vsan.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bf471a22ff45309d8ede86eec93d3ce33de50c21500cf65d8a72b4f488a485e3", + "format": 1 + }, + { + "name": "plugins/modules/nxos_overlay_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "baf5e670ce40a05d7adf6d8cefe5402bd006dbc544f50d10a9acca1b4f9ed309", + "format": 1 + }, + { + "name": "plugins/modules/nxos_l2_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a54544de550975c121496e2fc4984677b57daaa7bbcf10f46a4c386b5de77ef", + "format": 1 + }, + { + "name": "plugins/modules/nxos_telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4ca2fff58c66a356d5aecd5d9b39cd63add0435773a94640e167d8fa12315121", + "format": 1 + }, + { + "name": "plugins/modules/nxos_lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bbb52367a19679185df7ed0b5d321f65262f7b3905c257c9760fe20ec4a08843", + "format": 1 + }, + { + "name": "plugins/modules/nxos_facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "040c6c510040ccda592c836eb05d8072b83b3f3ec2c5a767c60655b7ca74c0df", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vpc_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92078ca4ff6ba28728f3857d76fca2dd83473694ee120a9bbe8583941eabd831", + "format": 1 + }, + { + "name": "plugins/modules/nxos_rollback.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c15f11d0c553b2cd5e68654ffc452af0ba4efd813d43fdae7592439e24d32478", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vtp_version.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58600a004d00d44709c2862e039d1251a69b9aaf99a972a6e2ea239ee5abd7d4", + "format": 1 + }, + { + "name": "plugins/modules/nxos_snmp_user.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2471a31f2b5ff47ce7052d2c630bc8a9b73df14c996f496c3b8e3e717a5b3bea", + "format": 1 + }, + { + "name": "plugins/modules/nxos_igmp_snooping.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1809951aa4bcbae0c0d5edc459d111e7d68fbd13ee2c870ff0070b508467ce34", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d6a223c6ec0a63f2a3445a2825fd0e408324f5bb32209930c69a0c8df0da83e2", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vrf_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c6a03391dba3010882c64c6f927d2fc5269c4a76f18a954e65b8cfaa4a1c780", + "format": 1 + }, + { + "name": "plugins/modules/nxos_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1bfce945ad73d247b5eb28fa999605192c7cf55e1602c921612d484c260a0ff8", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bfd_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b6d66cbc0e9275271e8dfdf0158a1e500cf4c74ec8222982e6ad1a9d4b3c88c", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bgp_neighbor.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a7f9d4cceed7cc392327039d3e188dec5cf82dbd5fe27d04540b796be5e62675", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ping.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db4e75de2d3c28c582445f075cf93af4d5aae99d445b3fb1c2ef04be8b86116d", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ospf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aba17b172f12a727d525c6ddce3f75561713384f73dc5da40d5704ba935051ac", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vxlan_vtep_vni.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b58a01c074c5681ba8c64ac3597fe1c48a39b631b9ccb1ad8cb06df56de497c1", + "format": 1 + }, + { + "name": "plugins/modules/nxos_system.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b69b0ae39d00440c01ccd31d6dcaed99c06e2712392ed31b1637b886e4e605c4", + "format": 1 + }, + { + "name": "plugins/modules/nxos_logging.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "550d17ee4a25e295ee9f48ea4d3393fa140cd8a87d29350bd09f75c5621bd1a2", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vtp_password.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0e2b6de53327b1829ad3f1532e25ac5ad75b93ab4acaddc3bc58de2737e40ad2", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ospf_vrf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d7340747017958bc5eb83dc0eb0d800188a89801aa7c810aac9c9df957f9ee99", + "format": 1 + }, + { + "name": "plugins/modules/nxos_evpn_vni.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "30979bc1297c59a5863f8f67856bbfd3d013e1f86f1087bc2524e18f0152de66", + "format": 1 + }, + { + "name": "plugins/modules/nxos_snmp_location.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dbc279a74c8cc580e629e7b504d214c8dd78788137bfa97461b58d61e8959b81", + "format": 1 + }, + { + "name": "plugins/modules/nxos_udld_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5d3833dbca29851609d836e7d695e9aac153c0829933917c8e02690fff1c9faf", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ntp_auth.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "60ed7ebc7d601a34aca7ac3028df6326effb15151cbf1da170c53ab2b898990d", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bgp_neighbor_af.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "294167403a078c5399a1bad121803838cc39a5dd325ff417448081f8cf654096", + "format": 1 + }, + { + "name": "plugins/modules/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/modules/nxos_lldp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a897ea23b0a0158a720a5b28b82a34bb3a89fd7aa93af2063f80ea72d6848f6", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vxlan_vtep.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "02088848fee2ea04fdfc843b79627cb485a916173653056c0e630a26a3d0f386", + "format": 1 + }, + { + "name": "plugins/modules/nxos_l3_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "04a051e703649dd9dabd3bfd293b3446310121e255efcd5cfd01cd4044b92f38", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b986fd234acb80bea62baf1747b59c0b83a2d82ebc737a687df2dcbee1d99e02", + "format": 1 + }, + { + "name": "plugins/modules/nxos_lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "47d511e5d2c2f07f1d962552a432528a57a6889bb1cb02a22be089c6b6fb3463", + "format": 1 + }, + { + "name": "plugins/modules/nxos_snmp_community.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2325a5691092a8f5ba0356865edaacf505ff296fb26777a7e442bc6b777f0fb", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bgp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb862438c7a4d10e2465f0f9be133a9a000071d3a68e724b19dbac9054abfeec", + "format": 1 + }, + { + "name": "plugins/modules/nxos_igmp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f5a68e9d3c5d0ac08ddbdb516b35c3579ed58d2a4bd725e1572ff6dd4838d35d", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vlan.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ef894acec3c3593f83b616d2422c488f524fcd0ecf4a35b7fc4c46a13ebe75aa", + "format": 1 + }, + { + "name": "plugins/modules/nxos_static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "518127feda5f239e8997224d05e4c7ba23747db84fa6ab1bbcb8f142e3e59b9b", + "format": 1 + }, + { + "name": "plugins/modules/nxos_l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e5b703c7b83bbc1f28b9d35c51e0fa8694f3b783ce7ad0a1b25c6f7fcf5a6318", + "format": 1 + }, + { + "name": "plugins/modules/nxos_evpn_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6819dbe227a74901a3ae19052a9dd453b2245cbbb8ae39dc89cacd2dc6f1a8d2", + "format": 1 + }, + { + "name": "plugins/modules/nxos_ntp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2489dd8218531f7c327c5ce8624352e0feeba3359d65ad909d5f592ce2d73b15", + "format": 1 + }, + { + "name": "plugins/modules/nxos_bfd_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "503b2984e03740a8c2bd3b8c2f1c4e1f95c95564cb32296b6e0adfa2dd908c1b", + "format": 1 + }, + { + "name": "plugins/modules/nxos_zone_zoneset.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b804da40c969c3b0846763bc841f903e82e0df80c5112cafd20a9de4d8508745", + "format": 1 + }, + { + "name": "plugins/modules/nxos_pim_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fc260278a43d9ab521c8a3749dd3942ac70c5e845ebc0a521543687a9801c170", + "format": 1 + }, + { + "name": "plugins/modules/nxos_linkagg.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b64e84979cd2a5f36c5b12c0db0a68bef5edc77bae12cb206449c0986e3d71a8", + "format": 1 + }, + { + "name": "plugins/modules/nxos_acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1802a77ead3977f56a16086f7004f45f414d0731e4c22e70a77c91cd211b4f8f", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vtp_domain.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3f32e5ea672f814974b9712fad33cf1507e50f749927cea4439ec9af4512203b", + "format": 1 + }, + { + "name": "plugins/modules/nxos_vrf_af.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0685fb456e98612d03cc30b94d8dc37b986e655b4d02f0dce76ff0a4de1d50d8", + "format": 1 + }, + { + "name": "plugins/modules/nxos_hsrp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8b24030ba0c3b4f6742c9d8f5eaa0b5cda01041db9c2280c20529268d7b216c4", + "format": 1 + }, + { + "name": "plugins/modules/nxos_lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d8fc7749aacd4ea8f6f075cc25bb59c91c523242d019e7dd3d047b9a12bc658a", + "format": 1 + }, + { + "name": "plugins/modules/nxos_acl_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0696edf15c350778896e7671aa5edf775ec152cf9312752a954306ccc9dcb4c3", + "format": 1 + }, + { + "name": "plugins/modules/nxos_lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "981987f554f80215e0c0c709e1bf2afb024fe892aed30024e07840616ffb72eb", + "format": 1 + }, + { + "name": "plugins/modules/nxos_igmp_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "126a92c51722c21c158eb814e4e19c5fff44defeef29f8567b8b657287e0d3a5", + "format": 1 + }, + { + "name": "plugins/action", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/action/nxos_file_copy.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a9cdf8da10bac4637e036bcc4ec85219288c5938637e48e1fde63332c095177b", + "format": 1 + }, + { + "name": "plugins/action/nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a05ff953d8eb7f79e062d3f3b3743aad7231e7980635a029b67894ba675aa469", + "format": 1 + }, + { + "name": "plugins/action/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/cliconf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/cliconf/nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d6d5397cd9161a1644a28659c8e9b18721944292c8209ef2fa093a4ba0994e69", + "format": 1 + }, + { + "name": "plugins/cliconf/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": ".gitignore", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d82889c42613036469c8a3dc0257d4a66b24b27fec733972ae55e4f057123526", + "format": 1 + }, + { + "name": "tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/.gitignore", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7ca11f94c2250ee6433e3f2f0ef15099f7ad16d773636aec921408f5348ab1d6", + "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": "935199601f3c767ca623e1a8c6f73032f3cfee0536e4aed1cf5842b157956671", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.9.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "82ef1693e37c9e02729724c9d6529ea9db73d15f60d5d547b7a18f08e0141ef7", + "format": 1 + }, + { + "name": "tests/sanity/requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8a4ac4bfdef88e75d6e748e35a42fb4915947dfa2b7dd788626fd829600e014", + "format": 1 + }, + { + "name": "tests/unit", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/mock", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/mock/path.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2a8573a9f320125d028d95cbf582eb7f8d7417cf2d1e71ec8482e6da8354a594", + "format": 1 + }, + { + "name": "tests/unit/mock/yaml_helper.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "94e2f3c867d2582c9f7a0e99e544718e355025c4a51c9925e70158fa89b3609e", + "format": 1 + }, + { + "name": "tests/unit/mock/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/mock/procenv.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b3e6f9bf2a98e4cba1ff1ef8f6573a0fa0b08298658a87bbc9101c45f8874045", + "format": 1 + }, + { + "name": "tests/unit/mock/vault_helper.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "feae23166b6eb502f7d9b77c314970516c9a99aaad7de01295b4dfdad53c5c09", + "format": 1 + }, + { + "name": "tests/unit/mock/loader.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0cfbf4c710a5d5725f84d5f34ab76ec1a0e853397cd945c90fd97769f89dddc5", + "format": 1 + }, + { + "name": "tests/unit/compat", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/compat/mock.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "42dde10d64500a031d58e747e8af2e12994940f31f8dd56dbd3ee644c187255e", + "format": 1 + }, + { + "name": "tests/unit/compat/unittest.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ed698b1faec43d87a2c1ebcb15a2aae48b09ff355bb9a598e5f5a1c928dbb30", + "format": 1 + }, + { + "name": "tests/unit/compat/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/compat/builtins.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ba13a350ade8ef804336f888d5883b8e54f8bddfb9d0fadc10277a8ca6540f4e", + "format": 1 + }, + { + "name": "tests/unit/requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49ba996dc4735c3463e9af561344346dfae14bcc1a68096ce78364b377f0df1f", + "format": 1 + }, + { + "name": "tests/unit/modules", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/utils.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1827c6149851c9cf46509d2c708ceefd14d5fb078fd9b617f3ad2cf69aa109b6", + "format": 1 + }, + { + "name": "tests/unit/modules/network", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlan", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlan/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4cd4cba4fba8bd0ceca02c0cea325b38c65d82a1b01633f59776902dfc00010c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlan/agg_show_vlan_brief.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a6ad270b50167f7b13c3e7f40f83ebc812ceb7ef7d3455c0ce7b404ede9d6238", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlan/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlan/show_vlan_brief.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ee4b8f8f87ace677e2e24306674b258a3df53b8f706e6762be43599c54280611", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_loopback0", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_Ethernet2_1", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de922c7abca31dbb4d597cc485a02b9affe0c85fbaf1d268b15d38d8fe6ba069", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_Ethernet2_1", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6fda3eb0c249234e367f3e6d981a9957902f3443ff892ee35c3fbb87f8b2760b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_loopback0", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3342f19b0b7dc6f7e9786c299fdb6c3080cc0b86684990159f8eb13bbfa7900a", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_feature", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_feature/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_feature/show_feature.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7f98b0d0795bcad69e76bf98b5e204ed8d1fa40a24a53a6dfdde75a651bb7e19", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/_nxos_ip_interface.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4d095a69fca2f249aff0bca2225b96908723147017d4ad406307510c6136e5bc", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bgp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bgp/config_32_bits_as.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "deed874c21f6472915657eed44c550ff438995b132d365fedb8b94deb510c856", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bgp/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f971230c61be923533c3ea1eb63e9938cdf701f3884d511105d551d7ee531554", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bgp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_config/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03abdcaedc2f739a12fd1c31f37164f02ed471aff024ad8e654a0d7ec3e611e6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_config/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_config/candidate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3352c8002ead9454c96fa97e82bc2bf245ac57a69edbf8a934bed4ef809de3de", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_run_all", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2a24625313932312f1d5e1c1d2c3935f99e5ab28880315c7dd39698df72daf8", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c3a969f827cbacf630aee5ef779f5698d91c4ed24e585132e9110e44e8485835", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default_interface", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management_interface", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc_interface", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_static_route.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8787db2297394f70dfa9ea3550d604fcaef84c40d973c498b147d346422b8585", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/show_run_all", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "99e549b9d66b07532fd7631185cbd3cb4e56aec1f228c38b8f1774c03a5421c7", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/show_run_all", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db42fd8881e10bf436a6712d228152f2ca6e627e0aa07531751009df2153fc3d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_nxapi/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_command", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_command/show_version.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f99a8fbd2b7a7dac3d75081be1e2f2e5e2cf744db94cde017ca4c5a05028cae9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_command/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/nxos_acl_interfaces.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24483732c8c2cdd3405f5b570c8a0fec1c3227e03968c4963d3a2cf8c7336d1e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_evpn_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/configured.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "651066df5b4652b7a0cdd7cbff3a187ff28fa3fd7563d7d55e25ea610e4b93eb", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/unconfigured.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "84f47e5f6bde50931928544ec35970db216f2bffd80cff2d7b7350903d86a5c1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0c10e6761048c3f05f7143dc844703c76c41ed38e9f0175479874c183cef2ac", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_system", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_system/vrf_only", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_system/vrf_only/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b06aaf337fbe4c17a6347f76bf36cb281f97251e24a228838be117f19bfa9a49", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_system/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fcfb01e133f7a115f2203a1fda89205d218b7c3d76ab8c3b2f8e000f5e702fdf", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_vpc_brief", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1901ac7c063992cfcebb4ba110637bc241aa0fb122959d9af40be8957b47bf54", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_port-channel_summary", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bc24581fc9c635989ae2926270c03c4c85c642b768f6685cff7cfdcd924e70f6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9676910539593a9a50989e688d7848de6074092a58e720ebbb437fa02859bd5f", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "25600ba56e8e7066889af660ff87eb22aec3ce587ad60c1a7eca25c627064a5c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de922c7abca31dbb4d597cc485a02b9affe0c85fbaf1d268b15d38d8fe6ba069", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "88ad9b709dae48e373fcf04c158d6714de1f94e808fa033204d3b7b4e48bf8bb", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/sh_run_interface_eth2_1_all", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_switchport", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet_switchport", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "20b1d033b1ec9af9a4ba281a5e1dd7fda2d9e23dad0ffe3c770fcbd33466ef26", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92809410ccc4e02930faa0c788013226b538bf1f4210100bf0df2b2d36762a08", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_switchport/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_vlan", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b0f840e54d18c67e347003e11c25c0dc6edab3b98b3e4df5f91f7502f46a56f4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan_no_facts", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6b793f9fc0770084b8babcdd914c4c42b2d1d3256be53d0cba3a78c19a616dec", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config_no_facts", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "783b64a65f752ecfbf2ab084cb164df5d5a818d3dc9980856037a47853bcbfd8", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6ac358cca25afd3bbc1aa11515f5e31ea9d548abdbcdf0563949e446d76f0c3c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_overlay_global_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aeb566110f15e114259185610a7e1a17ba8a4a8380f590120292eceab885bccd", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5251c622e0f68d8c94e0215bd6a9f8c5d7ab755fc8879ceff8a9cac9b09caf9c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "358b10ada00b4a323c671eaa193bc4c62bfa6e6600042382003a8efe5708bddf", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_devicealias", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdadatabse.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4239e6e180de4f4538908b889e123464400c941ac8b44650d26d19decc3e5359", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus_mansi.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f55f8331ca8b77275d908fcfc308ccd34218c8d35d119cb1769cd792852c4407", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e73b339bd92467c7036db9b8a553148a902b37fd77bf450860b119c2b893d07c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_devicealias/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatuslock.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4f257c23d09e901d5d1e288ac44018a22f98e22f6268d014740cb29e8cd21f85", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bfd_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N7K.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "406c13868678145de8fa80ab6540d805084b62c191a928a466fd44e6e59ccd78", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N9K.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9089fae22c9d5b25f815c43f8de1b95041c2fd012d721e29e009e47f64fa66ff", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/show_running-config_aclmgr.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "606d5b49ef095558924b32c6faa4e06f128f4655dddd57595e945cd33a4dbe72", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cea4ee76cbd062bd53302a5c1f37bc78584c8677950c99eb145c106a8852b278", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K_SGs.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "af042e9ae8d0a2e6b6ddc28f13ce438e7b49050385ca546bdb5f1a1b51c1da1e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d4c2bff81ce036402bf1bfc5a01191ead2507ea6deb7e7d4930ceb35965b1e5", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_telemetry/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_l3_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96a17611067db53f8bdee41ec48055b8ec808b2968d4f3dd784dfae1d6d85d4e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_multiple_ipv6", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "93f0654869c15b0670ae97f78615662b35f5f3aefccfb3c1e2e463ae3759a6d0", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_ipv4_ipv6", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b65b76df737c6da986a8850a5874d6f6733c26b8209c778d7d861ce0b5cb894", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf/nxos", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_version", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "12c7c1c28fcd05fced589995a39f0a1389d970f6199fadcbf95543da330feb22", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_inventory", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cb14576378ab0f2fd25d13dd4c4dbc31c3940d65ecb5f2fa29b39eba7e04d7ee", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf/mds", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_version", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1373917db03d1655a86c29d177f939fdb5810cbe0aa0d285383bd01a9efb8bca", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_inventory", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3f4622f85efa127fb99feec0f7913a4f91599637232f3771fc2926f47edfd30e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_0.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9c1087f213695b914b160ad0b301bc2227a80347116b6ad69ab95fcdaad42df1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_4.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6b5d82cb1c7c14a84e6f6fa2a170b71e7677b14f9a140ec3afea66614b3a25d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_status_vsan.out", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "12120ed58ab5573f67d10f2d100f49ab5843d3c345052245b760b3f2261cf013", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_active_vsan.out", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a5dd33486ec1c22c00612c5f689b19224c9d0b4bac8d71dcf7b4df0af45f2ea6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_2.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5604f94b96e688d26c3c5e9994d4fa596696271f4c611f1fb02d9aa811003ce5", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_vsan.out", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c13b23c5c61282cf507c732fb6422ec648c22ad0871e61c87ba4ef2afc39c88", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_3.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fea0ee96001834c2bbfdf2283ddcbbaccd73eea57e1fd44861902ce0af2f171c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_1.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5e563a4ed12472625dcfb5d72f72bf9655ef73e13263781fe7a839abe5d5f112", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_2.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "08f7f3dc2d44ed61e7002bc417cea69f8407d7f4b0a62634c1f449f5338f7384", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_1.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4c1a3edebb99205f6ccae4f60cb8ded2917952354ca70cde27abad106be7c9ef", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_0.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ebf357900c35d6e6a43f6f0615598c9d075887254680ad9bc42e99d1f26c3dc4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_1.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b26ad26717862c6df5d8dbf0aba10a433083e11edb7af65c4596ce257d36a76a", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_vsan.out", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ee8465615d4db4f9ddaca651e9b564aee407634303fd9cc581f24c88c15938f9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_2.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6e109ddbe7ad8d251edbe3ebe5bf960c055ac9a1d3d5bc3865596bf0d65d83a5", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonesetactive_0.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4ecf309eee892d6de881eaae0bbbff8a416bc27be2329d1598dbe25ded070229", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_0.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d54e9d41580b5969fbcaecb84e1300c6ed29a5f18e14fafe66c264816acffb2", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl/show_ip_access-list.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92aa13724d1144e0fef0eb9cb646026ad3ce23bac3f409568bff5f790cf0c290", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_acl/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vpc", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4876569ce50a9bb5a00412d9e0e3bd17aed2d739613b28796c3224ae5397b705", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vrf_all", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a690233a51aeef35190bd4fd440a65fd819bc0153ea20b1b362c25392329e04c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_inventory", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3d501010723eb3675a96a954862a0210ac023095947f8e09ea951e15faa96545", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_hardware", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cf21f74cb2df54e19dae270c2b973eea492c3d9925ad7a1b8b59ff9f0e575287", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vpc", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5e079e4fa7499d1ee8e1f0ef98ba4908b5abe9bb146f2d07909c5e139940ff7", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vrf_all", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f9b34cc87b238b789fa2c54dd008597f37aa0a859cf06c25e5ce60aefdd0ed12", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_vpc_config", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f68fa10ece2a3162e69d8bc6ae207437f76b07a956782d6637214ae088346557", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_evpn_vni_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f12c0f2a38e284dde284dd4042cda86d71671289619456a3438a58f88ab929e7", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vsan", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsan.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6cc392164fbb3fd4f08fbdd53606ae51081e4d3532301f25fa74c7219f9b9e26", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsanmem.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a3aa606fa2138674f3e5da5dff953a177d80adeedd184be62b316572b3b6734", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vsan/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf_af", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e951961d52cff08ca4b84f59de8972aabac69cf66ddc61c7b6b00bede109272", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f5cb6a51bdeb6744877104e9357a496c75e0da98b2f069a4ab0eebee052c156", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_ospf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0510ad13e4174aebab7e574074ce0f86bf477786cf4fe5ff97e49f0bda68a48d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4e2fd5dc3c6407a9ee9dc942571d2d223f81b9e72c90bd9cdfebfe1c3b8dd85c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vpc.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8f21cb51ef57e2fcec9f6a94b9c8223dead6557d1152d32fc64b8b5882f62075", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9c6c6bf32bb8ebab883bcf378ef365e073bda0a00db0043bb82950ab580979f4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/storage", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/storage/test_nxos_devicealias.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b01ee837dd25f322405469da4f6463a2af6b4249b7b0127430a61d8a4d5909fe", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/storage/test_nxos_vsan.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "940b6cd1421d33f3a29a693fe8da1ab2519a5c186b80e673c08bf5ee71f4bbdd", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/storage/test_nxos_zone_zoneset.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9587eac4c906edd4e9ae5eef7b8c11cf69b7eec91577bad40c73a6b5bccf2ac3", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/storage/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_system.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4e6755ee599983239e613c516a59d1755afffb968e50f21bfd6084df89fec86d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_nxapi.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "862a4762aa3b47bcd44ef008d8c5decdb2f37b61ec5951bdcdc429451bf2c672", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_interface_ospf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90ea82aa31fe879441c37003752cbfedb8fa8d12d8057efc905c6a9240455b7a", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da82eaaa2fac08f769e6ce57884a4b8df873217c549ce6f8b33e5dc0ced2981e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bfd_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "618a7aa82787ce30d932571e1ddb8dbcfcd729cd66d333b2f064df58cc066e52", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_overlay_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d388489ce77e9630601e727e3b37956dc58b523ca294e4191e8e34fc2ad9dc1c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_acl_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a111a432fe8b4d731c0ab78ce920bd05a6db7de68effc9f932dab973953c05c6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bgp_neighbor.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e68d42b76eaf307d9b7a6280ac4aef3eb06e1d528958eed4ee3cee50334d1759", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_telemetry.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7d95247c3c3b5e8e07b516f225b2525911f3f989126e174930b89f3c9c1de59d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vrf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "913ae5d5f9bd0381d888e53d77a39ebf79fd26e80e41e2331d63099f515da0b2", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_evpn_vni.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d8a5567290a5b121bfd8fd5b1f542108dd8919b3d077332c10f23cf9a796ead", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a2b334924e2db6f14143d0bb8a8422f1c4d5b342bb8d70cc356f6e1979e3c87", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_feature.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4492abdf84b6cae215836403a40e718001392a3316a955a27f1968ca224ac1ec", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vxlan_vtep_vni.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "81739344da6fb7cf180d5d5e4f95e407066e35fed5e33b64f42770deca83d242", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/nxos_module.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5b5bf02ed72513431db0782c0ecf59ca084b2ec8a5e3dee7a7e48af1b0ed478b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_acl.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e8d47e9ca43d13746857b342e8c61e58c9f3aa77d3ee0c02a430e00b3e93b412", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_ospf_vrf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8e215300b89f27ab275c8c0e2dcea171dd0495e7cc84a1c64755286af68e410e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_hsrp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "691d4d7ced819ef9129d5cd93aea28b24560d6a6a81329758aa1257e21d0e0c4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bfd_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d6ff224c66e47d02d2589c0374f67599baccc956df58474b60c80eb445dce0c1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "32027088712f64a4ad7792891ec7c2c52a22c691866d86ff8a44e0cde3128592", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_user.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "15369502e991565062b76f22d4fecf41c08e511c093955f24d475f909e2bba62", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_static_route.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d907481cd97bf4f02ba0620ff21aef21f9850e91ccc353d54608296e866932b3", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "95c2f7e4ffd42c65e27c2941dec5c937f6b6ab3a31a3bdd73cf8988dbf9ea1f4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vxlan_vtep.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a503694efd8be3e49051dfbc5021c5f860e930f75ff87a81da34acaa3af574e4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_hsrp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "59270a09f4944fbead1225ed398a8f48f0335b3d724467986a64321524b65faf", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vpc_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6af25b14ede676e3940115a43fa27ac988cef56292455da0cd7e2c94c4b2b898", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_l3_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aeb9d7a6ea59a3f4b4e2e8e8796c95f3576937d3a2d29516db667014bce01d17", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "486756bb16e87d9990d39e5d217351972874153a6d5447623a6934df7e022164", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bgp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "32c662c6c75f93b03815272470fae47e94a525e05e0619fa9c7bf382c0adfc4f", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "43f138de8fcba4f1815be7d0942edaa714797b2d831365cb69419f27935cfac0", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_pim_rp_address.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8389e2cc64e7886bb8930f26c4ff710f538017e9e57c95e2b571494dbd058f58", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aa0d4eda727da62c2340974c74d7bb34ca1bbff362eb88cae77467ab8b4d780c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bgp_neighbor_af.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6b943e8ff4ef6f21e39150537bc53cf7ee8a27bc95aeb2bea07e4f806086fae0", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_pim.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8bd81d76569a640b8ac891b0ea58033cf61d7ab0cdb73ce7ade39cc9b082f5e9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_evpn_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "74eb27e9ea958cc877fed0314b02603cff44de4bc5b482112caae1f6fac93e05", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_bgp_af.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a9c81396ca6384cfd85bee758db4e9503a3a60749b23af8aae531f6af5ff2a84", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_pim_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b107adc8057fcd46ce022efbe70ca086c136d69826b0260db5c4c85be8fc9dc8", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_config.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c109e69fcc61a7b75e1fe876a50376ad3c420856bab535c2521a65c4d8d1ceb2", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_banner.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49b965a0606252a493e825e1d70b5aa5bb6f1ebf47da5b32a7a4abe6f02ad731", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "56a2141dbcb4b7dfa6c4b3bc67a039705010ed4ba4dab38b0bda551d1551d4cf", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7bb6427016010c41e12cf6977e982a5bcfa8eebcb4cd453220c441b4a4ef0458", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vrf_af.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9e567b8037aab2354f12328b7b9e5815599b56f3c59676ae2034d51bba041c90", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "138c4e62814551dfe67d4edb11228584f7c56f1cf3912ca00841e00539534bd0", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "61d6192fee653ccf616e67d5bbcf56871fd78f16e843f8187010320f149a9989", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_vlan.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306b1c98145010826e9ee8963c4f4f90a70dbe1bb9ef6d2ab16b80721e59bcfc", + "format": 1 + }, + { + "name": "tests/unit/modules/network/nxos/test_nxos_lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9fd17f55fe560def405f22ce248cfb533d3a0f7a0b7d460016adc27f1ec4def", + "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": "2af4846e50d461a131ad3edfb609fbb39a9eb1796048c62e4ead8234bcf5c6a1", + "format": 1 + }, + { + "name": "tests/unit/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/integration", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/network-integration.requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "234d0353684f5a41c84eabb03e13539abf602dc0de061a90e129618976b3c106", + "format": 1 + }, + { + "name": "tests/integration/targets", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tests/common/agg.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e8df81307448aa768afddc504bff229fc97d2dbf1c83d2b378ad5aacf8e7da7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "707ef55ad4a12259ca6eb996935b9762a9167390b7f5d23823f3922fd4e6246c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/tests/common/interface.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "750abfabe3188e25255656514824cc89bb6c1735453d0ac85d9964b6a4f08dd4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlan/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cd7d88e0eb1bf100a2ec1ee05027b44a56b87fb0faa239feb85918ab455617de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests/common/set_state_absent.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3bec1f274bf977863ef07f71fd0e8e9388803bbb8f7328b64c9bdc3ae098cfb0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests/common/set_state_present.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "57a9bbdfabd408720bed97a5a74dcfc45c4a63795721cf1fc37a66de21240ce5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests/common/intent.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "44d54d6c2fe64386c216d624666c7c7ad569eeb2eddafd33f8d7221b9a886ea8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/tests/common/sub_int.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cf19c146d6914736514f936c8415f7c464612566fbf711a66e455023ef4fcbd5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "98c2462fc70b1e381dc642c67363d6f328fbea921b50ae7ce4d99834db502e2d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0d731b45253aa621f36529767bf39ba769eadbf3351e27f98853503715445ab9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_route/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6dcf064ab88bc0355e763ed959171405e63179c07431de53a4683b9176c3c32", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_auth/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tests/common/invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ca547fbd411cd97005f20a43cf0042fe23292e9058cab882e7884a9fd09ec970", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/tests/common/configure.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "01b0c0531374171f79d2b4a1ef35910925c811ee4bbf055ef98796a1809b1526", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_feature/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "126c357f960d8408c7d5e4c3bdc05e2e5e898330e173a4f56f72240f10aae4bb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7ad287768ad59bf2a55ee8d1a82e02c5254571e5701e6e5ba79e6722d3ade59b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_linkagg/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "43f6254e971f9ee3cff60b9171464a9ef6c4e63afeb545d89bfa75bb32658919", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/network_cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a44eb179fcf3ce067265da237abc3a69094bd62e4f7b8a38c205752403bd00d4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/httpapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0d7c6a1272a0930b0a57e020842ebd573ef3f21b21634f1eb44fcb13651fd039", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5b3d9f6d8aab0a93173f7960308089e82af295c5edbcbe032db00814ac6b9dad", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/delete_files.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f10ba55cf860ad64e10e118186a0b4b4e0d0add9b242c3b97ba8ebc070c1c44d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/main_os_install.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ed8fd95a9fb25a1da8990cf9c51e29f709a67ac00a614170ddfbd07cac703a5c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d56f3a8a02939adb9107fb8490898670d77125846b402c352398bf2bb62eb68", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/install_system.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b94e0913011bca6d8c0a3baeeca70e734e5df0cb580bdb8da8c6e74bdda8328", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d680b2f6b01175e06d89eca2630093bf602e75049e83b14993144a096126de91", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/install_os.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "481d8fbd1f7ec9ece769048bb009b4399119d1c0ed3a5fe3a1c275d117960369", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bd8ce7f1243778dc744715dc325997749f508ac546c9d8c80f2802a973ad4052", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6856545faa6714e09a5c413977e4b2bd1189f6be73087ae16d8e2e5b9fb080ff", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_greensboro.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c9f1ca73bd86c11ad681573cd4d3f7a60bb9012b29727c0edd63deae523f38ef", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_helsinki.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7b0719bc1b240e8d973dfb14dd288448092cf88e43b29decd2b9ee5a907c326", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_greensboro.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aa27159a0371f0539093305f555dee56a044121a99e6a94421059f9a41a1d250", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_733_N11.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3dd059dce4c4a9912f94185c047ca1328ef997925ab81f43b97fb79849747a5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_730_N11.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6c45cb2c4ae0d30fbbff02c44ce16827651b39c6c329d95c5d71be4167755463", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u63a.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "be53adf9b486671413706d21e5d79cafa7228d630e30e005e5877950ad1c9a80", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u61a.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "af9193148cb82fdb9e3e5172e67a75be0f5ee419bd53e4a77c612b756f32b5b5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_atherton.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "78187979923132b6a9565337a4ad0a17e1263a729f236522260b3334e2a75fb0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2028ddd233316583d9caf8562e751e0f265b54b2568f0fd734cd730a126a5a37", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a73dbfef837c2598c87ca774161303b30b75a60d6d1f61d24ccc0a329a3bc6a4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_62a88.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6a9efe72f8e7e795e46758e2ff83e948fc4931f268131121e1d1522322110639", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro_force.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b26a1ab61b0f68aeba06d732cf15b48541e2edb2abd59398d10e8ba8f40fde90", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_hamilton.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "648a5055c8d4ab194decef6d286db4bc90ddf54c4580793516fc72f2c703fbd5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u62a.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bc25eac5ceb2dc3a2c5f0991321cfddc9ebc2815bc5d19661f2e1f220ef2acf3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_install_os/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "efb275d54a7c21fd007e1d1c8b10b65d148a9121af425a4e7fbd60abacd23fc8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2dd17f5bb9a67da15462bdc91432e4bb6e0653aa8d0c2b44a5527a96cefad1be", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d0153bb3064f3867c1225af3a2136fbb79c3214f104bd8a72baa19270067b5a3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a36e6b5f5bbda74a74e542770a415070514edccd183ec924e71e993a12093551", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e4eabc79afeb7394f266a23ad43ea2436a503762c3c010fb3794229287b517ab", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/_populate_config.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a2922322bec4d0bef5d18a1dac19db5a9dfde736d2e9730bf910e6d0bb40468", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/merged.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a3857c6b2c6c6caf0752861d0c99a1d1c13b58c680e1b0ee4d104b17fbd3bd3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/deleted.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7730e9a5e02d79af67fffcc8d6080303610a86474741235ffbf9c292867af135", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/_remove_config.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "41da97afa1f73c9baf24ba1357dc42ce3ccb98067e21039ef96ac747cca82964", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/rendered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ed05cd81e80f012a17d1aa721dfe898a25471ab194e0327b9d707e966ff6aec4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/replaced.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ddb0baefa3b7548649460c90209b1f78b49eb6d8fb423532e86b06dd9396b271", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/parsed.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e0665caac2b0a370581209b9f5fdf269895096a47d78c3dd950c01b359b6004a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/tests/common/gathered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cf2c391596843a282d86e6f7811e928eeefa90c584f5fd46d02f06f736b2bfaf", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_global/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "98c2462fc70b1e381dc642c67363d6f328fbea921b50ae7ce4d99834db502e2d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common/hels.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a3a86b6aa8fb18cf2a691368fb6c57c1325a9085ff8d6d4c6bf2080e5f368529", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "831d2ffb39e3d7f5f9c68c6b08c6cc25eb1a5d3ed6aad18525b277f2f1a10cf9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common/param.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f4fb4e9ee10b2d1b39a1cf960bb1c711da0e2bf4246689a3c4430988b7b5c85", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common/dis_policy.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0f86d0a8282c78105567c8700bf89a6361ecffb3d0a114931f5c63d1f69477c6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common/supp_fib.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "958bc5381f21642ae9e8911ea3e3d5cced30ffd36853c1c57518257b4a5bafc7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/tests/common/isolate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "036253379e53c72eff484ccf2f980ed6289b1d03550ccc6a9fe0ddaf7dfbc220", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3e9684d0d87b8e06df943893dd3e4e6f6b6db15b0215414d77b3f9b5deffc14f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bbc196210e497bbd6717a3ba22e0b0c3c5ecf32ddb060cb7dc570d6e1a5e1e40", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da4c0b3b38ce7251b985e1128e5859096a9b963efdd6005324aba7d9fb4a0c23", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_reboot/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e1ace220a0db906c28de90f2aa0f827bfe1713d8654591a627434f0356bcc1f4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tasks/redirection.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7503f7c9f1756901e21cb39314a797b73217348e39e0911b5583f9cadea1ec71", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tasks/cli_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "85cf134edf2a993adbf49b5058b0f58ef2469b24252aec88e7769bf50e014357", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "126c357f960d8408c7d5e4c3bdc05e2e5e898330e173a4f56f72240f10aae4bb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/redirection", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/redirection/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/redirection/cli/shortname.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fa2f499eab58c6a104d410defcfb788fb313cd79032275820b3dd4c9858a643d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi/toplevel_after.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cb6451ea29ee7a7aef3640fd510472cf94aad904ec709c7c9a7f8668b2e224c3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi/multilevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9764f0f69d61e1e5bab15da2c4777fdd54882c943f9c3dc1b28672272ebbb064", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi/toplevel_before.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dc4d27301f486813a3dadc210bef95dd92b15d85ce1eabac8d4257a874eead04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi/sublevel_strict.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "18bc2deaee3d7b3e613c85aa56205c54e17b7b24632282ab457cac744003996d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi/sublevel_exact.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e4036f66d40e4605f99b9a3fc4cefadb3818072d739f8852f677f9b86aab9351", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/nxapi/sublevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "69731695b02dc60538bfd42c8f2b14d47654ca8b5ca71733ea27c0112e22f0c2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/backup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "78766c6d3a699b655e983e97bea594d85154a1b5ebda3ce4df9dcbf03f8a0878", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "43df275778f0538e08523dc101baf4b952bc09ab3db7b304d817969e55e3dcad", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/sublevel_block.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c26e1cbd5fd25874869f326966be4dbbfe989c3a11473f32535aa2179235b23b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/src_match_none.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "00a1406ab0b06f40fd088dfec9dc4dc034932d2350e88c33afb61100f0b997fd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/src_invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "78e844843120d0aab69a8626303559dfc8e7ffe5b9d164c8a8f164da8cb4ab5d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/toplevel_nonidempotent.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0ea008a2051991d9e73c36018341be85291d05cbcbdcb0b357c5a275cb632add", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/defaults.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "546d3f8b614a90ab123f67cdc0a6e04aef214f3f9ab55f07e13f681cd5a80391", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/save.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62803a1362591a4de0f5a1ed0d4e4fe7f3c0b489e372ed4f51044bd3e8694da6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/toplevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "958f4b03b0e2c0fcb4eb0a0fdda05a18e680aec52158b4ec913c031f4f5a5fbd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/common/src_basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "12a536d267a902af625ff95b26b868103803895bb7b2ea82a29b23a874252905", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/toplevel_after.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d9582680e51a891ffce2f1051bb176e28af3a47861b854ea202ae106b3b86a08", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/multilevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1cb2733b1263e29fd79f02a03ac3f02c54ca33b2a3200f1337d1a889ec8bedce", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/diff.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "612a23f00e6cf419a26dd43102fc65b425693785d63d5d2c4ba7800d18bc8a77", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/toplevel_before.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0a146180bb1d0b2842f19fd09ade7bfdbca7148803dd882664de59018a57db7e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/sublevel_strict.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f51b2599f7088e629987222db75592985b8b2a09deadc83aa617017b26f340e1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/sublevel_exact.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4eae6e2e00a98bc5507960e352fdba62b25f95ac760e25373f8b52fa0dfa3895", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli/sublevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cfbde7802b71068a8ae2cee23f80f0505472e1c9dd900fb76aa71d5b868ed26a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli_config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli_config/cli_strict_match.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "161f87d0dcc43aed8afc6144e3481e18f660d117065d9480a9d55d56d2946a2f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli_config/cli_backup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8e3dc4e968e2149e65f78bf511fd56927fb8a0deb33233b24f6205f38bd5d3d8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli_config/cli_basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b3ab306801d31fb2da765150c680d7e8948a35e20a6ff8c07c94b3b6a7804a1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli_config/cli_block_replace.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8ef6011273c805ccd898782ca5f25cc57c6d734c13b5bf6fa9712a6151a96616", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/tests/cli_config/cli_exact_match.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dd7a76d8c130842211023ca590c94ec93b291dcf534f6e7f090c951930e0cec8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/configblock.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f8cfadc33b5527be5bd82a279cbcc769a882135ce815cb6d42177cb51d325e4e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/setupexact.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b358f8f54eb293ce2eac2ead8f8bc2e3aae7383c2981c9c192530d6bcbff3d6f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/configstrict1.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da30d9c2fbe9c9473f957d26568b2cb42baa620e261efbce7d604535ec532cf5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/base_running_config", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "85528fb2bdea51956f0b6d9a7cb07c7bc75e498553f9b5301b904db35ed0f929", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/config.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7a0ddafcd335eb7333321be6c6132400dd5e1ff65941156a384c9b9c3185260b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/configexact2.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5884db197b0f69276768f1f6e5e8b4214ead32869dab90d76fae353425a4b28", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/configexact1.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f8cfadc33b5527be5bd82a279cbcc769a882135ce815cb6d42177cb51d325e4e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/setupstrict.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b358f8f54eb293ce2eac2ead8f8bc2e3aae7383c2981c9c192530d6bcbff3d6f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/basic/intended_running_config", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b478553dd335d5085c847219eae58a8daac0902372a5e8fbbd133da3850332b2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/config.js", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0dc8a8955cfb2278cc0eb80121e95a99cdc15ef192fb007a0c6c453a837090ea", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/defaults/config.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6de5e1481b607749a549682563f0a16ff4d157637e41184e52143febd462b38c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_config/templates/defaults/test.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4660295b358cae7f791439bc9d8e9a8bb70badfdc095e4ac65e827ffbadf2f58", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e6d7ca0b33d423a6e1a8c3ffee88d74dc8ff5cffd71945764f02eec8d074ba5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_vrf/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "61d6efacaccdddd606e36178b4ab10c10fff6ed3c7f71114366fcac758f3b688", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_contact/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "98c2462fc70b1e381dc642c67363d6f328fbea921b50ae7ce4d99834db502e2d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bac6465dc36967167b05ee69572e3c7375914b98b8470b33ef9f014cdc26e085", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/tests/common/multisite.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5ab3b1466a0d7f9f996bc1e1b19c3d278988f72f09f58a49f7d4dd9b8a188e63", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03db47e855bf0513dc79330e36ea4c511d0c64fe7fefe72883977dbb12be8530", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_snooping/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "304a23e22863572ee37bdb90e2fc91c341b80f93706a25ae5540d4bb11c17fb1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/tests/common/intent.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e19853c1c346492d81b7a47d8021b155884b65c29badd268215e57158b2a5a2f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "29e034cc9d5a073509d64110009287ead1672de3b0cd54e527f70a1f3759f5d2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir_profile_management/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "47d829f3958de9499d2910cd10a29aa3023531300b6e24f923e17866715a57fc", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e915dc46b980cda82a3196a6b484701eaacd6edd416b1552a252030387dcb27b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a36e6b5f5bbda74a74e542770a415070514edccd183ec924e71e993a12093551", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7939a9887cb3ee5175bb02cb77f0cc9f7e4679783cd601f3af7d35be882db0ed", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/merged.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eeedfdc9e84c49dc5f9e9ffe99932b17f675cbacd2ae1aee4245a3232383e45f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/overridden.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e44030f8389978d3c59f658e9d0f81334f37ea056de9f34e391176d268c46f77", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/deleted.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9662e965b7a8cd2d9c1d34d626de9cc98d461126748dcb09cfd96ea64189db93", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5eec9f97347de055b6827c222d68696f08a6f3a175642e40e6243f18cfea5e8a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ea179f0b4974165f1ad36daff838b34a663eb136543c6a908df7b8fe73027eaa", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/rtt.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d46630fa3127a4bd39dfd449fbe569609d825fa48c24f9a112ea963728f878a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/rendered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "77e939de87559df332ac4520bd8c7ba06c99b2430aaf708c901fac5e4b1ac05a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/replaced.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d5769e76123e9766f57ab4f1abf1fe72283195c35303c7ebac3a3364b95452e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/parsed.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "91dba21c883b900ab47608be557f7e935e04fc9f70f41dc01bc42a7280812c9d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/tests/common/gathered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fdef9ff470ef544e28aa16a2688a66dc0d1ac11b67321ee5ac393e991ac50744", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acls/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "83abdb954ce72a8ac9712b59d5d60f3ec0ef8236e558f943a8cf84342eb92d2b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "861098a89fed7d6e5d239e730feabc38aa5fa401abd581d96baa612105d5ee45", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/fixtures/parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8b11a1ee0f13208e2f2c349799cfa03afb8dc9baa237656d4df26d60666439c9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8163cc66d36b14e593c3e9bec7993035501cd6e32cf8b351a1e1b91bdfad0d29", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "802c7f0aa9e14d8527f5987d67ab613066327f0471caffe09eb04673ca82d2ce", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0f1a91ee5bda989ad9cff5cb2ef4e9c87ff6fea510ef9708a51044202e1c0316", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b2a760d52f67bad2419e0abeca2f2684f2006af2c664a0b9803647a6f750b9fe", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "af1cac39631db06b0341bc5eb002e3e916d112ad46e9c2dcca833a366f265bdb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f5ae029cd9a5d3a47b8eb078ed4384acac391ffb79ffd0209de0243d6ba1ab1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "518be9c7b98b661ef2263a55c2dd7a2716387137c6ca7bb600d5a15bcdae26f8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5cce514cc872f04cb05f5c09ba91123673dc83d76a6a2a6aca5ba056546736ba", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3cbda8fac0c124cdd1bc1485a44e19a4f6a54ffb89d2f6f244427b792dcfec7a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c991a5b0decf2fd00a16a8c8ef6edf6e9385f767b80a8bdab3a750b551081f28", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv3/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "373ed33a485521ce5da1e2863aeda20b2d5870864c11952c12e3978a7e795611", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n7k", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http_ports.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da82772835a12331a0eb98e87b5d444a3cbfae14cfb6c15e4fd49319e108e985", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4d7b2cb33edb48f36be65e01bcf680cacec09984a77ea5dfe4023e8f92b4d684", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d2aa8b81786de223e43a453f766b6644fff40dd897bd3cc037fea78887fedad", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_http.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b7c94e9a7cc01bffddf63bb777cbc341816151099abc50215563c1a63842264e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/default", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http_ports.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9e9f6389a97b9adc36769ba9ccaa2cbf66366905802108d514c10088008a8fbb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "796018f73f0f7d609363c4a80166649b6f9abd0b048299af261f19601155d09c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c36d974923777db78802fe543681aa30afd25db4a945ec29b998b457bbfd8414", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_http.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "84e150e637aa6dd8677e598ed2e709ed393800c232cdb9f83a105a7a2180a1b4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n5k", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http_ports.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "56f551d0eaf875ce6ec8ed313814a83ab5f317465fd40a8063eeecdc39265443", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f92ffe0a939809885372c7fae0c14ffee0692d3f3323229b4c3ed7b9896c0a3b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9e727a73631fc2530402be6ff78b73e770e6e56d2c50ced8ab6820a8ec5208cd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_http.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f20e5cadd156abc5b188c22ccb4f9317255fb3343d1c72ef0b55ae442ee40dac", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/nxapi/badtransport.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6e5a8b1f3c030cee271d3ebed5f34f2bb8886a8163425a873ede057a662740c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/cli/disable.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eed486fb740bcff102d2cf98d8200f651e02c0e37fdcb057f89acd8efbbe3930", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/cli/nxapi_ssl.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6704f18c49d0ba048ce5a2ee55ca4928ae6d56d77e71d656f2d1ae1f4d6add6d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/cli/configure.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90c572f89fcd77e1d86390d8589d6cf4a3a300d21ba95bcf084bdf93fdca1341", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/tests/cli/enable.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a23fbdf86d62c900b616212bcf651b66862d4e3d5d8086a5d4c824fc665a6a0c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_nxapi/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "126c357f960d8408c7d5e4c3bdc05e2e5e898330e173a4f56f72240f10aae4bb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/nxapi/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b0ed6d814f937658ba82fd41c27a32bdfb4d1092fdb2408c4c64589dddb1475", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/nxapi/contains.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3cf6f45585548a0bee77576a862dc0fb30309a7c29e83ee0f8fc70ed50ba7194", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/notequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "79e5d6d4f147d8526d5821581f72ef5d47974f5b0f2030f7854920e142181a40", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7eefd1a513d70da51afc4b7375287da51c417379a5960e7f9597e06ec384b373", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/timeout.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "524a9e0de275d39300c9dc2d40d0c6a5fc3ce34bba0435d9597db5fda594c3d9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/not_comparison_operator.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64f8c4253499f7aae4016f2061e529203612aebca4f67e3b33239d6c4c2188e3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/greaterthan.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64b61ed0ed927122ce0272e519a4045c7c6d72b78894362fa50ea5fd00185bde", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/equal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "14986b048e029cb925badb7c68215f343bb553f52ce4fd179816731f0a56373f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/lessthan.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "824e4dd1e5e90a5f4f8d6569b3f2a756c8bd2480fb383389dd0ef6b221f26940", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/output.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "457395b24e649deffcdfe3e5d661870faae040de8f2178f9374a1c465f618e62", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/lessthanorequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a83210c63d78e18d5681b99f63d937880ffa63acac463546054d04d8afbb3ad7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/bad_operator.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e60c7eaa49f4869f74daf45d6a496291c6365e07b3fe9070044a4977f87d8768", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/common/greaterthanorequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dd67fd29316f581bc0c87577f1e37db746fdd9671dcc49f5758510073359f953", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/cli/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f040f000baad29d1da88a86774710b8f1bdb869fbc3a1bf1981ca8a850d48934", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/cli/cli_command.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e8af0e20c139badbde6e86c101bbd61c775e3adaa22e584c993e0351c0c3a727", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/tests/cli/contains.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cfcd32c26eedc9811de6baa93da38b5568f823283b96a4b9b32c596d3e101827", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_command/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4085ac3511507d3a289e89e88b6f8a67ee74f8bbf66bc4c2d693e7487757d877", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tests/common/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a5a1e4f29566e594eca3382c88afcbfb0d65822eaaaf26493ed481189a7a807", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tests/common/net_user.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8714efb16c872714b6d25f661c0e374cc7f50e0956279a01233112df62ce88f1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/tests/common/auth.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fd8c60c56eba9809160473dda9f1385e2361001905ad16e69f098166b739221a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_user/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "efa00b08216a281a34f569309c7ae04747c3de4f15664a10eeee546f4697cb95", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrrp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4d20e4dcece5c50ff688f4576e53355cab0ec0bc867a881247f2ef601ef522a7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_user/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests/common/default_facts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "537282abcc3a983586a4d5acded6a1a37d14057f818f652659cd7de018208b12", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "009215a866eae9dbc2df7c16fe8cb0ed660f8d7b82631666b6a0f11d7088f28d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests/common/not_hardware.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "69b284b70d6fd413b2ae830a4a0a64f45f01e13c1171450f3e55bce221dab440", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests/common/invalid_subset.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "21fafb05911ba64ee69092f6862421b7c33949e1fa0f2fc8784fec275a240434", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/tests/common/all_facts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cc5799df80d50dc7b183fcd72773dbeadc8f3addecfb5ab881b346483283c4af", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_facts/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "adc028ec6b9c495dd240a8b693733d738f84e950f4c601ab6b0c40d871589456", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "572611280cd281efce4b8b92f9c0c20e8ffda8ddbf5c5c4da9c0dfd5bb2a3149", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6a97fa118eda919bd0c4d9b45fbacbb04ef221e6d264073eda5612e7b57228c9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/populate_acl.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "19147177daa92ba568c5e0029ddcc7534f2e3fbfbea0afcc7f89a287e6c43995", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/merged.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a47a2d6c573654c2deeb7c65feb3b1a1dca66648a411518219620455b6e0ff9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/overridden.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c43a3aea22508f2b4cbf0c73aeaa206e2bb208f5ac48c1200c57c222d7f7f68e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/deleted.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c6b350eede177d8b80ec0bbd3eba038e445e040ae39bac79424bfa3ecb7e92ae", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d212643da307764899d6207afb0fad7e7fe25fe54a9e6f276c742a8eb1df6ca6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ff18091eda8eab8839ce8b146409c956a16da2af0d78204879e2a0d844835c46", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/rtt.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ed462472ec31ef149cf8ed4c81ee1f72f40716c6b0c329f849e79ef772987041", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/rendered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "38d63226a392a129d331377dc225a75bfa7f05eae370f3d6d61d220588b2e9b5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/replaced.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bf40389e98cf5696d0a5c5c78b371f1b31db36821bdad34989dbcd36810a7ccc", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/parsed.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6ba796bb5ae8917a9819ede81a454dd9d983819eb3476166d8d243960bf2aafa", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/gathered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d9b508b5297788d943e82e90ab1201fdc3afe36a24bf7398d808198b44828c84", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/tests/common/empty_config.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a1490f66d148a6f2eaac3412e1c665225c6c98e8aca0154f72d48fbdb36ec239", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interfaces/templates/populate_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3b339858a62e87d8b87a9f59eba8121b0928e7bf655f6a0c8f91c8b0516dca5b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "433875bc04d16e368a0b80f634520323a0edc59f75b6f1b82c7434ac3c107a65", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f61d9852e6d160fcbb5edc3fa51a582ad883db7375db3c05041c0c3cb47dc02d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_global/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "05e1f339e413857f85f10141aa371c95b4ee9d94bd2ccaf0dcf73ea0c9f2eafd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f40d8c98b469b6d0740c6214f156bd8e6d8f6a1d88651579fbd1ca60f19cc057", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "43242bcf5dc424c9cbab297a8f0dbc4265eb6282ce062f9c81ac1d75220371fd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "738bcee26228eb111e2c66737a653d01127e48a1e286871c74ad35d159b20e14", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64a5aaa695aea8bcaca388a0acf17234070412d5ff321551475dbf41544df345", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5f87b7975a9917e20ce0cdf104a1128700185f725a777ff0a23758c012597ade", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "312a0aa4009cf5f33a71c65da0f40e8c794cf1ea9bd8419c5c8bbd3b0700f96c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fef32bb74536c7c2ff77c5e1592a59e06093973565655f421a5528830d5698af", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2ea2b1cb8010db1897279303eb700cb4f2a4bf2604e5f73125ea484f162df9f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "93ebd9dcdb03cd69eed43b1fdf3af64cd7ef4afe8d90f479bf7158c3da675d11", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9de513f69bef45bda9face3249906afb627e11055d75fcf01b84a71dbe585801", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ad49263e5a317bfa3c45420a4ad5f16e4ccfe2f3a8a9712e9fcdaa3060e87488", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8e1063bad75108140766de4f98e3a1156d5309b2c6c141d8ce4db482980c49d8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4eb9a54854a9ee894385e0f3936cd29504af79b33e3e43c267f163ed8a3a58d4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/tests/common/multisite.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "66c7b5be62ef98474de721b0d02e0e3c1e2170db8bd7523b78050187602cac6c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "118daebcc306b57912888b4132d1231f3e963c6bc3e55ed1ea996365d17394a5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6bd7b40103ebc9115a513f3d81ba7e4b8574e14f4fec35c509b9d268e419454", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "504055a5e91665195a287fa662bd4eeb820a0d815b8f313cb33257dfbb955931", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4c2043056f7491214e3cf3419e3448b91dbf67ec1dbe75cb1da9d7c44a83b98c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "73671ff54c9c31e488a84493dea6f387f69d68c37df84dab9ceafe57c6df8086", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bfe6911731fd41d3210aeb03fb56d243bfac52358cc0e06efac945b23415a1f8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7ecfbb20e87d2bd0ed99938a8e531ce1582b7401e58c694bd028476f402206a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cc5f238d709651326bf419d8f7eb1a6c981a34bffbc5eb1f3d582bcf2f2f6ac6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a9fa160d2c1419ec7c924e34835cd9a073e331f65018afac3a630bcdb260608", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c3db1aeb5027ae772003eeafd848979b1df30e1199909a70115138d9b8af2e82", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "11a78612eeeabe7bcf609e4c6aa3e8bdc2afa5d76b16bf71c71cb84d26ecdd9b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f112271d3ef89562a08c80a355e10f6ea12077e381bf260412d911624d4d1bfd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2347fc0a8e302c0d3e56859b5fc40e1048b35c5efa02e1508e5dc8d5109a8d0f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/nxapi/set_domain_list.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4d308849c39aa433d93f1b309105068f6c0c389ee17fb05c14f22f2b4a92d1a5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/nxapi/net_system.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f941c0c1c8d6aaebc4c9c0db7eb357362afbaf0d827a7ecfa01c49fad9fb2362", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/nxapi/set_name_servers.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f51280c5550129aeb4d7f36d6e7879fd216fd78635e696aaed62845c927ebfb6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/nxapi/set_domain_name.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a53c1b01f43f5f9e6838aebbff7c72de24710f68aa57db6a5be527cd27948d8b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "489cf69deeb3ea03f24bdc3341cb1c8179c81e2197427bec582f817c652837a9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/common/set_hostname.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "acf5085fb708c504d136bb0521dd90bb5c4be6ec7e83e9125e941d28b9beb199", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/cli/set_domain_list.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bfaaa34ad4eca7957435013598cf72084aaa5e6d8c126b1ac792a245451fcd45", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/cli/net_system.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ad71192133889d8941c73834ada736e49f55cb51344749ef112f1d7b1d810b92", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/cli/set_name_servers.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4ef1db41a08b5ae3ba036d284892ff548848b4412617b8d77567b4b6bec2dcb3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/tests/cli/set_domain_name.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "45dbd8e98c38dcea1731493ae58f1eb5afc5957114cea8fa08baf521365e067d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_system/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6298f5e68b9306317082190f235aa575f5269663ab41d5483458bcfee828a1d4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_udld_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d2fcb9c32d7c514e08d02ff511c67c4224c5770ddca684eae4ff9bb5572354a6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0eb1ad89a9131e3966277c1abe9b4061876689d5299be5c5fa4f9f6bdbae281e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/multisite.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3f8e376f6d08006f77307b8b23138cbddcc0669ff40b881590209cb10d0cdfc", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep_vni/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5749bb44727d28a9cfb22f3fbbfa07f5c6dd12168595565f5a8b125a774647f4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ntp_options/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d7f762bdbd97e330d48a5fedff903c03a7c607d3d07bf8e12d2f1d07a4dc97c0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2bff2a18c137e32383e37b2b85a6d4800764831269fe78de5fe393d799bc8d23", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "415154a2ef9936f47fb59544d6ef8b6e6e8fa20d2f0bfd0643ef5590fcb425a9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "43a97d2b65848edbaaa5e221246266b7d4fe12a27a444c841679e1cdcd8d93c1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/fixtures/data.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ef43c9adc8aeec6910b4373ba0d9fbf28048ed53ec631ab9fd6fa8ad00a8a3a0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests/nxapi/badtransport.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ced8b1b02b188db01966fb3b7859ff7df9c913bffea20468381de27f6515a35f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests/cli/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "214d03514a8b2263ac312a0ac7cece349dbdef5e7b8bb1a6679e764a1fbb0351", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests/cli/input_validation.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9823b75d4c84f3298cd440effba30aa66cb83f462dad43a36b1031df6c3e5c39", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/tests/cli/negative.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e004e9e343ba80e93ec21b64b4d12378f3835e4f4e91bef1fa50d29dc40d0cdd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_file_copy/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3d2e833de2b229ce59b3e1b69f34b19ac1912ffedb1c77a167d1871f3643550f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rpm/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/fixtures/parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8755e078fc0f45d349ea94c16a2805497636958a1ee5878e2e75530c5f651712", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fe32768117d09361b752167a7a98a8d35be9a2ac3eafbc096762180df2372e1a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "931c829ea8e7e7b53e41a010169ad18213ab26c5ffc7015e6ee4d4ced711e58c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "214982100cf145ec9a2dae0d4e1ea8a24f2ccaffa43c523bde73bc0f3bda7ecb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "48338b2c66266b678f581b6c3cf543dd7dd993334233c4c30159437e780ceb40", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "07e40a19386d106d9f3aaf7e11516b330eb9366f52d5196c02eb4ce97103dd2d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92d4293c71878ff084d4e218c29873799f587f69403612293b94564fd3ea2b2c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "984b8cccbb74d8ada33935ad944cc540a083b71361f543b823cd365e26c150d4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c40119a254f3a1314f7b3bd8cd8366106f133396a0d9d5c13bd5a7354800822b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7b2b2a69e925f7cc6c782c050e4d956a2f80239cd268d04096d8af1a20743207", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fa83156610ceadf80240db5af2a9b93c998615804144e64d22be8220a1b5d96f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bbe359ba24f3867b0b4d490a8d17019bb6e2ed8e05b9c80b0031a2981047277f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b22bdb29cd93b281322449aa945b0e8a270d76fd13f295f88baa4b1af317cc60", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vlans/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ec4fa30fc4a7b9e002d1c7b3932286ace72ba36e4f532e2cc79f49d07e0794c3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e97ab76c21b2524dc4cf12bd4ea4e93c1e52b4d1285698a7a30af15de3d74877", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_version/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5495873c3c3c49d12637f911af2b9b986cc442247efdb28f0937ccdd51ca4bfd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e39db3113ec9d1a18ecc9670e11829928e9b1e542c9c226fa1eaaf2b22f0c6f9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e67589c3b2f131f5c49805260b88201063f30b157fa778b2f8a4aacfbcc5ac02", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2c75ca2ad92bb5fefd00f4763486406f750c34ea0740052fb04d468866360a58", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3550e4c9585940a20be8a529bb472a69f8eb945eed0a77c121fa73c3d0e37ed1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e276c43f44dd58717513d26fb6224396a9a0612796ecc4c5d2c2a1f4fc58f4f8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cdbc58f79c94e23c371ae30de9f1400a26b0b02128ed906702b2e41eae540e12", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "44844e4c82ae77e5e25cc891fb299b1559e16eff535873bc5a507d88e7f0ae21", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "13f3da384288fcb3fd991aa2eff6861f656c0fd84c07268da7e4a2afb7b97273", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cc746c31908c52ca6f3c552924ed25af885551239094564638c29d4ab9d83c18", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3d31c94be20410354fe978f5e5f3210180570a3d6bce1449796ecc1d008090da", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49e26aa9b2e15bdfb22a664bb580cbc18b112551bd9971bd4b8d2c67b3a0eaa3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0959d2d1e63a624ae37aa49e4da696342711d247cc1883691c06a94b47de0fd1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "02419b06bc70f30356bebe5a7f2f9aee217e51da0dda5abaa73b2d8ba4ffc814", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "13914f3d976e926a8b012c8ca9c8f8dc20fd530239607f0ae187eb891b9fadc6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c058fb73f156daec1f492d4a02390f1b20c20df24942227839ffa9a9c3f6b0d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4494e5a19760b9ecf4e55fc2d1a184affa93b7c8c8cf2c0757a96f7fbe81b5af", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e7bf4b43ca609d283c69c35f598e51c157e2ea1026ebb99e9bf4a40e862ef4d4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fc7af2d92df2785b20443f99d97462ec273b243f297f9cf7527ea5683dfe36de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "981adc50b1e7d328d8bfa6cca9eda5158bf2937b662f68a2f56788f5d2839f49", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9dfbc17009aa801e2ce7909ba90c5d3f54f058d9020c782c0312d39dc12152a4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "622cad83f89ffd85a9c22df51d3ec4887069fbf4ef6ad389b071a4b67458e2c0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "571b183456bd95b17a74a92a00d6afd75941722e182c7fd898cf22d8e2a9fe0f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c683c300b226d0dcf38af0f2fb55b961e50981e029a6f84f8e2e35b864f4653e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3dafb7f48a22e58601524f565728c1552d77a424bb8550db5821ba835d3d699a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e915dc46b980cda82a3196a6b484701eaacd6edd416b1552a252030387dcb27b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a36e6b5f5bbda74a74e542770a415070514edccd183ec924e71e993a12093551", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0959d2d1e63a624ae37aa49e4da696342711d247cc1883691c06a94b47de0fd1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "823ad4608bc4788ff160348fe4e6be75f267c9f2a55bf2043875eb2d76084f39", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/merged.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "15850330809693946dc8860395afb184df8e54a33b31d22f7643f2db08ae4153", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/overridden.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "996f3cff683aecfcf53a98558fb7546d2af53e1fc8a82b5bd8a65a962a7285da", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/deleted.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d01475cb6afe068d54b0f8dff0c8780ab17ea10512fe0eded7599fadaa4982e7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "303bc0ba56d6f13d152987aaf4b6953d88e4461e8958c7db467d52d247a63dce", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/rtt.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da4cc4b73fff0726ba768b2720135dd8608d19a7e9343a929c4d613b7a05edb7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/rendered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8f4f6d304336ded4c137131da0c7a5757bf751e5b906dece814d9cb7d7da8473", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/replaced.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0d621c66716f0c9a73982c41651f9e5ca36943da94dd2ffbf268e0eb6bf134d0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/parsed.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb55bb586541838d262ff1f0b76672371e3d10bd8faa70edd24017b965c3d485", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/tests/common/gathered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9f9bd13003c7ece5676869dbddd7ca40bbac3c6f70bf061e51b63c501c7ceba", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "477126f0326ab9e6eb8d24edb4b7ce9b6839fe2d9f0a4dd174432bd1eb693cb1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_igmp_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "816960d170d2007db75c5f102a0c6b902b7a1f13c8dbae64ff3eef6f534aad12", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3d338c1dafe7ac7345f4873b4cad9582b6fe2ed57741173534c27b20c102de3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da2d3c6a94dedf46eac0de1796c7f1d5986cf601301bf74bfbc07ecc725d4acb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests/common/common_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24856a2b59cbd60a52395079480adfd6d743aeaebf8925babe4abbe983b463f3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests/common/misc_tests.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "768466c2af62583155d9c6cc748cdfee3e74cbf6eb762cfd78620ea452f83ad2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests/common/common_utils.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "29fe147eaf3150bd0b296e9841b44d4e1430fb42edefe1b23869a3a998b7eb6d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/tests/cli/misc_tests.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1287bbc7858072d49553e5ee51b5987205bd02bbc0bc46eb8b91242c75f66d86", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_smoke/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c4f2f496fd21184c60c4f446df594b5bd5fe15fb5316120ec0f37adbc2578ef", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/platform", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/platform/n7k", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/setup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "758a1db808e54b9cc68e10f0dc15b164baa8b51aafa6b9ec9dd28fb6c7656fb3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/cleanup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "572b6ae95bc409ff17d23e74b93167263cc803e52e5ea0d23c1e0cb93c3ea255", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c7e0974a1570ff7124047f5feb2e03b53f08e226c60f3a2e44abdac72eb49585", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_overlay_global/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6511d33a074690c715c8e24b36755f15bc4d002e1c17c71f99321ac2a4c05c7d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_rollback/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ee52797ff8b5825dac2cc885a5e23c5fe8d167a7fb5d5f90afb6545f281dfd0f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tests/common/purge.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "66511fa22e63dc704eceb2ea1a9227c56d8b54e53b46f3a4eb06133afca5254c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tests/common/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1195987bac1460b6079cf9351c2cca7cf10ad454329564d0ed7ad7dfb902936c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/tests/common/net_logging.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f9a396f387812492a3435cad83964bbb2acd67f2dc6a9b8b7c593a09792a7ae4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_logging/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96ef5ee1eade8b1559c19d46c735544d897ec77488cf5dfac3f603f321640a95", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_password/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03a7b7b0fab6f1ee4bc2c331cb6809392b7ac78396cfad2b8d2cb36551f173f1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_interface_ospf/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "415154a2ef9936f47fb59544d6ef8b6e6e8fa20d2f0bfd0643ef5590fcb425a9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0959d2d1e63a624ae37aa49e4da696342711d247cc1883691c06a94b47de0fd1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e5c77855a424301d8fb2293bb1f2c9315e52c1f0957f662073420773dcd835f0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a945f32142bde2f57222243442c3ee1e0d714ea2ddff0517dd5adfdd514ed401", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b8335b5f370611e94746fc1b1abb73b73140da70ab05bc43e7c11ca74f3961d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "663bbf2d37b212c99251b381ab6e9f9c18b36d64967b15bc728b9563d0a473ab", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "acc4147b980614a0f68e42a963461efb62a43ba6c453f668984755e7fc7b491d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "25070a7cd20c7b2a7d0d0ca3050f492d340a44630627cac59eac5d8e28c04d5c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6c11e50372fb4ffa474f25dc279f9f6abcf92ac84f94f331e54eea10af7556fb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f900efabd6e4f58851b6bc5f83e69fbf6432f8067fd17458d30651e5cecd0a67", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "77ba55aecf8a0847e4ad84a2fd9999ecea0a5c69461e0305dd0e6c323bd87d3d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b708f27b4d90d29a864c216b202a4c913cd1358d287444faf971be8abfc8e8d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c82049d3f6ce4ec3d44d04770d4cada1a0d9ebff0aa050b69e93e7a2d4a712ed", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lag_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c20db4ae119778afa8a39b9a4fff5bc78c43ac6929de48b42746b9d8835ec831", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b70c1645ff79d82d3c7dd9be5ef57e61423a2b3013078e6de7a8cf4715c96de7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/fixtures/parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c64e3cd5f5a6972e0d6e43dd6f94e00a6688cab1b65492da4dea43624cde526b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b9d4c293ea9be09062f65bf5a818b6d1d4ececbbbb96863fb9be7d7b4b34170d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aa8b405524e0b0b013d3d485db61a01bd113429d3a6ab88ff9a5ac831c83ba3b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb99f2e41d6e1854e2fb7515d86e12cc196267572df04ece580a1b4e3a5b25eb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "71b613ae2bd9e8eeff08c8ecfcffc55b709f45459a5fdba15afa4da99120dfbb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "54499e3674c14b010c1ba32e1fdde06fa205081c4d5e40abdc8a7ae16ac4d7ee", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/deleted_af.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "94b9a0c4174573834ebe66a9c5aa90bdd00fbf97612f2c12a22ef651837a8e4b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aadcda70bf60adfcb1adf8973455031b31290c4891b5d7936d10d16e1f39c4b2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "55861d84a13db4c5fedc564b4ca082a9538bcadc802701daafde0721988b0546", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fe7be0ff4f64ae4c2fde3d3038b2ba52d320221a4b14dbc27a28e303c212b1a5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c061ef95b45dd5468ef4ae3f7e8e106b245c1af541fa62318cf3f2cbd002eaf3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/purged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7396eaa81ee431d22df03fbb88aebe0e617da4011ba253699cef7e9c3340a0e9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/tests/common/replaced_af.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "38478d4e942cdeda4536a2823b3c1426bdbd5adbc85f746bc4da0ca61c067ad5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_global/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "935f8c36a464a7fc1a8b85b80e45de97d9c74a43d39b1be28b39490cf98650b7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/tests/common/multisite.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3622e4c0ca58b71e4f609f77ca9eb75d02436a0dbd3bbc8bc3ceb00c3aa2d5ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_neighbor_af/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0959d2d1e63a624ae37aa49e4da696342711d247cc1883691c06a94b47de0fd1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "48bb885852dbc0567a4b55c2ed2d013b82cf030ed5da72cadcc429d9791d7d98", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1068bd0101af21a0c5919af891954baeb64f8e9c15ce2000bd595c4e1bdb10df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2d08bf205b05a3fa33bf7f7312d830e5649524c69095e72ec723edeb7c24aed", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "be4768ac76072de82b9b62c926c5029e1a4692bc254a98204d7b934988495f72", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3d0d2c0f14e0166028e145e6708d0d2385320cbb8b163a4ba849285d43d4b075", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7b4c722273eb0c5b17c6199419850aeec72aa8842ebf9752df472c65358aa0e0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6537de02dc2aa5d0d0e15aa9af994371ebb5b2b1d8ce95f1d58d27956ec868f4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "394a8fa5c7b6686d00db1e3cfbda3b99bac6f081f5d8ddead254aadb16fc130f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d0f3024c5508bf66167cd40f8e888602d944f34d98e126b1207fe0ad98787f24", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6f75bea19bed5ade06755ac4cb050971c0acab05e17fefcc12fa32a9ca6a85eb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/tests/common/configure.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c4aec47ad268e47f77eacfa60a8c5631433a1965891ec4420f2ca9052670a6e2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_pim_rp_address/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "75de8512353bc1b6e30d1e9990748e8aa43d4947eb607257be15565e6ae1e5fc", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_traps/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5495873c3c3c49d12637f911af2b9b986cc442247efdb28f0937ccdd51ca4bfd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fd7c54f1024b3dd303106f8aa91a3b4a7cc3ebd0e4e2bd82b618baa5809a3830", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c434f29170fd86cd13c1317a700c6ee330606ccce720dcc06d9bc561db37e4c1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d6fc432f51be7924c046a143a2b40f4a7849fb05689620352aefaffa2e727187", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6c71ed163db6cd5f8986fe2cb323312801b4837ac770178d135d80f9d2f0e76", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7b1f22afa10893e688abf6f293ee21d7c1d842cc22dcdcc1a9270f5a6842fe5a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bb801d88f3ff822a6b991c70a1def9f09dc959771721cda64cb80608296dbc3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e80c2aaa12932f14e24d066db9251949ec5947f338798cd0c1e5710ca25e870e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "11717c939bf44828e88281e73bcf328dd449e919455970a58ee8e4fb6c2f92d4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9001b9bf27bcc0a91bc2bcb3db862d0d509490e08f5cbb37f8024e3f531fb704", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0231447f0dbb3cbd99bcd2434cf925e7b47e130bbceddd72caebbf94465bc2b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "376eace2b83751a4af22bb1b81ca44caf06e0248d54178dd5846bd2dc082975b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tests/common/tacacs.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a7d7bc68b73bcd0e38b9854790d836466fc2f7f7b01d8f6b389c685c2797f16", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/tests/common/radius.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "75664a0cd1d2c4fd3a224433c945ce2536e87ac548c1f6dcd558ef7ef951911c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "415154a2ef9936f47fb59544d6ef8b6e6e8fa20d2f0bfd0643ef5590fcb425a9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0959d2d1e63a624ae37aa49e4da696342711d247cc1883691c06a94b47de0fd1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4ff1783f82563a6c14293e0c0e77331c291adc98f1b32ed2101c93f97a6ff993", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "546783ee328305a1d25b609baf698a17d4216375822f05dbdd4e26c772e2fa93", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c72a6a20b5f1f9862b20da01e465b878a6ee30026552e1f20228cc7dbfc86ded", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de7275ade4ca34153528d80de0739c76376635563e227ee2f6741376c014c384", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "57a34d74121d9e8f4313df46ef3763a66d8418769c71265d642312b7bf6c1c92", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c299ee367f663c29faeced69817f7d979f4f5867b37fe2ec3fee11cb0d6f8382", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8589426bb34df90d16b1178c1541541046114f6375c33b472228fe5a9d7290aa", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2be5f36d35465ad362b492591f202f6e6dd07a33e032115a428c85ce4c6f5d2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f5367a939db5f6302905f71a16e1b8145c270b573a1f57e585f1c3079214863", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49360048ebf145c4ba906bb5a71eb9b4b9c88bd4f7a0ebd4df0669ae17e0c5f1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "89cb80b41dffb5b3632dfb19574e36b03313324859e69743aa7e9957edbe76d7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lacp_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6bceb59e0ca5c61505cf242f54f76e57093a670a2d91de88579a69d3af7e60c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "235cdc1feba90793e22aa2151e96f94ded9bfda265b0f92a5b4e613e1efa985f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_devicealias/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37bb266ed396b0deedfadc54a835f15862266232e9148bbebf537367a72fbba7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "98c2462fc70b1e381dc642c67363d6f328fbea921b50ae7ce4d99834db502e2d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e7e58d923c516965ba91007e329d12c740570d0a527c2f4b8da31c60a4762efb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/tests/common/multisite.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5f7d6ab2375cc5aceb4d98ecf2677a93cf14c88aec7fe680ff0c1b665fa63c77", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bgp_af/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a64cdc487c303db6ca15068fae8a0f1303e739903c53f62cf4d208fbed7c6820", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_bfd_global/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "20f59d65f363d4c379cd2c51dcb40f993e78c195f6f6a108101a835228b3c5d9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_hsrp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f4efd3466634137f01a7b06dbb47ad4cb69e2eed6df6c2e3b6ccb5a8abf39797", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2c54151fdb4ac522d3d61a0163ab0352efd067c656601888ea1ee7b6808be82", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "46e57df09d074500a41f8257b648ea4f94a356ca598be55850d7cf088a3609f4", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/fixtures/parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4c466d2e90eb2497cd8fd4f02e070c742a61f839c333a62303e1723c1d3f66c5", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7241e91b63816298ae5262f7e3b9dbb682381f51927590dcf97e1e725453646", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "65223dbb6d068a911ae831982a19e0b8c38168a1339a74e237ecae6165e7dcca", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bbfc4971a58dc25aca7c2fa854f3cd7276a4b316ee71bf018aae90d15f264cdc", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "47054cc3071b5bc8ff7d74099954ff698d579763aff56c7273419037084772c8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24d98d5ac1db431364338be04332a1c9e35c760ca565e51c8ddd0378875a8f29", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e68f575aa38a23920edb9d472c1893164a7f34673405c0415bb3b808ae9c0f2e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f1f1af3c76860c10fef17e96046338f7e56fce582eaff7859feb8b617adee19c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96312fdf9edd21ec6385df8cc5d9fd3340eb55ae3d6311e441d1c01fac63125e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f1b39f98a1d553f0413b64ab6250274da400a6241be86d9e6647d8d0f550b342", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospfv2/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "59d618c603ae794e3b2555044e00a2f5d08f23a620fedf43e516c2c81e64b951", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "126c357f960d8408c7d5e4c3bdc05e2e5e898330e173a4f56f72240f10aae4bb", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d303180003e449e35b98c228f21faf24afd112cf4b23b64d7c0f26c060dfc773", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_banner/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4fc154c6e192340c7c8fde5f378e35f2715bec51b4b96a2fc760cf4b2426a795", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vtp_domain/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "60268e31b9bdc122132df2d84e14bf372032393e51a564fcfafe6b500c1f9964", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1d1c9e8cd338fe29f3b793d42514fedb5be104255b4b97039e3ada0640c281f7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_location/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tests/common/agg.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ac4bc419faf2c3b5a6dbc2203caab4dec38797cfc7aaf6e10827a8428217c347", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e60e8c37893803319fffb76f7f65087371dd08878e218648ec3463e225611033", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l2_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/platform", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b3d70579bb8d6dc475f49a395110ac41cd3459f47369325d02655e44bc3085c3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "572b6ae95bc409ff17d23e74b93167263cc803e52e5ea0d23c1e0cb93c3ea255", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7ac7324045a89a2484fd521c367ed7fa6a83a821a04fe490c842f300c3282395", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/tests/common/multisite.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2c604cb3a7885ef406b5e0cad4c22e1f78737ca70a263203b144dad6dddc672b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vxlan_vtep/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7e12eeb7992e43e3478bdbe7998bebfd1765eb966293ae8cd0a9b433f0c9af6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ac196e55bc80cba08a1cadef71a151160e493ce9cb00cb3ae12e88cf83664c47", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7d754db246e92eda93bade9b741e09afdc7c5ba2754a4ea5d874f92a479b65d0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "14c246d4baec930ad3e9d8a38db16c6dd1abc414ba16fb969043af9c1ffcdfde", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/merged.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2764d0686b6d045c5de66dc3214bb542d022bf0e7fd906298f08c252b1051e0c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/overridden.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c73048d855cbb3aae315d0f6ae7314b020ecbaea5d15e600bd62f65d7704edce", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/deleted.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de4551a69555a489408abeaaef92b874844850f80ecfdf5745e0396df8d800b3", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "99dac7db446b681d2fa8718453fd8564c4f66277c81ddff1585ea3373200a44c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/rtt.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2c4a3c38cc68f8de74ad85bb155d4fd3426e55c4a5b71b317d02bcf8510f071b", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/rendered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "04d951b55ad79acb7b615a9c1e5a2e76379a14bfab30c3297ad6290cc5126f22", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/replaced.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92fb7f63a6a328fa28d035080ded792ed4ceeda49a7bc99577231a2236272b58", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/parsed.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5aec19be4bba22c66f66e41d2d12c6ac01048ec41c4d215a30b0af7f7e2b4566", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/gathered.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4782c50e81bcba1d4de70affb6f028f34e4147ee6198e1866fae864815249ddd", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ddbe91d5578423ebc8ba2b7928a19a878e84f41d4fe69e17bfe72abd29bcb9c0", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_static_routes/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c4f2f496fd21184c60c4f446df594b5bd5fe15fb5316120ec0f37adbc2578ef", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2bff2a18c137e32383e37b2b85a6d4800764831269fe78de5fe393d799bc8d23", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "415154a2ef9936f47fb59544d6ef8b6e6e8fa20d2f0bfd0643ef5590fcb425a9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ca3faabae4048c5d46bf7f76fa795858d259d28a59555bec6633f1bae13840ac", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "20bf2d47ee7b7682f9017dac437453ad3c99bdf7451032aebb9062688e2889b2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f165ae2217731b40d4eb6cc3e28718dfb3bbb6937babb77b5f35d32daf72e96a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c2eddb9df0529aed9322743cb23c57abae502f468a4336177393ab34f4935fb9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_telemetry/templates/populate_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4f59d6d91f07f67ba4ca62d70c341ad88a4680f2ff9d039bc5be646b86652823", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tests/nxapi/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "322a5d8ff2febd906db189ea15bd4d8afa2c8222c4c325cc41d5a21df06b289e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/tests/cli/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "13b4e4e833d900d1cdfc7358bcb3ce84da94bdc3d1f0e605423e3a6aff54463e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_l3_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d44afe445f7128183f09c4314e7239665cb91fb15176322b802082b5c00df4d7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snapshot/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "276d928d25e3df0ed90b60ef9a48043cb741df458f4d837f4a6a9ed0c4787380", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_gir/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90757dde2e169666e4a992f8207e81eec41fa1a3bffbbc59cf58bd7406392f0f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_interface/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tests/nxapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tests/nxapi/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b7d4c320237b2180ba55585ba455b52d060785f3cf7d2b1fea66880ccac842e6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/tests/cli/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e21e0f5eb7c4a1d0ff0118b58e0ffc01d664d7efd7181b946bd09f4ec7ff58d1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_lldp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6bceb59e0ca5c61505cf242f54f76e57093a670a2d91de88579a69d3af7e60c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6e212a83f10532fcd0d0bc9dd90d37a853885aa22935dd0040b5be18c6897d48", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "459c9db08704b40e2036e72d2ba1a85bac3130f62f9d86b76a3f03dd78903b67", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_zone_zoneset/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37bb266ed396b0deedfadc54a835f15862266232e9148bbebf537367a72fbba7", + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_nxos_tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_nxos_tests/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_nxos_tests/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9232fe344e5b0f862d7239c717f91df5de503d113b2b4be1d7a3565339d014bc", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "78725c535a9c7c04030a2037cd8d6be91d0078240fda3f2bf3e2eaf16d9905ac", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_acl/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58eb62f1f74a13baed8def132bd35676141321ab9c2e78bacebe08795d32523d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "62065316c1339ab3416efa35f30f161900a0a9d0451c239963d2162b3b2d1e41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bd5c8540d76635ebb8740643c1750239f2119f13aceab45a85874bbc87a73ec1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "189122ee0b76fc791179536b2e500f440703f118dc30fff81bd2e38737b2f26c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5477d406ccd46cc332476f7a55f67e63bee5c5625907a54d0e0d5d83430627f8", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/fixtures/parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "336d9be1aac7f64f7cc82330ca1f37fab84e0c2364b53940105f5f620b96cad6", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9a6cbd28c849ff816cca49fe67720b8791e9124a25b015c3dc27888a43d03d18", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "68fcec132c7dd08225e1ec41a1dbfb266a8019756c621e696621a54b72bfb43d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3240e9603740fb36655253227e84dc27544befc8efcbbd822bd1252113a4a787", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/_setup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b29023f2236fd9f05815edd608324d92e13e6e228bca417f0421b879281ed48a", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4235a8bcb13431259c38b23538afca479b7adb9c81226193fb19288d363d3b88", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ced6a52cb7468785c72f059db87cb13881f4cb957075bfac43da62b0cc6b667d", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "38a0d31a15d070d88dbc6aa9ce2a7209a9b72ef2e802206f9d15752430a7c330", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bad798cb36843946507cfee54f2b68e7a86dacf37e90f4e8527913655e3438a2", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/_populate_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aed8f904f4208f6b2198ed4739a1a3cece4bdd95aee8d75d0059d4eba41d4042", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f505e297983932c7f96c1a22581ca35f96a88d1d32f81a29b1697c4605617026", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b92a0fe1c884390b3053dc50bbf11e571b4184ed297fa20ad50a65e196fc857", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_ospf_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "547ce752ed6b0a94eeec78aea96d7322884321c622de5e0a5903d250709e4622", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_community/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "046516c46450fe04c67a52804a9ff9b57b613ec95e366d8a896727785e6abec9", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_evpn_vni/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ba01df9869d6f924d5193f8cc3a7abee978d675c5d3e71b2e3ac792002a6da58", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vpc/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_inform.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "77155d53ff0858cf372770665f2a240a8fd73e8a771834d6d81824de75ed65ee", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_trap.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6af12340ba16eb0c1245f0f6991372888f17691587e2f20795bcbd593e3869c1", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v2_inform.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3e1e883414b96f37169fac465cb8432fe25818d88fdb489ad2b453449e899784", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v1_trap.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "41eca26612b70f47ec22d689ab08c2996f9e6c44c297e1aeccd032702d436fb7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_snmp_host/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6bceb59e0ca5c61505cf242f54f76e57093a670a2d91de88579a69d3af7e60c", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/vars/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6e212a83f10532fcd0d0bc9dd90d37a853885aa22935dd0040b5be18c6897d48", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8bac35dbd9fc74dde4b8ce23394f0264f6931e0bcb432f80083942704f10238f", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vsan/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37bb266ed396b0deedfadc54a835f15862266232e9148bbebf537367a72fbba7", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1462f2318e8838b725f768611186647b04da7dc2db4a88d69c8f5dcc7f0937df", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/tests/common/sanity.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "29e6f35f4bcc9a750d1e50116be9cb060861fa832e55ce00ce8de5c2417527cf", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_vrf_af/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6730ee9589def97082d15b1424719659ce34980524fd79081ebb4e4cb7805e04", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tasks/nxapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7634817ecb02947ff1aa66b9308a9c10256a288d6862bcb726e20926939e1d42", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0541dd367225c538f040167b125d04dca76273f0c53042823d60dec68a9a8ec", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e82c716422654d049fd043bbf84d624ed532f96741e032f52f14c19e970d3e", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tests/common/tacacs.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9e89e75b0c32af2f2f7a8f9ae8ef88d2afaf167d454fcb1d9e08111ac5f6ad41", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/tests/common/radius.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4982c5caed91f58b1e5658d51eb7f66b3ef8bd5cb8531f171dee93ecabf61cdf", + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/nxos_aaa_server_host/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "306ef26bd70b58285bef6b50a83c64b26b9077181c6823ef20ac63252373d5de", + "format": 1 + }, + { + "name": "tests/integration/target-prefixes.network", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6b20244911fa2f808e597950834fbb8092921b97c87496c35755a956faaab50f", + "format": 1 + }, + { + "name": "requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "70053744bf8f5b698f82ad59a6daec106188d9b63c6d1246f860f21ab8cb6ac5", + "format": 1 + }, + { + "name": "bindep.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "80645079eb025b3a905b4775ac545d080a3d7d35d537c31e04f7197c94315ab5", + "format": 1 + }, + { + "name": "docs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snmp_user_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2750d30dc1e0d7b86b7aad5841288cb8cc40b70f99262ddeae5b2dc494ab6ef2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_zone_zoneset_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de4a6bbe2e0985637e7048b17382d4c94674bd8f2b9ccfc506dbb5211765bc27", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_l3_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "93c1cbd53cc7a012683716382c70a8e3ebb2ddb297e2f37cf97a67cb492f1a87", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_facts_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "47cdc98129d0530dc1277823435a976b455898dc1e8994abe326d17c49f989f6", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_cliconf.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ee4d1884481a2213f66c229375103127f3698407b6d653b1455549fd37dee0de", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bgp_neighbor_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3a4acaaed26598c9dc1de74c4dcdd8faf8c7ada736e635e95589fa80e81b6e91", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_logging_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3c09b89eb6f8b5358a49a36822eddee0b96320d6e7cbc1b237d541128723903", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_command_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0318ce8e42cb03acba6a44f4bb99246ae772852ed585154e2e7bc5ce1332f081", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bfd_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "159478638e300cb8f7803a9ea86fa64a90078c6acd7a75ecaf7f8359b955c84a", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_l2_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90effaf856b4df9e700fdc51171a24850da6488f359ef7981c323a8a4125eda3", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49a94d780b98961da33db4d3f79530043aad624c1df5865e72e5c9afcee0df26", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d585fac8ba3aad9149816b736f5217f5f316a77002694e4fd975cf063196b666", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_acl_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "21d7c578a290a8873512004d60d26498cc7b2524be0740f449b332bd5a70871d", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bgp_af_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2a01d25edac5b93a6b438694667f658ece9b4042b68de779cee6758ef2c56928", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_lacp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d89a3ef5f1a949512193d58fd5e39bf70f38433a7cea51b1e6ba36fd0ea6ca24", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_igmp_snooping_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "63bae70ffb866bce60d973fee29defce9798e5c2cdf863d1417f29ed9c282191", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ospf_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9e236bb5396bbfbd4ff7c7b9281e9c2c7edf492f987cf4ca4692c20490904fb5", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_config_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7064e5c28feabc75f935a37a489468cb0f268b70eb0a602f261451c2300613d2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_lldp_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1abdc1d00d4653bdc9b9d9377d27831a78c468556f95cfe0db50ea8f2dc84d36", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_rpm_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "044429a23ce412be97db598b01538e24a986ac5f84a22a5bb7ae7f1fea963c8d", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_l3_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3b177e1340448bf65b009c315a810616084b40826db091d9cc7041b07647296a", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bgp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "437d2bcbcd9c71253de21841fecbbf791e276115f6f87d6a919c4830b42fde96", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_l2_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c063baaf7b1e776d02154c00a2d06d6f20095bcec099b9413f88088e523e1904", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ntp_options_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ea402be44ed256047962e61f337df229b4c8e596a65f24bce9060d24a6869461", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vtp_password_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "10d2727c8412a6947ba5bc2750da94612d6495c377d5d76fb31e852b5036ff09", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_linkagg_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9d358c37dee2fafe8e07abaa42ab54938fa6fb1e2b1b7697b90b62edf8dbda06", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vrf_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a105a083464a8734cef8b10fde91f9bd42c6c28c5f16d7a8d1f8542d97e7efe2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vtp_version_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3b7ee70c4d17a000dcd54900ea1fa21560727a3cf6b91f746d313223f048e82b", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_evpn_vni_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fc46c7b2249f07bdab2794d7794288748a8dacdbab59d56dd12134a3bbbf3d66", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snmp_contact_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9223b7c81ba05125275cf9ed992fa4cf5b55aeef1afbf45afbf9713f09858a4f", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_lldp_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9adb5b97bb4839417799bab7f6b15df3d5b0b60b566ec5c71db71423f268094", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bfd_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "727d5851bf0e0d6d308930a05ddbde6fb293fe3ac624df3eb94c6e1a813fab9b", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_nxapi_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d75ea167db35a4a61f42af2422bff71ad7a11191adcc0c79f0ad1b52623b30fe", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ping_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bf53f0026a4f9f6f93a5c72bbb931d0486b2faecfa919cfb47318dc7cdcc744f", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_gir_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2cb05d1f66f878da1439e0348356d69586d24f4f4024e4c9c80bc22daf4568d", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vpc_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4477045779492e8d3b68da0c4a6d56d0d46a535178b244791f32642b1f9215c5", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_gir_profile_management_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d428b41657847d9f5bf2b88aa2dbd67f3afa73039a00e40caa3907ad05d090cc", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_acl_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9033b8a227a66085d622ed7d05904aa6ac4c027f01f8c3e972238c3d77f9bd80", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_hsrp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4d11beab59b2b4e747c293ab76e87367e6f59709496428b401a82079919cea86", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_interface_ospf_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "80ddb663dc3dbbcefb9d1c63f9cb58e484f076846578839b78c0c48f16def6c9", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vlan_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90fed8382dd9dbc10a73c86a21a36f48d52f027603d31c3cd4e0cf9121129bd4", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vlans_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "81dde803f7ecbfbbb84b59b745c4f15bcc92f78908adb7fd5c5fddfc046982b3", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_smu_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d1221ab6ec6cc297f1a35e9bb0bd16f54122e6fe82e350f847d3faa2bc16c88", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_udld_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b673d2ac12e941eb409aad70bcbc7e4d54b510dbc26847ae0d1f8e5f05537186", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ntp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "463f983982777e95a7555896251c083d8316ee6b789869db4f35f084d501f767", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snmp_host_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0dace694270ec54720f99fca002cf5901c4a96e100faf4212b3f1ca9ece3051d", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snmp_community_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c703973d8aac688ea5dc4093d6553504b018859c2764a81d3f75189173b5c13b", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_install_os_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c1879aff36faafdad68bac647ffb2bf73ea5d2795fd50a0a299274ee05276295", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_pim_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "71bd173d5077b51850992732a9da483f922d2c71084dbda061502d4e36494180", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_aaa_server_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e22518f87ceb44d3196352cb6a22f95aacc00e80b6555ed777d9f20e76b66eeb", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ospf_vrf_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9b777893691522c8e0e18f0179fdb6b14148edaf5fd32a5ce7bc976c227ce47", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_lag_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "00d2516e68bdf58a3da5e800eac55de0244bdad1027246194787add7c663b707", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_system_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "364c81d6adc0678a8d6dc6861591eec257c077482b18ecebb136bac57824d1d1", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_aaa_server_host_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "09656a393002e4043ce9f716578405de068cb7d9110561e0147d5d29876672c5", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bgp_neighbor_af_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37d43644a8f0d7e276bff0d9b7f1c2fae2224402582c846512406d1689db120a", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_acls_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1778e2ab5028be7996b22085033baf1b8a08d593c913c138fcae42fa706b3696", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_hsrp_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6a368625f3d765264c9755a62330832786ba9312681a3e040c19e9a618461352", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ac4ad6f21cd7d047a74f3a56edeab68c856484cf76dae0341118f98be7598dc1", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_acl_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c875f695e34c466622e1cb3df52eb8ec6c8557cc5f6968560142ec7540302f83", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vrf_af_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "63594514de7b1163cbf03abb3720c8bd878c4958c56580ab3be76f5acca80b94", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snmp_traps_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "21509330d8b42f2b9db1a2593ebff5c3f546c39ce34ba561592aa66b770eda6f", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_devicealias_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b489fa696669353aa72a6da03fc9995e88249c201f04b04c9734ed6399e87a34", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_pim_rp_address_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "034463f95105f6ff1fff14dc110fc406c3ac31687d73913113b3a33cce64e76a", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_static_route_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b68e909daff45fb89b113f89e03fbbca5ba8bcf8c2f24ed60ef2767236f08ffd", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snapshot_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d935e6087b9783f77b89edc6e14f38bdfae9786925e4e0b34ec5730a1e49b0cc", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_file_copy_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "982469ad3f9e7a4e506e205158cd595fed52451b04802749dfda96b56e6c338b", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_reboot_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4173cea32f08491ad0b92abcad71efeb26e541b5b4f8afddb3dfdb1fa8b91b1f", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_rollback_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "553846d61250712d2e0cf56df0ea690be09358739bd222c896a1ed466bae6ef3", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_lldp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb32e0bf75ff6bfdca2ecf95823018e05ee3936a6b20eda32d85a1f5a44cd2f9", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_telemetry_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c869edad07972c9fe2be1afd123a2056356c4188159cde254b7559cd4c301ef2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_pim_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "294a201a9e459e6487e5dd2bd9a1cf1327f307709e912d5b9317d0ca75dbc313", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_static_routes_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aef4c616f2d5bf52b3f45bc2ccec0d1ae896a8a2816edede8c3a1ccf8c32ff58", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_lacp_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "320739c6715b6f8e8ba3a91dfd70e58c8493a3d6020c432210f58bc48741af09", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_igmp_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "31ec59f5bd20c7197785db9addb91a31649fa983f44dc9b963f4106b79d5293d", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vsan_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "359740199327bc19f9c542c4aaa0c364099fb905d6a65fcb02e650b88c841ee7", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ospf_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ba29348c574433e69f9d66bdc9be4c0dbd30e03f0eeb7bd9063fffed1ae2ba82", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vrrp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "720f4546eff10cc803c752ae87e2de1de1db31aac1eea62e477f870ac5c4b229", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ospfv2_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "188eb0cdacc2d4c5f876e0006eca93777a8d01265c3dd7daf6181cd98bfdfed3", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_feature_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2e9fcb9a07068537f7a2ca62a6dec24070c41a4078dc5a35106e3298ab1fd2e2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vxlan_vtep_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "51db1e5d2ce2fcfb3f1f582e46d4998221902e1aba8da97766c79350a4c0bf9c", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vtp_domain_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eee575ebeb416e812b8e09318ca053ba2e44e66748087b87a9d2b131d47fbff4", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ntp_auth_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f3c43410432cccdaf4674242e78453beec7fee43961c9d10bd20d26711b51277", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_igmp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b4238689ccadf8e9095fc17090d7614390cb0f0191aa701fb8ae0f7bf5ceaebe", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_user_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "531a43cf9135319851f2bc470bbb44116f2b605dcb29a3bffa54c990b4a5dcc0", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_httpapi.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "75d17fdc74db57a5df6a56beb6a0cf6a2aef7ac109e4a457e1d8c2294583d3bb", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_overlay_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eb0c8c4f9b6f52364755e9a6f1f7ba96911882317941b86f4ebfbd2a3179af73", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_evpn_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3312acea60eafaa3be4db57ff5ea9a782813dee5ec0e5aa5d0da2c507a87db5", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_banner_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a628ea0a5c9bf9b7e9685f03ebd479575d15862887f9c3c5c114a93640b09f8", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vrf_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "81b388984dcecf9e08477eef5e5f4477b8531acf6ee23464e26b93b2b95f42f2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_bgp_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5213ba9da30a19e573d272a655b2353e16e2977ee7cbeedf5fb229ed1963517d", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_udld_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a88627fc94640a7f8b507231d5352b99281974539041910a5957dd7b9f0c3abe", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_vpc_interface_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1f47ceac9a2515a52ad5da14dc42777325e362274c7c715d6e6767feafaff5b2", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_snmp_location_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "91dbef5dfbb5450adfed52274f2de2597fdd47d59175950cc94fe4cae9d01c8c", + "format": 1 + }, + { + "name": "docs/cisco.nxos.nxos_ospfv3_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "acb4ca5b6d3dd239264026cd6304b5fae733f04b4e4596898622da6a77ed7009", + "format": 1 + }, + { + "name": "README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6e88bd6957bb834246061f625699179e2e6c17a8a000e7bb38472d01d1fcbdab", + "format": 1 + }, + { + "name": "changelogs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "changelogs/CHANGELOG.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b27f0965aeacbec6a29458a4388e7ffc1a9139ab6bd1062f92e50e5f31b19e4e", + "format": 1 + }, + { + "name": "changelogs/changelog.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "991ff70ef9bdc99f95f81cc105a8e77e5a31f483966d77f6c18ca8069812f0c1", + "format": 1 + }, + { + "name": "changelogs/config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "35e16cb0cef6cd78082fb011892714197344b4407b742104b065efe6f669f2c1", + "format": 1 + }, + { + "name": "LICENSE", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", + "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": "0df347e631fc902c0608323ab75000c9536b2ce92e1574eda7b187da4fdd3f1f", + "format": 1 + }, + { + "name": "test-requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2bf5dba4c2c0732ba3edd555f460f967699e574a3cf11f5b4dcc92ae890a0a02", + "format": 1 + }, + { + "name": ".pre-commit-config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a571fb93e577613f6f7bb86402f5caefeed26d2399211cfad69aa2354427fedd", + "format": 1 + } + ], + "format": 1 +} \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/LICENSE b/collections-debian-merged/ansible_collections/cisco/nxos/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/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/collections-debian-merged/ansible_collections/cisco/nxos/MANIFEST.json b/collections-debian-merged/ansible_collections/cisco/nxos/MANIFEST.json new file mode 100644 index 00000000..bf162ff3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/MANIFEST.json @@ -0,0 +1,36 @@ +{ + "collection_info": { + "namespace": "cisco", + "name": "nxos", + "version": "1.4.0", + "authors": [ + "Ansible Network Community (ansible-network)" + ], + "readme": "README.md", + "tags": [ + "cisco", + "nxos", + "networking", + "nxapi", + "netconf" + ], + "description": "Ansible Network Collection for Cisco NXOS devices.", + "license": [], + "license_file": "LICENSE", + "dependencies": { + "ansible.netcommon": "*" + }, + "repository": "https://github.com/ansible-collections/nxos", + "documentation": null, + "homepage": null, + "issues": null + }, + "file_manifest_file": { + "name": "FILES.json", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c2d6ef8c90b251b7728d54b245e18eb60dff74376e9938a63717a0c61da83d58", + "format": 1 + }, + "format": 1 +} \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/README.md b/collections-debian-merged/ansible_collections/cisco/nxos/README.md new file mode 100644 index 00000000..84f38bb3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/README.md @@ -0,0 +1,220 @@ + + +# Cisco NX-OS Collection +[![CI](https://zuul-ci.org/gated.svg)](https://dashboard.zuul.ansible.com/t/ansible/project/github.com/ansible-collections/cisco.nxos) + +The Ansible Cisco NX-OS collection includes a variety of Ansible content to help automate the management of Cisco NX-OS network appliances. + +The Cisco NX-OS connection plugins combined with Cisco NX-OS resource modules aligns the Cisco NX-OS experience with the other core networking platforms supported by Ansible. + +This collection has been tested against Cisco NX-OS 7.0(3)I5(1) on Nexus Switches and NX-OS 8.4(1) on MDS Switches. + + +## Ansible version compatibility + +This collection has been tested against following Ansible versions: **>=2.9.10,<2.11**. + +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 Cisco NX-OS collection supports ``network_cli`` and ``httpapi`` connections. + +## Included content + +### Cliconf plugins +Name | Description +--- | --- +[cisco.nxos.nxos](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_cliconf.rst)|Use NX-OS cliconf to run commands on Cisco NX-OS platform + +### Httpapi plugins +Name | Description +--- | --- +[cisco.nxos.nxos](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_httpapi.rst)|Use NX-API to run commands on Cisco NX-OS platform + +### Modules +Name | Description +--- | --- +[cisco.nxos.nxos_aaa_server](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_aaa_server_module.rst)|Manages AAA server global configuration. +[cisco.nxos.nxos_aaa_server_host](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_aaa_server_host_module.rst)|Manages AAA server host-specific configuration. +[cisco.nxos.nxos_acl](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_acl_module.rst)|(deprecated, removed after 2022-06-01) Manages access list entries for ACLs. +[cisco.nxos.nxos_acl_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_acl_interface_module.rst)|(deprecated, removed after 2022-06-01) Manages applying ACLs to interfaces. +[cisco.nxos.nxos_acl_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_acl_interfaces_module.rst)|ACL interfaces resource module +[cisco.nxos.nxos_acls](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_acls_module.rst)|ACLs resource module +[cisco.nxos.nxos_banner](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_banner_module.rst)|Manage multiline banners on Cisco NXOS devices +[cisco.nxos.nxos_bfd_global](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bfd_global_module.rst)|Bidirectional Forwarding Detection (BFD) global-level configuration +[cisco.nxos.nxos_bfd_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bfd_interfaces_module.rst)|BFD interfaces resource module +[cisco.nxos.nxos_bgp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bgp_module.rst)|(deprecated, removed after 2023-01-27) Manages BGP configuration. +[cisco.nxos.nxos_bgp_af](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bgp_af_module.rst)|Manages BGP Address-family configuration. +[cisco.nxos.nxos_bgp_global](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bgp_global_module.rst)|BGP Global resource module. +[cisco.nxos.nxos_bgp_neighbor](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bgp_neighbor_module.rst)|(deprecated, removed after 2023-01-27) Manages BGP neighbors configurations. +[cisco.nxos.nxos_bgp_neighbor_af](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_bgp_neighbor_af_module.rst)|Manages BGP address-family's neighbors configuration. +[cisco.nxos.nxos_command](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_command_module.rst)|Run arbitrary command on Cisco NXOS devices +[cisco.nxos.nxos_config](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_config_module.rst)|Manage Cisco NXOS configuration sections +[cisco.nxos.nxos_devicealias](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_devicealias_module.rst)|Configuration of device alias for Cisco NXOS MDS Switches. +[cisco.nxos.nxos_evpn_global](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_evpn_global_module.rst)|Handles the EVPN control plane for VXLAN. +[cisco.nxos.nxos_evpn_vni](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_evpn_vni_module.rst)|Manages Cisco EVPN VXLAN Network Identifier (VNI). +[cisco.nxos.nxos_facts](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_facts_module.rst)|Gets facts about NX-OS switches +[cisco.nxos.nxos_feature](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_feature_module.rst)|Manage features in NX-OS switches. +[cisco.nxos.nxos_file_copy](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_file_copy_module.rst)|Copy a file to a remote NXOS device. +[cisco.nxos.nxos_gir](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_gir_module.rst)|Trigger a graceful removal or insertion (GIR) of the switch. +[cisco.nxos.nxos_gir_profile_management](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_gir_profile_management_module.rst)|Create a maintenance-mode or normal-mode profile for GIR. +[cisco.nxos.nxos_hsrp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_hsrp_module.rst)|Manages HSRP configuration on NX-OS switches. +[cisco.nxos.nxos_hsrp_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_hsrp_interfaces_module.rst)|HSRP interfaces resource module +[cisco.nxos.nxos_igmp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_igmp_module.rst)|Manages IGMP global configuration. +[cisco.nxos.nxos_igmp_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_igmp_interface_module.rst)|Manages IGMP interface configuration. +[cisco.nxos.nxos_igmp_snooping](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_igmp_snooping_module.rst)|Manages IGMP snooping global configuration. +[cisco.nxos.nxos_install_os](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_install_os_module.rst)|Set boot options like boot, kickstart image and issu. +[cisco.nxos.nxos_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_interface_module.rst)|(deprecated, removed after 2022-06-01) Manages physical attributes of interfaces. +[cisco.nxos.nxos_interface_ospf](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_interface_ospf_module.rst)|(deprecated, removed after 2022-10-26) Manages configuration of an OSPF interface instance. +[cisco.nxos.nxos_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_interfaces_module.rst)|Interfaces resource module +[cisco.nxos.nxos_l2_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_l2_interface_module.rst)|(deprecated, removed after 2022-06-01) Manage Layer-2 interface on Cisco NXOS devices. +[cisco.nxos.nxos_l2_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_l2_interfaces_module.rst)|L2 interfaces resource module +[cisco.nxos.nxos_l3_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_l3_interface_module.rst)|(deprecated, removed after 2022-06-01) Manage L3 interfaces on Cisco NXOS network devices +[cisco.nxos.nxos_l3_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_l3_interfaces_module.rst)|L3 interfaces resource module +[cisco.nxos.nxos_lacp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_lacp_module.rst)|LACP resource module +[cisco.nxos.nxos_lacp_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_lacp_interfaces_module.rst)|LACP interfaces resource module +[cisco.nxos.nxos_lag_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_lag_interfaces_module.rst)|LAG interfaces resource module +[cisco.nxos.nxos_linkagg](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_linkagg_module.rst)|(deprecated, removed after 2022-06-01) Manage link aggregation groups on Cisco NXOS devices. +[cisco.nxos.nxos_lldp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_lldp_module.rst)|(deprecated, removed after 2022-06-01) Manage LLDP configuration on Cisco NXOS network devices. +[cisco.nxos.nxos_lldp_global](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_lldp_global_module.rst)|LLDP resource module +[cisco.nxos.nxos_lldp_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_lldp_interfaces_module.rst)|LLDP interfaces resource module +[cisco.nxos.nxos_logging](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_logging_module.rst)|Manage logging on network devices +[cisco.nxos.nxos_ntp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ntp_module.rst)|Manages core NTP configuration. +[cisco.nxos.nxos_ntp_auth](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ntp_auth_module.rst)|Manages NTP authentication. +[cisco.nxos.nxos_ntp_options](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ntp_options_module.rst)|Manages NTP options. +[cisco.nxos.nxos_nxapi](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_nxapi_module.rst)|Manage NXAPI configuration on an NXOS device. +[cisco.nxos.nxos_ospf](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ospf_module.rst)|(deprecated, removed after 2022-06-01) Manages configuration of an ospf instance. +[cisco.nxos.nxos_ospf_interfaces](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ospf_interfaces_module.rst)|OSPF Interfaces Resource Module. +[cisco.nxos.nxos_ospf_vrf](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ospf_vrf_module.rst)|(deprecated, removed after 2022-10-01)Manages a VRF for an OSPF router. +[cisco.nxos.nxos_ospfv2](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ospfv2_module.rst)|OSPFv2 resource module +[cisco.nxos.nxos_ospfv3](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ospfv3_module.rst)|OSPFv3 resource module +[cisco.nxos.nxos_overlay_global](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_overlay_global_module.rst)|Configures anycast gateway MAC of the switch. +[cisco.nxos.nxos_pim](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_pim_module.rst)|Manages configuration of a PIM instance. +[cisco.nxos.nxos_pim_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_pim_interface_module.rst)|Manages PIM interface configuration. +[cisco.nxos.nxos_pim_rp_address](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_pim_rp_address_module.rst)|Manages configuration of an PIM static RP address instance. +[cisco.nxos.nxos_ping](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_ping_module.rst)|Tests reachability using ping from Nexus switch. +[cisco.nxos.nxos_reboot](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_reboot_module.rst)|Reboot a network device. +[cisco.nxos.nxos_rollback](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_rollback_module.rst)|Set a checkpoint or rollback to a checkpoint. +[cisco.nxos.nxos_rpm](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_rpm_module.rst)|Install patch or feature rpms on Cisco NX-OS devices. +[cisco.nxos.nxos_smu](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_smu_module.rst)|(deprecated, removed after 2022-10-01) Perform SMUs on Cisco NX-OS devices. +[cisco.nxos.nxos_snapshot](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snapshot_module.rst)|Manage snapshots of the running states of selected features. +[cisco.nxos.nxos_snmp_community](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snmp_community_module.rst)|Manages SNMP community configs. +[cisco.nxos.nxos_snmp_contact](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snmp_contact_module.rst)|Manages SNMP contact info. +[cisco.nxos.nxos_snmp_host](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snmp_host_module.rst)|Manages SNMP host configuration. +[cisco.nxos.nxos_snmp_location](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snmp_location_module.rst)|Manages SNMP location information. +[cisco.nxos.nxos_snmp_traps](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snmp_traps_module.rst)|Manages SNMP traps. +[cisco.nxos.nxos_snmp_user](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_snmp_user_module.rst)|Manages SNMP users for monitoring. +[cisco.nxos.nxos_static_route](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_static_route_module.rst)|(deprecated, removed after 2022-06-01) Manages static route configuration +[cisco.nxos.nxos_static_routes](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_static_routes_module.rst)|Static routes resource module +[cisco.nxos.nxos_system](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_system_module.rst)|Manage the system attributes on Cisco NXOS devices +[cisco.nxos.nxos_telemetry](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_telemetry_module.rst)|TELEMETRY resource module +[cisco.nxos.nxos_udld](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_udld_module.rst)|Manages UDLD global configuration params. +[cisco.nxos.nxos_udld_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_udld_interface_module.rst)|Manages UDLD interface configuration params. +[cisco.nxos.nxos_user](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_user_module.rst)|Manage the collection of local users on Nexus devices +[cisco.nxos.nxos_vlan](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vlan_module.rst)|(deprecated, removed after 2022-06-01) Manages VLAN resources and attributes. +[cisco.nxos.nxos_vlans](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vlans_module.rst)|VLANs resource module +[cisco.nxos.nxos_vpc](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vpc_module.rst)|Manages global VPC configuration +[cisco.nxos.nxos_vpc_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vpc_interface_module.rst)|Manages interface VPC configuration +[cisco.nxos.nxos_vrf](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vrf_module.rst)|Manages global VRF configuration. +[cisco.nxos.nxos_vrf_af](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vrf_af_module.rst)|Manages VRF AF. +[cisco.nxos.nxos_vrf_interface](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vrf_interface_module.rst)|Manages interface specific VRF configuration. +[cisco.nxos.nxos_vrrp](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vrrp_module.rst)|Manages VRRP configuration on NX-OS switches. +[cisco.nxos.nxos_vsan](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vsan_module.rst)|Configuration of vsan for Cisco NXOS MDS Switches. +[cisco.nxos.nxos_vtp_domain](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vtp_domain_module.rst)|Manages VTP domain configuration. +[cisco.nxos.nxos_vtp_password](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vtp_password_module.rst)|Manages VTP password configuration. +[cisco.nxos.nxos_vtp_version](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vtp_version_module.rst)|Manages VTP version configuration. +[cisco.nxos.nxos_vxlan_vtep](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vxlan_vtep_module.rst)|Manages VXLAN Network Virtualization Endpoint (NVE). +[cisco.nxos.nxos_vxlan_vtep_vni](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst)|Creates a Virtual Network Identifier member (VNI) +[cisco.nxos.nxos_zone_zoneset](https://github.com/ansible-collections/nxos/blob/main/docs/cisco.nxos.nxos_zone_zoneset_module.rst)|Configuration of zone/zoneset for Cisco NXOS MDS Switches. + + + +Click the ``Content`` button to see the list of content included in this collection. + +## Installing this collection + +You can install the Cisco NX-OS collection with the Ansible Galaxy CLI: + + ansible-galaxy collection install cisco.nxos + +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: cisco.nxos +``` +## 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 Cisco NX-OS collection in your playbooks + +You can call modules by their Fully Qualified Collection Namespace (FQCN), such as `cisco.nxos.nxos_l2_interfaces`. +The following example task replaces configuration changes in the existing configuration on a Cisco NX-OS network device, using the FQCN: + +```yaml +--- + - name: Replace device configuration of specified L2 interfaces with provided configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + 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: + +* [Cisco NX-OS Platform Options](https://docs.ansible.com/ansible/latest/network/user_guide/platform_nxos.html) +* [Ansible Using collections](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html) for more details. + +## Contributing to this collection + +Ongoing development efforts and contributions to this collection are solely focused on enhancements to current resource modules, additional resource modules and enhancements to connection plugins. + +We welcome community contributions to this collection. If you find problems, please open an issue or create a PR against the [Cisco NX-OS collection repository](https://github.com/ansible-collections/cisco.nxos). 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: + +- Freenode IRC - ``#ansible-network`` Freenode 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. + + +## Release notes + +Release notes are available [here](https://github.com/ansible-collections/cisco.nxos/blob/main/changelogs/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/collections-debian-merged/ansible_collections/cisco/nxos/bindep.txt b/collections-debian-merged/ansible_collections/cisco/nxos/bindep.txt new file mode 100644 index 00000000..ba9c980f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/bindep.txt @@ -0,0 +1,6 @@ +# 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] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/CHANGELOG.rst b/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/CHANGELOG.rst new file mode 100644 index 00000000..5bfaf6be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/CHANGELOG.rst @@ -0,0 +1,269 @@ +=================================== +Cisco Nxos Collection Release Notes +=================================== + +.. contents:: Topics + + +v1.4.0 +====== + +Minor Changes +------------- + +- Add `echo_request` option for ICMP. +- Add nxos_bgp_global resource module. + +Deprecated Features +------------------- + +- Deprecated `nxos_bgp` and `nxos_bgp_neighbor` modules in favor of `nxos_bgp_global` resource module. + +Security Fixes +-------------- + +- Enable no_log for sensitive parameters in argspec. + +Bugfixes +-------- + +- 'config replace' is actually supported for devices other than N9K and hence we should not fail, and instead let the device handle it (https://github.com/ansible-collections/cisco.nxos/issues/215). +- Add support for interfaces in mode 'fabricpath' to l2_interfaces (https://github.com/ansible-collections/cisco.nxos/issues/220). +- Allow enabling `fabric forwarding` feature through nxos_feature (https://github.com/ansible-collections/cisco.nxos/issues/213). +- Allow tag updates with state replaced (https://github.com/ansible-collections/cisco.nxos/issues/197). +- Fixes traceback while parsing power supply info in nxos_facts for newer NX-OS releases (https://github.com/ansible-collections/cisco.nxos/issues/192). +- Handle domain-name properly with vrf contexts (https://github.com/ansible-collections/cisco.nxos/issues/234). +- Parse interface contexts properly (https://github.com/ansible-collections/cisco.nxos/issues/195). +- Properly handle partial matches in community string (https://github.com/ansible-collections/cisco.nxos/issues/203). +- Update argspecs with default value for parameters. +- Update docs to clarify the idemptonecy releated caveat and add it in the output warnings (https://github.com/ansible-collections/ansible.netcommon/pull/189) + +Documentation Changes +--------------------- + +- Fix error in ``host_reachability`` parameter's example where a default value is used, which the ``host_reachability`` parameter does not support. Improve descriptions of some parameters to be more explicit. Correct spelling and grammar where errors were noticed. + +New Modules +----------- + +- nxos_bgp_global - BGP Global resource module. + +v1.3.1 +====== + +Bugfixes +-------- + +- Add version key to galaxy.yaml to work around ansible-galaxy bug +- Allow nxos_user to run with MDS (https://github.com/ansible-collections/cisco.nxos/issues/163). +- Fix for nxos_lag_interfaces issue (https://github.com/ansible-collections/cisco.nxos/pull/194). +- Make sure that the OSPF modules work properly when process_id is a string (https://github.com/ansible-collections/cisco.nxos/issues/198). + +v1.3.0 +====== + +Minor Changes +------------- + +- Add nxos_ospf_interfaces resource module. + +Deprecated Features +------------------- + +- Deprecated `nxos_interface_ospf` in favor of `nxos_ospf_interfaces` Resource Module. + +Bugfixes +-------- + +- Allow `fex-fabric` option for mode key (https://github.com/ansible-collections/cisco.nxos/issues/166). +- Fixes for nxos rpm issue (https://github.com/ansible-collections/cisco.nxos/pull/173). +- Update regex to accept the platform "N77" as supporting fabricpath. +- Vlan config diff was not removing default values + +New Modules +----------- + +- nxos_ospf_interfaces - OSPF Interfaces Resource Module. + +v1.2.0 +====== + +Minor Changes +------------- + +- Add nxos_ospfv3 module. +- Allow other transfer protocols than scp to pull files from a NXOS device in nxos_file_copy module. sftp, http, https, tftp and ftp can be choosen as a transfer protocol, when the file_pull parameter is true.. + +Deprecated Features +------------------- + +- Deprecated `nxos_smu` in favour of `nxos_rpm` module. +- The `nxos_ospf_vrf` module is deprecated by `nxos_ospfv2` and `nxos_ospfv3` Resource Modules. + +Bugfixes +-------- + +- Correctly parse facts for lacp interfaces mode information (https://github.com/ansible-collections/cisco.nxos/pull/164). +- Fix for nxos smu issue (https://github.com/ansible-collections/cisco.nxos/pull/160). +- Fix regex for parsing configuration in nxos_lag_interfaces. +- Fix regexes in nxos_acl_interfaces facts and some code cleanup (https://github.com/ansible-collections/cisco.nxos/issues/149). +- Fix rendering of `log-adjacency-changes` commands. +- Preserve whitespaces in banner text (https://github.com/ansible-collections/cisco.nxos/pull/146). + +New Modules +----------- + +- nxos_ospfv3 - OSPFv3 resource module + +v1.1.0 +====== + +Minor Changes +------------- + +- Add N9K multisite support(https://github.com/ansible-collections/cisco.nxos/pull/142) + +Bugfixes +-------- + +- Allow facts round trip to work on nxos_vlans (https://github.com/ansible-collections/cisco.nxos/pull/141). + +v1.0.2 +====== + +Release Summary +--------------- + +Rereleased 1.0.1 with updated changelog. + +v1.0.1 +====== + +Minor Changes +------------- + +- documentation - Use FQCN when refering to modules (https://github.com/ansible-collections/cisco.nxos/pull/116) + +Bugfixes +-------- + +- Element type of `commands` key should be `raw` since it accepts both strings and dicts (https://github.com/ansible-collections/cisco.nxos/pull/126). +- Fix nxos_interfaces states replaced and overridden (https://github.com/ansible-collections/cisco.nxos/pull/102). +- Fixed force option in lag_interfaces.py (https://github.com/ansible-collections/cisco.nxos/pull/111). +- Make `src`, `backup` and `backup_options` in nxos_config work when module alias is used (https://github.com/ansible-collections/cisco.nxos/pull/121). +- Makes sure that docstring and argspec are in sync and removes sanity ignores (https://github.com/ansible-collections/cisco.nxos/pull/112). +- Update docs after sanity fixes to modules. +- nxos_user - do not fail when a custom role is used (https://github.com/ansible-collections/cisco.nxos/pull/130) + +v1.0.0 +====== + +New Plugins +----------- + +Cliconf +~~~~~~~ + +- nxos - Use NX-OS cliconf to run commands on Cisco NX-OS platform + +Httpapi +~~~~~~~ + +- nxos - Use NX-API to run commands on Cisco NX-OS platform + +New Modules +----------- + +- nxos_aaa_server - Manages AAA server global configuration. +- nxos_aaa_server_host - Manages AAA server host-specific configuration. +- nxos_acl - (deprecated, removed after 2022-06-01) Manages access list entries for ACLs. +- nxos_acl_interface - (deprecated, removed after 2022-06-01) Manages applying ACLs to interfaces. +- nxos_acl_interfaces - ACL interfaces resource module +- nxos_acls - ACLs resource module +- nxos_banner - Manage multiline banners on Cisco NXOS devices +- nxos_bfd_global - Bidirectional Forwarding Detection (BFD) global-level configuration +- nxos_bfd_interfaces - BFD interfaces resource module +- nxos_bgp - Manages BGP configuration. +- nxos_bgp_af - Manages BGP Address-family configuration. +- nxos_bgp_neighbor - Manages BGP neighbors configurations. +- nxos_bgp_neighbor_af - Manages BGP address-family's neighbors configuration. +- nxos_command - Run arbitrary command on Cisco NXOS devices +- nxos_config - Manage Cisco NXOS configuration sections +- nxos_evpn_global - Handles the EVPN control plane for VXLAN. +- nxos_evpn_vni - Manages Cisco EVPN VXLAN Network Identifier (VNI). +- nxos_facts - Gets facts about NX-OS switches +- nxos_feature - Manage features in NX-OS switches. +- nxos_file_copy - Copy a file to a remote NXOS device. +- nxos_gir - Trigger a graceful removal or insertion (GIR) of the switch. +- nxos_gir_profile_management - Create a maintenance-mode or normal-mode profile for GIR. +- nxos_hsrp - Manages HSRP configuration on NX-OS switches. +- nxos_hsrp_interfaces - HSRP interfaces resource module +- nxos_igmp - Manages IGMP global configuration. +- nxos_igmp_interface - Manages IGMP interface configuration. +- nxos_igmp_snooping - Manages IGMP snooping global configuration. +- nxos_install_os - Set boot options like boot, kickstart image and issu. +- nxos_interface - (deprecated, removed after 2022-06-01) Manages physical attributes of interfaces. +- nxos_interface_ospf - Manages configuration of an OSPF interface instance. +- nxos_interfaces - Interfaces resource module +- nxos_l2_interface - (deprecated, removed after 2022-06-01) Manage Layer-2 interface on Cisco NXOS devices. +- nxos_l2_interfaces - L2 interfaces resource module +- nxos_l3_interface - (deprecated, removed after 2022-06-01) Manage L3 interfaces on Cisco NXOS network devices +- nxos_l3_interfaces - L3 interfaces resource module +- nxos_lacp - LACP resource module +- nxos_lacp_interfaces - LACP interfaces resource module +- nxos_lag_interfaces - LAG interfaces resource module +- nxos_linkagg - (deprecated, removed after 2022-06-01) Manage link aggregation groups on Cisco NXOS devices. +- nxos_lldp - (deprecated, removed after 2022-06-01) Manage LLDP configuration on Cisco NXOS network devices. +- nxos_lldp_global - LLDP resource module +- nxos_lldp_interfaces - LLDP interfaces resource module +- nxos_logging - Manage logging on network devices +- nxos_ntp - Manages core NTP configuration. +- nxos_ntp_auth - Manages NTP authentication. +- nxos_ntp_options - Manages NTP options. +- nxos_nxapi - Manage NXAPI configuration on an NXOS device. +- nxos_ospf - (deprecated, removed after 2022-06-01) Manages configuration of an ospf instance. +- nxos_ospf_vrf - Manages a VRF for an OSPF router. +- nxos_ospfv2 - OSPFv2 resource module +- nxos_overlay_global - Configures anycast gateway MAC of the switch. +- nxos_pim - Manages configuration of a PIM instance. +- nxos_pim_interface - Manages PIM interface configuration. +- nxos_pim_rp_address - Manages configuration of an PIM static RP address instance. +- nxos_ping - Tests reachability using ping from Nexus switch. +- nxos_reboot - Reboot a network device. +- nxos_rollback - Set a checkpoint or rollback to a checkpoint. +- nxos_rpm - Install patch or feature rpms on Cisco NX-OS devices. +- nxos_smu - Perform SMUs on Cisco NX-OS devices. +- nxos_snapshot - Manage snapshots of the running states of selected features. +- nxos_snmp_community - Manages SNMP community configs. +- nxos_snmp_contact - Manages SNMP contact info. +- nxos_snmp_host - Manages SNMP host configuration. +- nxos_snmp_location - Manages SNMP location information. +- nxos_snmp_traps - Manages SNMP traps. +- nxos_snmp_user - Manages SNMP users for monitoring. +- nxos_static_route - (deprecated, removed after 2022-06-01) Manages static route configuration +- nxos_static_routes - Static routes resource module +- nxos_system - Manage the system attributes on Cisco NXOS devices +- nxos_telemetry - TELEMETRY resource module +- nxos_udld - Manages UDLD global configuration params. +- nxos_udld_interface - Manages UDLD interface configuration params. +- nxos_user - Manage the collection of local users on Nexus devices +- nxos_vlan - (deprecated, removed after 2022-06-01) Manages VLAN resources and attributes. +- nxos_vlans - VLANs resource module +- nxos_vpc - Manages global VPC configuration +- nxos_vpc_interface - Manages interface VPC configuration +- nxos_vrf - Manages global VRF configuration. +- nxos_vrf_af - Manages VRF AF. +- nxos_vrf_interface - Manages interface specific VRF configuration. +- nxos_vrrp - Manages VRRP configuration on NX-OS switches. +- nxos_vtp_domain - Manages VTP domain configuration. +- nxos_vtp_password - Manages VTP password configuration. +- nxos_vtp_version - Manages VTP version configuration. +- nxos_vxlan_vtep - Manages VXLAN Network Virtualization Endpoint (NVE). +- nxos_vxlan_vtep_vni - Creates a Virtual Network Identifier member (VNI) + +Storage +~~~~~~~ + +- nxos_devicealias - Configuration of device alias. +- nxos_vsan - Configuration of vsan. +- nxos_zone_zoneset - Configuration of zone/zoneset. diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/changelog.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/changelog.yaml new file mode 100644 index 00000000..9d5905f2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/changelog.yaml @@ -0,0 +1,449 @@ +ancestor: null +releases: + 1.0.0: + modules: + - description: Manages AAA server global configuration. + name: nxos_aaa_server + namespace: '' + - description: Manages AAA server host-specific configuration. + name: nxos_aaa_server_host + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manages access list entries + for ACLs. + name: nxos_acl + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manages applying ACLs to + interfaces. + name: nxos_acl_interface + namespace: '' + - description: ACL interfaces resource module + name: nxos_acl_interfaces + namespace: '' + - description: ACLs resource module + name: nxos_acls + namespace: '' + - description: Manage multiline banners on Cisco NXOS devices + name: nxos_banner + namespace: '' + - description: Bidirectional Forwarding Detection (BFD) global-level configuration + name: nxos_bfd_global + namespace: '' + - description: BFD interfaces resource module + name: nxos_bfd_interfaces + namespace: '' + - description: Manages BGP configuration. + name: nxos_bgp + namespace: '' + - description: Manages BGP Address-family configuration. + name: nxos_bgp_af + namespace: '' + - description: Manages BGP neighbors configurations. + name: nxos_bgp_neighbor + namespace: '' + - description: Manages BGP address-family's neighbors configuration. + name: nxos_bgp_neighbor_af + namespace: '' + - description: Run arbitrary command on Cisco NXOS devices + name: nxos_command + namespace: '' + - description: Manage Cisco NXOS configuration sections + name: nxos_config + namespace: '' + - description: Configuration of device alias. + name: nxos_devicealias + namespace: storage + - description: Handles the EVPN control plane for VXLAN. + name: nxos_evpn_global + namespace: '' + - description: Manages Cisco EVPN VXLAN Network Identifier (VNI). + name: nxos_evpn_vni + namespace: '' + - description: Gets facts about NX-OS switches + name: nxos_facts + namespace: '' + - description: Manage features in NX-OS switches. + name: nxos_feature + namespace: '' + - description: Copy a file to a remote NXOS device. + name: nxos_file_copy + namespace: '' + - description: Trigger a graceful removal or insertion (GIR) of the switch. + name: nxos_gir + namespace: '' + - description: Create a maintenance-mode or normal-mode profile for GIR. + name: nxos_gir_profile_management + namespace: '' + - description: Manages HSRP configuration on NX-OS switches. + name: nxos_hsrp + namespace: '' + - description: HSRP interfaces resource module + name: nxos_hsrp_interfaces + namespace: '' + - description: Manages IGMP global configuration. + name: nxos_igmp + namespace: '' + - description: Manages IGMP interface configuration. + name: nxos_igmp_interface + namespace: '' + - description: Manages IGMP snooping global configuration. + name: nxos_igmp_snooping + namespace: '' + - description: Set boot options like boot, kickstart image and issu. + name: nxos_install_os + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manages physical attributes + of interfaces. + name: nxos_interface + namespace: '' + - description: Manages configuration of an OSPF interface instance. + name: nxos_interface_ospf + namespace: '' + - description: Interfaces resource module + name: nxos_interfaces + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manage Layer-2 interface + on Cisco NXOS devices. + name: nxos_l2_interface + namespace: '' + - description: L2 interfaces resource module + name: nxos_l2_interfaces + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manage L3 interfaces on + Cisco NXOS network devices + name: nxos_l3_interface + namespace: '' + - description: L3 interfaces resource module + name: nxos_l3_interfaces + namespace: '' + - description: LACP resource module + name: nxos_lacp + namespace: '' + - description: LACP interfaces resource module + name: nxos_lacp_interfaces + namespace: '' + - description: LAG interfaces resource module + name: nxos_lag_interfaces + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manage link aggregation + groups on Cisco NXOS devices. + name: nxos_linkagg + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manage LLDP configuration + on Cisco NXOS network devices. + name: nxos_lldp + namespace: '' + - description: LLDP resource module + name: nxos_lldp_global + namespace: '' + - description: LLDP interfaces resource module + name: nxos_lldp_interfaces + namespace: '' + - description: Manage logging on network devices + name: nxos_logging + namespace: '' + - description: Manages core NTP configuration. + name: nxos_ntp + namespace: '' + - description: Manages NTP authentication. + name: nxos_ntp_auth + namespace: '' + - description: Manages NTP options. + name: nxos_ntp_options + namespace: '' + - description: Manage NXAPI configuration on an NXOS device. + name: nxos_nxapi + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manages configuration of + an ospf instance. + name: nxos_ospf + namespace: '' + - description: Manages a VRF for an OSPF router. + name: nxos_ospf_vrf + namespace: '' + - description: OSPFv2 resource module + name: nxos_ospfv2 + namespace: '' + - description: Configures anycast gateway MAC of the switch. + name: nxos_overlay_global + namespace: '' + - description: Manages configuration of a PIM instance. + name: nxos_pim + namespace: '' + - description: Manages PIM interface configuration. + name: nxos_pim_interface + namespace: '' + - description: Manages configuration of an PIM static RP address instance. + name: nxos_pim_rp_address + namespace: '' + - description: Tests reachability using ping from Nexus switch. + name: nxos_ping + namespace: '' + - description: Reboot a network device. + name: nxos_reboot + namespace: '' + - description: Set a checkpoint or rollback to a checkpoint. + name: nxos_rollback + namespace: '' + - description: Install patch or feature rpms on Cisco NX-OS devices. + name: nxos_rpm + namespace: '' + - description: Perform SMUs on Cisco NX-OS devices. + name: nxos_smu + namespace: '' + - description: Manage snapshots of the running states of selected features. + name: nxos_snapshot + namespace: '' + - description: Manages SNMP community configs. + name: nxos_snmp_community + namespace: '' + - description: Manages SNMP contact info. + name: nxos_snmp_contact + namespace: '' + - description: Manages SNMP host configuration. + name: nxos_snmp_host + namespace: '' + - description: Manages SNMP location information. + name: nxos_snmp_location + namespace: '' + - description: Manages SNMP traps. + name: nxos_snmp_traps + namespace: '' + - description: Manages SNMP users for monitoring. + name: nxos_snmp_user + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manages static route configuration + name: nxos_static_route + namespace: '' + - description: Static routes resource module + name: nxos_static_routes + namespace: '' + - description: Manage the system attributes on Cisco NXOS devices + name: nxos_system + namespace: '' + - description: TELEMETRY resource module + name: nxos_telemetry + namespace: '' + - description: Manages UDLD global configuration params. + name: nxos_udld + namespace: '' + - description: Manages UDLD interface configuration params. + name: nxos_udld_interface + namespace: '' + - description: Manage the collection of local users on Nexus devices + name: nxos_user + namespace: '' + - description: (deprecated, removed after 2022-06-01) Manages VLAN resources and + attributes. + name: nxos_vlan + namespace: '' + - description: VLANs resource module + name: nxos_vlans + namespace: '' + - description: Manages global VPC configuration + name: nxos_vpc + namespace: '' + - description: Manages interface VPC configuration + name: nxos_vpc_interface + namespace: '' + - description: Manages global VRF configuration. + name: nxos_vrf + namespace: '' + - description: Manages VRF AF. + name: nxos_vrf_af + namespace: '' + - description: Manages interface specific VRF configuration. + name: nxos_vrf_interface + namespace: '' + - description: Manages VRRP configuration on NX-OS switches. + name: nxos_vrrp + namespace: '' + - description: Configuration of vsan. + name: nxos_vsan + namespace: storage + - description: Manages VTP domain configuration. + name: nxos_vtp_domain + namespace: '' + - description: Manages VTP password configuration. + name: nxos_vtp_password + namespace: '' + - description: Manages VTP version configuration. + name: nxos_vtp_version + namespace: '' + - description: Manages VXLAN Network Virtualization Endpoint (NVE). + name: nxos_vxlan_vtep + namespace: '' + - description: Creates a Virtual Network Identifier member (VNI) + name: nxos_vxlan_vtep_vni + namespace: '' + - description: Configuration of zone/zoneset. + name: nxos_zone_zoneset + namespace: storage + plugins: + cliconf: + - description: Use NX-OS cliconf to run commands on Cisco NX-OS platform + name: nxos + namespace: null + httpapi: + - description: Use NX-API to run commands on Cisco NX-OS platform + name: nxos + namespace: null + release_date: '2020-06-23' + 1.0.1: + changes: + bugfixes: + - Element type of `commands` key should be `raw` since it accepts both strings + and dicts (https://github.com/ansible-collections/cisco.nxos/pull/126). + - Fix nxos_interfaces states replaced and overridden (https://github.com/ansible-collections/cisco.nxos/pull/102). + - Fixed force option in lag_interfaces.py (https://github.com/ansible-collections/cisco.nxos/pull/111). + - Make `src`, `backup` and `backup_options` in nxos_config work when module + alias is used (https://github.com/ansible-collections/cisco.nxos/pull/121). + - Makes sure that docstring and argspec are in sync and removes sanity ignores + (https://github.com/ansible-collections/cisco.nxos/pull/112). + - Update docs after sanity fixes to modules. + - nxos_user - do not fail when a custom role is used (https://github.com/ansible-collections/cisco.nxos/pull/130) + minor_changes: + - documentation - Use FQCN when refering to modules (https://github.com/ansible-collections/cisco.nxos/pull/116) + fragments: + - 102-fix-nxos_interfaces-states.yaml + - 111_update_lag_interfaces.yaml + - 116-add-FQCN-for-documentation + - fix_command_key.yaml + - fix_nxos_user_role.yaml + - fix_src_backup_with_module_alias.yaml + - remove_ignores.yaml + - update_docs.yaml + release_date: '2020-08-03' + 1.0.2: + changes: + release_summary: Rereleased 1.0.1 with updated changelog. + fragments: + - 1.0.2.yaml + release_date: '2020-08-07' + 1.1.0: + changes: + bugfixes: + - Allow facts round trip to work on nxos_vlans (https://github.com/ansible-collections/cisco.nxos/pull/141). + minor_changes: + - Add N9K multisite support(https://github.com/ansible-collections/cisco.nxos/pull/142) + fragments: + - 141_fix_nxos_vlans.yaml + - 142-N9K-multisite.yaml + release_date: '2020-08-28' + 1.2.0: + changes: + bugfixes: + - Correctly parse facts for lacp interfaces mode information (https://github.com/ansible-collections/cisco.nxos/pull/164). + - Fix for nxos smu issue (https://github.com/ansible-collections/cisco.nxos/pull/160). + - Fix regex for parsing configuration in nxos_lag_interfaces. + - Fix regexes in nxos_acl_interfaces facts and some code cleanup (https://github.com/ansible-collections/cisco.nxos/issues/149). + - Fix rendering of `log-adjacency-changes` commands. + - Preserve whitespaces in banner text (https://github.com/ansible-collections/cisco.nxos/pull/146). + deprecated_features: + - Deprecated `nxos_smu` in favour of `nxos_rpm` module. + - The `nxos_ospf_vrf` module is deprecated by `nxos_ospfv2` and `nxos_ospfv3` + Resource Modules. + minor_changes: + - Add nxos_ospfv3 module. + - Allow other transfer protocols than scp to pull files from a NXOS device in + nxos_file_copy module. sftp, http, https, tftp and ftp can be choosen as a + transfer protocol, when the file_pull parameter is true.. + fragments: + - 161-transfer_protocol_file_copy.yaml + - add_nxos_ospfv3.yaml + - fix_lacp_interfaces_mode_facts_parsing.yaml + - fix_nxos_acl_interfaces.yaml + - fix_nxos_banner_with_spaces.yaml + - fix_nxos_lag_interfaces.yaml + - fix_nxos_ospfv2.yaml + - fix_nxos_smu.yaml + modules: + - description: OSPFv3 resource module + name: nxos_ospfv3 + namespace: '' + release_date: '2020-10-01' + 1.3.0: + changes: + bugfixes: + - Allow `fex-fabric` option for mode key (https://github.com/ansible-collections/cisco.nxos/issues/166). + - Fixes for nxos rpm issue (https://github.com/ansible-collections/cisco.nxos/pull/173). + - Update regex to accept the platform "N77" as supporting fabricpath. + - Vlan config diff was not removing default values + deprecated_features: + - Deprecated `nxos_interface_ospf` in favor of `nxos_ospf_interfaces` Resource + Module. + minor_changes: + - Add nxos_ospf_interfaces resource module. + fragments: + - add_fex_fabric_l2_inteerfaces.yaml + - add_nxos_ospf_interfaces.yaml + - fix_nxos_rpm.yaml + - fix_vlan_diff.yaml + - vlans-fabricpath-mode-regex.yaml + modules: + - description: OSPF Interfaces Resource Module. + name: nxos_ospf_interfaces + namespace: '' + release_date: '2020-10-29' + 1.3.1: + changes: + bugfixes: + - Add version key to galaxy.yaml to work around ansible-galaxy bug + - Allow nxos_user to run with MDS (https://github.com/ansible-collections/cisco.nxos/issues/163). + - Fix for nxos_lag_interfaces issue (https://github.com/ansible-collections/cisco.nxos/pull/194). + - Make sure that the OSPF modules work properly when process_id is a string + (https://github.com/ansible-collections/cisco.nxos/issues/198). + fragments: + - fix_nxos_lag_interfaces_1.yaml + - fix_ospf_process_id.yaml + - galaxy-version.yaml + - support_nxos_user_mds.yaml + release_date: '2020-11-26' + 1.4.0: + changes: + bugfixes: + - config replace is actually supported for devices other than N9K and hence + we should not fail, and instead let the device handle it (https://github.com/ansible-collections/cisco.nxos/issues/215). + - Add support for interfaces in mode 'fabricpath' to l2_interfaces (https://github.com/ansible-collections/cisco.nxos/issues/220). + - Allow enabling `fabric forwarding` feature through nxos_feature (https://github.com/ansible-collections/cisco.nxos/issues/213). + - Allow tag updates with state replaced (https://github.com/ansible-collections/cisco.nxos/issues/197). + - Fixes traceback while parsing power supply info in nxos_facts for newer NX-OS + releases (https://github.com/ansible-collections/cisco.nxos/issues/192). + - Handle domain-name properly with vrf contexts (https://github.com/ansible-collections/cisco.nxos/issues/234). + - Parse interface contexts properly (https://github.com/ansible-collections/cisco.nxos/issues/195). + - Properly handle partial matches in community string (https://github.com/ansible-collections/cisco.nxos/issues/203). + - Update argspecs with default value for parameters. + - Update docs to clarify the idemptonecy releated caveat and add it in the output + warnings (https://github.com/ansible-collections/ansible.netcommon/pull/189) + deprecated_features: + - Deprecated `nxos_bgp` and `nxos_bgp_neighbor` modules in favor of `nxos_bgp_global` resource module. + doc_changes: + - Fix error in ``host_reachability`` parameter's example where a default value + is used, which the ``host_reachability`` parameter does not support. Improve + descriptions of some parameters to be more explicit. Correct spelling and + grammar where errors were noticed. + minor_changes: + - Add `echo_request` option for ICMP. + - Add nxos_bgp_global resource module. + security_fixes: + - Enable no_log for sensitive parameters in argspec. + fragments: + - 204-improve-nxos-vxlan-vtep-module-docs.yaml + - add_default_options.yaml + - add_nxos_bgp_global.yaml + - fix_interface_context.yaml + - fix_l2_interfaces_mode_fabricpath.yaml + - fix_nxos_facts.yaml + - fix_nxos_l3_interfaces_tag.yaml + - fix_nxos_system_vrf_domain.yaml + - mask_sensitive_values.yaml + - nxos_acls.yaml + - nxos_config_diff_doc_update.yaml + - nxos_config_replace.yaml + - nxos_feature.yaml + - nxos_snmp_community.yaml + - depr_bgp.yaml + modules: + - description: BGP Global resource module. + name: nxos_bgp_global + namespace: '' + release_date: '2021-01-29' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/config.yaml new file mode 100644 index 00000000..ee71a10c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/changelogs/config.yaml @@ -0,0 +1,32 @@ +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 +- - doc_changes + - Documentation Changes +title: Cisco Nxos Collection +trivial_section_name: trivial diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_host_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_host_module.rst new file mode 100644 index 00000000..a4690809 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_host_module.rst @@ -0,0 +1,576 @@ +.. _cisco.nxos.nxos_aaa_server_host_module: + + +******************************* +cisco.nxos.nxos_aaa_server_host +******************************* + +**Manages AAA server host-specific configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages AAA server host-specific configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ acct_port + +
+ string +
+
+ +
Alternate UDP port for RADIUS accounting or keyword 'default'.
+
+
+ address + +
+ string + / required +
+
+ +
Address or name of the radius or tacacs host.
+
+
+ auth_port + +
+ string +
+
+ +
Alternate UDP port for RADIUS authentication or keyword 'default'.
+
+
+ encrypt_type + +
+ string +
+
+
    Choices: +
  • 0
  • +
  • 7
  • +
+
+
The state of encryption applied to the entered key. O for clear text, 7 for encrypted. Type-6 encryption is not supported.
+
+
+ host_timeout + +
+ string +
+
+ +
Timeout period for specified host, in seconds or keyword 'default. Range is 1-60.
+
+
+ key + +
+ string +
+
+ +
Shared secret for the specified host or keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ server_type + +
+ string + / required +
+
+
    Choices: +
  • radius
  • +
  • tacacs
  • +
+
+
The server type is either radius or tacacs.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ tacacs_port + +
+ string +
+
+ +
Alternate TCP port TACACS Server or keyword 'default'.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Changes to the host key (shared secret) are not idempotent for type 0. + - If ``state=absent`` removes the whole host configuration. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Radius Server Host Basic settings + - name: Radius Server Host Basic settings + cisco.nxos.nxos_aaa_server_host: + state: present + server_type: radius + address: 1.2.3.4 + acct_port: 2084 + host_timeout: 10 + + # Radius Server Host Key Configuration + - name: Radius Server Host Key Configuration + cisco.nxos.nxos_aaa_server_host: + state: present + server_type: radius + address: 1.2.3.4 + key: hello + encrypt_type: 7 + + # TACACS Server Host Configuration + - name: Tacacs Server Host Configuration + cisco.nxos.nxos_aaa_server_host: + state: present + server_type: tacacs + tacacs_port: 89 + host_timeout: 10 + address: 5.6.7.8 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of configuration after module execution
+
+
Sample:
+
{'address': '1.2.3.4', 'auth_port': '2084', 'host_timeout': '10', 'server_type': 'radius'}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing configuration
+
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'address': '1.2.3.4', 'auth_port': '2084', 'host_timeout': '10', 'server_type': 'radius'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['radius-server host 1.2.3.4 auth-port 2084 timeout 10']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_module.rst new file mode 100644 index 00000000..e74945df --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_aaa_server_module.rst @@ -0,0 +1,481 @@ +.. _cisco.nxos.nxos_aaa_server_module: + + +************************** +cisco.nxos.nxos_aaa_server +************************** + +**Manages AAA server global configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages AAA server global configuration + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ deadtime + +
+ string +
+
+ +
Duration for which a non-reachable AAA server is skipped, in minutes or keyword 'default. Range is 1-1440. Device default is 0.
+
+
+ directed_request + +
+ string +
+
+
    Choices: +
  • enabled
  • +
  • disabled
  • +
  • default
  • +
+
+
Enables direct authentication requests to AAA server or keyword 'default' Device default is disabled.
+
+
+ encrypt_type + +
+ string +
+
+
    Choices: +
  • 0
  • +
  • 7
  • +
+
+
The state of encryption applied to the entered global key. O clear text, 7 encrypted. Type-6 encryption is not supported.
+
+
+ global_key + +
+ string +
+
+ +
Global AAA shared secret or keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ server_timeout + +
+ string +
+
+ +
Global AAA server timeout period, in seconds or keyword 'default. Range is 1-60. Device default is 5.
+
+
+ server_type + +
+ string + / required +
+
+
    Choices: +
  • radius
  • +
  • tacacs
  • +
+
+
The server type is either radius or tacacs.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • default
  • +
+
+
Manage the state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - The server_type parameter is always required. + - If encrypt_type is not supplied, the global AAA server key will be stored as encrypted (type 7). + - Changes to the global AAA server key with encrypt_type=0 are not idempotent. + - state=default will set the supplied parameters to their default values. The parameters that you want to default must also be set to default. If global_key=default, the global key will be removed. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Radius Server Basic settings + - name: Radius Server Basic settings + cisco.nxos.nxos_aaa_server: + server_type: radius + server_timeout: 9 + deadtime: 20 + directed_request: enabled + + # Tacacs Server Basic settings + - name: Tacacs Server Basic settings + cisco.nxos.nxos_aaa_server: + server_type: tacacs + server_timeout: 8 + deadtime: 19 + directed_request: disabled + + # Setting Global Key + - name: AAA Server Global Key + cisco.nxos.nxos_aaa_server: + server_type: radius + global_key: test_key + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['radius-server deadtime 22', 'radius-server timeout 11', 'radius-server directed-request']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interface_module.rst new file mode 100644 index 00000000..248e4582 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interface_module.rst @@ -0,0 +1,438 @@ +.. _cisco.nxos.nxos_acl_interface_module: + + +***************************** +cisco.nxos.nxos_acl_interface +***************************** + +**(deprecated, removed after 2022-06-01) Manages applying ACLs to interfaces.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_acl_interfaces + + + +Synopsis +-------- +- Manages applying ACLs to interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ direction + +
+ string + / required +
+
+
    Choices: +
  • ingress
  • +
  • egress
  • +
+
+
Direction ACL to be applied in on the interface.
+
+
+ interface + +
+ string + / required +
+
+ +
Full name of interface, e.g. Ethernet1/1.
+
+
+ name + +
+ string + / required +
+
+ +
Case sensitive name of the access list (ACL).
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specify desired state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: apply egress acl to ethernet1/41 + cisco.nxos.nxos_acl_interface: + name: ANSIBLE + interface: ethernet1/41 + direction: egress + state: present + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ acl_applied_to + +
+ list +
+
always +
list of interfaces the ACL is applied to
+
+
Sample:
+
[{'acl_type': 'Router ACL', 'direction': 'egress', 'interface': 'Ethernet1/41', 'name': 'ANSIBLE'}]
+
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['interface ethernet1/41', 'ip access-group ANSIBLE out']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interfaces_module.rst new file mode 100644 index 00000000..ed470b01 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_interfaces_module.rst @@ -0,0 +1,609 @@ +.. _cisco.nxos.nxos_acl_interfaces_module: + + +****************************** +cisco.nxos.nxos_acl_interfaces +****************************** + +**ACL interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Add and remove Access Control Lists on interfaces in NX-OS platform + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of interfaces to be configured with ACLs
+
+
+ access_groups + +
+ list + / elements=dictionary +
+
+ +
List of address family indicators with ACLs to be configured on the interface
+
+
+ acls + +
+ list + / elements=dictionary +
+
+ +
List of Access Control Lists for the interface
+
+
+ direction + +
+ string + / required +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Direction to be applied for the ACL
+
+
+ name + +
+ string + / required +
+
+ +
Name of the ACL to be added/removed
+
+
+ port + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use ACL as port policy.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Address Family Indicator of the ACLs to be configured
+
+
+ name + +
+ string + / required +
+
+ +
Name 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 NX-OS 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: +
  • deleted
  • +
  • gathered
  • +
  • merged ←
  • +
  • overridden
  • +
  • rendered
  • +
  • replaced
  • +
  • parsed
  • +
+
+
The state the configuration should be left in
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 7.3.(0)D1(1) on VIRL + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------ + # + + - name: Merge ACL interfaces configuration + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/2 + access_groups: + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + + - name: Eth1/5 + access_groups: + - afi: ipv4 + acls: + - name: PortACL + direction: in + port: true + + - name: ACL1v4 + direction: out + + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + state: merged + + # After state: + # ------------ + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ip port access-group PortACL in + # ip access-group ACL1v4 out + # ipv6 traffic-filter ACL1v6 in + + # Using replaced + + # Before state: + # ------------ + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ip port access-group PortACL in + # ip access-group ACL1v4 out + # ipv6 traffic-filter ACL1v6 in + + - name: Replace interface configuration with given configuration + cisco.nxos.nxos_acl_interfaces: + config: + - name: Eth1/5 + access_groups: + - afi: ipv4 + acls: + - name: NewACLv4 + direction: out + + - name: Ethernet1/3 + access_groups: + - afi: ipv6 + acls: + - name: NewACLv6 + direction: in + port: true + state: replaced + + # After state: + # ------------ + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/3 + # ipv6 port traffic-filter NewACLv6 in + # interface Ethernet1/5 + # ip access-group NewACLv4 out + + # Using overridden + + # Before state: + # ------------ + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ip port access-group PortACL in + # ip access-group ACL1v4 out + # ipv6 traffic-filter ACL1v6 in + + - name: Override interface configuration with given configuration + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/3 + access_groups: + - afi: ipv4 + acls: + - name: ACL1v4 + direction: out + + - name: PortACL + port: true + direction: in + - afi: ipv6 + acls: + - name: NewACLv6 + direction: in + port: true + state: overridden + + # After state: + # ------------ + # interface Ethernet1/3 + # ip access-group ACL1v4 out + # ip port access-group PortACL in + # ipv6 port traffic-filter NewACLv6 in + + # Using deleted to remove ACL config from specified interfaces + + # Before state: + # ------------- + # interface Ethernet1/1 + # ip access-group ACL2v4 in + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ip port access-group PortACL in + # ip access-group ACL1v4 out + # ipv6 traffic-filter ACL1v6 in + + - name: Delete ACL configuration on interfaces + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/5 + - name: Ethernet1/2 + state: deleted + + # After state: + # ------------- + # interface Ethernet1/1 + # ip access-group ACL2v4 in + # interface Ethernet1/2 + # interface Ethernet1/5 + + # Using deleted to remove ACL config from all interfaces + + # Before state: + # ------------- + # interface Ethernet1/1 + # ip access-group ACL2v4 in + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ip port access-group PortACL in + # ip access-group ACL1v4 out + # ipv6 traffic-filter ACL1v6 in + + - name: Delete ACL configuration from all interfaces + cisco.nxos.nxos_acl_interfaces: + state: deleted + + # After state: + # ------------- + # interface Ethernet1/1 + # interface Ethernet1/2 + # interface Ethernet1/5 + + # Using parsed + + - name: Parse given configuration into structured format + cisco.nxos.nxos_acl_interfaces: + running_config: | + interface Ethernet1/2 + ipv6 traffic-filter ACL1v6 in + interface Ethernet1/5 + ipv6 traffic-filter ACL1v6 in + ip access-group ACL1v4 out + ip port access-group PortACL in + state: parsed + + # returns + # parsed: + # - name: Ethernet1/2 + # access_groups: + # - afi: ipv6 + # acls: + # - name: ACL1v6 + # direction: in + # - name: Ethernet1/5 + # access_groups: + # - afi: ipv4 + # acls: + # - name: PortACL + # direction: in + # port: True + # - name: ACL1v4 + # direction: out + # - afi: ipv6 + # acls: + # - name: ACL1v6 + # direction: in + + + # Using gathered: + + # Before state: + # ------------ + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ipv6 traffic-filter ACL1v6 in + # ip access-group ACL1v4 out + # ip port access-group PortACL in + + - name: Gather existing configuration from device + cisco.nxos.nxos_acl_interfaces: + config: + state: gathered + + # returns + # gathered: + # - name: Ethernet1/2 + # access_groups: + # - afi: ipv6 + # acls: + # - name: ACL1v6 + # direction: in + # - name: Ethernet1/5 + # access_groups: + # - afi: ipv4 + # acls: + # - name: PortACL + # direction: in + # port: True + # - name: ACL1v4 + # direction: out + # - afi: ipv6 + # acls: + # - name: ACL1v6 + # direction: in + + + # Using rendered + + - name: Render required configuration to be pushed to the device + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/2 + access_groups: + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + + - name: Ethernet1/5 + access_groups: + - afi: ipv4 + acls: + - name: PortACL + direction: in + port: true + - name: ACL1v4 + direction: out + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + state: rendered + + # returns + # rendered: + # interface Ethernet1/2 + # ipv6 traffic-filter ACL1v6 in + # interface Ethernet1/5 + # ipv6 traffic-filter ACL1v6 in + # ip access-group ACL1v4 out + # ip port access-group PortACL in + + + +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 model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
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 Ethernet1/2', 'ipv6 traffic-filter ACL1v6 out', 'ip port access-group PortACL in']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Adharsh Srivats Rangarajan (@adharshsrivatsr) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_module.rst new file mode 100644 index 00000000..bd1c4b63 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acl_module.rst @@ -0,0 +1,835 @@ +.. _cisco.nxos.nxos_acl_module: + + +******************* +cisco.nxos.nxos_acl +******************* + +**(deprecated, removed after 2022-06-01) Manages access list entries for ACLs.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_acls + + + +Synopsis +-------- +- Manages access list entries for ACLs. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ ack + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match on the ACK bit.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • permit
  • +
  • deny
  • +
  • remark
  • +
+
+
Action of the ACE.
+
+
+ dest + +
+ string +
+
+ +
Destination ip and mask using IP/MASK notation and supports the keyword 'any'.
+
+
+ dest_port1 + +
+ string +
+
+ +
Port/protocol and also first (lower) port when using range operand.
+
+
+ dest_port2 + +
+ string +
+
+ +
Second (end) port when using range operand.
+
+
+ dest_port_op + +
+ string +
+
+
    Choices: +
  • any
  • +
  • eq
  • +
  • gt
  • +
  • lt
  • +
  • neq
  • +
  • range
  • +
+
+
Destination port operands such as eq, neq, gt, lt, range.
+
+
+ dscp + +
+ string +
+
+
    Choices: +
  • af11
  • +
  • af12
  • +
  • af13
  • +
  • af21
  • +
  • af22
  • +
  • af23
  • +
  • af31
  • +
  • af32
  • +
  • af33
  • +
  • af41
  • +
  • af42
  • +
  • af43
  • +
  • cs1
  • +
  • cs2
  • +
  • cs3
  • +
  • cs4
  • +
  • cs5
  • +
  • cs6
  • +
  • cs7
  • +
  • default
  • +
  • ef
  • +
+
+
Match packets with given dscp value.
+
+
+ established + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match established connections.
+
+
+ fin + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match on the FIN bit.
+
+
+ fragments + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Check non-initial fragments.
+
+
+ log + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Log matches against this entry.
+
+
+ name + +
+ string + / required +
+
+ +
Case sensitive name of the access list (ACL).
+
+
+ precedence + +
+ string +
+
+
    Choices: +
  • critical
  • +
  • flash
  • +
  • flash-override
  • +
  • immediate
  • +
  • internet
  • +
  • network
  • +
  • priority
  • +
  • routine
  • +
+
+
Match packets with given precedence.
+
+
+ proto + +
+ string +
+
+ +
Port number or protocol (as supported by the switch).
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ psh + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match on the PSH bit.
+
+
+ remark + +
+ string +
+
+ +
If action is set to remark, this is the description.
+
+
+ rst + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match on the RST bit.
+
+
+ seq + +
+ string +
+
+ +
Sequence number of the entry (ACE).
+
+
+ src + +
+ string +
+
+ +
Source ip and mask using IP/MASK notation and supports keyword 'any'.
+
+
+ src_port1 + +
+ string +
+
+ +
Port/protocol and also first (lower) port when using range operand.
+
+
+ src_port2 + +
+ string +
+
+ +
Second (end) port when using range operand.
+
+
+ src_port_op + +
+ string +
+
+
    Choices: +
  • any
  • +
  • eq
  • +
  • gt
  • +
  • lt
  • +
  • neq
  • +
  • range
  • +
+
+
Source port operands such as eq, neq, gt, lt, range.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
  • delete_acl
  • +
+
+
Specify desired state of the resource.
+
+
+ syn + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match on the SYN bit.
+
+
+ time_range + +
+ string +
+
+ +
Name of time-range to apply.
+
+
+ urg + +
+ string +
+
+
    Choices: +
  • enable
  • +
+
+
Match on the URG bit.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the ACE if it exists. + - ``state=delete_acl`` deletes the ACL if it exists. + - For idempotency, use port numbers for the src/dest port params like *src_port1* and names for the well defined protocols for the *proto* param. + - Although this module is idempotent in that if the ace as presented in the task is identical to the one on the switch, no changes will be made. If there is any difference, what is in Ansible will be pushed (configured options will be overridden). This is to improve security, but at the same time remember an ACE is removed, then re-added, so if there is a change, the new ACE will be exactly what parameters you are sending to the module. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # configure ACL ANSIBLE + - cisco.nxos.nxos_acl: + name: ANSIBLE + seq: 10 + action: permit + proto: tcp + src: 192.0.2.1/24 + dest: any + 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 +
commands sent to the device
+
+
Sample:
+
['ip access-list ANSIBLE', '10 permit tcp 192.0.2.1/24 any']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acls_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acls_module.rst new file mode 100644 index 00000000..d08a06fc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_acls_module.rst @@ -0,0 +1,2789 @@ +.. _cisco.nxos.nxos_acls_module: + + +******************** +cisco.nxos.nxos_acls +******************** + +**ACLs resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manage named IP ACLs on the Cisco NX-OS platform + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of ACL options.
+
+
+ acls + +
+ list + / elements=dictionary +
+
+ +
A list of the ACLs.
+
+
+ aces + +
+ list + / elements=dictionary +
+
+ +
The entries within the ACL.
+
+
+ destination + +
+ dictionary +
+
+ +
Specify the packet destination.
+
+
+ address + +
+ string +
+
+ +
Destination network address.
+
+
+ any + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Any destination address.
+
+
+ host + +
+ string +
+
+ +
Host IP address.
+
+
+ port_protocol + +
+ dictionary +
+
+ +
Specify the destination port or protocol (only for TCP and UDP).
+
+
+ eq + +
+ string +
+
+ +
Match only packets on a given port number.
+
+
+ gt + +
+ string +
+
+ +
Match only packets with a greater port number.
+
+
+ lt + +
+ string +
+
+ +
Match only packets with a lower port number.
+
+
+ neq + +
+ string +
+
+ +
Match only packets not on a given port number.
+
+
+ range + +
+ dictionary +
+
+ +
Match only packets in the range of port numbers.
+
+
+ end + +
+ string +
+
+ +
Specify the end of the port range.
+
+
+ start + +
+ string +
+
+ +
Specify the start of the port range.
+
+
+ prefix + +
+ string +
+
+ +
Destination network prefix. Only for prefixes of value less than 31 for ipv4 and 127 for ipv6. Prefixes of 32 (ipv4) and 128 (ipv6) should be given in the 'host' key.
+
+
+ wildcard_bits + +
+ string +
+
+ +
Destination wildcard bits.
+
+
+ dscp + +
+ string +
+
+ +
Match packets with given DSCP value.
+
+
+ fragments + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Check non-initial fragments.
+
+
+ grant + +
+ string +
+
+
    Choices: +
  • permit
  • +
  • deny
  • +
+
+
Action to be applied on the rule.
+
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log matches against this entry.
+
+
+ precedence + +
+ string +
+
+ +
Match packets with given precedence value.
+
+
+ protocol + +
+ string +
+
+ +
Specify the protocol.
+
+
+ protocol_options + +
+ dictionary +
+
+ +
All possible suboptions for the protocol chosen.
+
+
+ icmp + +
+ dictionary +
+
+ +
ICMP protocol options.
+
+
+ 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
+
+
+ echo_request + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Echo request (ping)
+
+
+ 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_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 exceeded.
+
+
+ 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
+
+
+ igmp + +
+ dictionary +
+
+ +
IGMP protocol options.
+
+
+ dvmrp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Distance Vector Multicast Routing Protocol
+
+
+ host_query + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host Query
+
+
+ host_report + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host Report
+
+
+ tcp + +
+ dictionary +
+
+ +
TCP 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 +
+
+ +
Access list entry comment.
+
+
+ sequence + +
+ integer +
+
+ +
Sequence number.
+
+
+ source + +
+ dictionary +
+
+ +
Specify the packet source.
+
+
+ address + +
+ string +
+
+ +
Source network address.
+
+
+ any + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Any source address.
+
+
+ host + +
+ string +
+
+ +
Host IP address.
+
+
+ port_protocol + +
+ dictionary +
+
+ +
Specify the destination port or protocol (only for TCP and UDP).
+
+
+ eq + +
+ string +
+
+ +
Match only packets on a given port number.
+
+
+ gt + +
+ string +
+
+ +
Match only packets with a greater port number.
+
+
+ lt + +
+ string +
+
+ +
Match only packets with a lower port number.
+
+
+ neq + +
+ string +
+
+ +
Match only packets not on a given port number.
+
+
+ range + +
+ dictionary +
+
+ +
Match only packets in the range of port numbers.
+
+
+ end + +
+ string +
+
+ +
Specify the end of the port range.
+
+
+ start + +
+ string +
+
+ +
Specify the start of the port range.
+
+
+ prefix + +
+ string +
+
+ +
Source network prefix. Only for prefixes of mask value less than 31 for ipv4 and 127 for ipv6. Prefixes of mask 32 (ipv4) and 128 (ipv6) should be given in the 'host' key.
+
+
+ wildcard_bits + +
+ string +
+
+ +
Source wildcard bits.
+
+
+ name + +
+ string + / required +
+
+ +
Name of the ACL.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
The Address Family Indicator (AFI) for the ACL.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS device by executing the command show running-config | section 'ip(v6* 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
  • +
  • gathered
  • +
  • merged ←
  • +
  • overridden
  • +
  • rendered
  • +
  • replaced
  • +
  • parsed
  • +
+
+
The state the configuration should be left in
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 7.3.(0)D1(1) on VIRL + - As NX-OS allows configuring a rule again with different sequence numbers, the user is expected to provide sequence numbers for the access control entries to preserve idempotency. If no sequence number is given, the rule will be added as a new rule by the device. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + + - name: Merge new ACLs configuration + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: ACL1v4 + aces: + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + lt: 55 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - afi: ipv6 + acls: + - name: ACL1v6 + aces: + - grant: permit + sequence: 10 + source: + any: true + destination: + prefix: 2001:db8:12::/32 + protocol: sctp + state: merged + + # After state: + # ------------ + # + # ip access-list ACL1v4 + # 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin + # ipv6 access-list ACL1v6 + # 10 permit sctp any any + + # Using replaced + + # Before state: + # ---------------- + # + # ip access-list ACL1v4 + # 10 permit ip any any + # 20 deny udp any any + # ip access-list ACL2v4 + # 10 permit ahp 192.0.2.0 0.0.0.255 any + # ip access-list ACL1v6 + # 10 permit sctp any any + # 20 remark IPv6 ACL + # ip access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + - name: Replace existing ACL configuration with provided configuration + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + - afi: ipv6 + acls: + - name: ACL1v6 + aces: + - sequence: 20 + grant: permit + source: + any: true + destination: + any: true + protocol: pip + + - remark: Replaced ACE + + - name: ACL2v6 + state: replaced + + # After state: + # --------------- + # + # ipv6 access-list ACL1v6 + # 20 permit pip any any + # 30 remark Replaced ACE + # ipv6 access-list ACL2v6 + + # Using overridden + + # Before state: + # ---------------- + # + # ip access-list ACL1v4 + # 10 permit ip any any + # 20 deny udp any any + # ip access-list ACL2v4 + # 10 permit ahp 192.0.2.0 0.0.0.255 any + # ip access-list ACL1v6 + # 10 permit sctp any any + # 20 remark IPv6 ACL + # ip access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + - name: Override existing configuration with provided configuration + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: NewACL + aces: + - grant: deny + source: + address: 192.0.2.0 + wildcard_bits: 0.0.255.255 + destination: + any: true + protocol: eigrp + - remark: Example for overridden state + state: overridden + + # After state: + # ------------ + # + # ip access-list NewACL + # 10 deny eigrp 192.0.2.0 0.0.255.255 any + # 20 remark Example for overridden state + + # Using deleted: + # + # Before state: + # ------------- + # + # ip access-list ACL1v4 + # 10 permit ip any any + # 20 deny udp any any + # ip access-list ACL2v4 + # 10 permit ahp 192.0.2.0 0.0.0.255 any + # ip access-list ACL1v6 + # 10 permit sctp any any + # 20 remark IPv6 ACL + # ip access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + - name: Delete all ACLs + cisco.nxos.nxos_acls: + config: + state: deleted + + # After state: + # ----------- + # + + + # Before state: + # ------------- + # + # ip access-list ACL1v4 + # 10 permit ip any any + # 20 deny udp any any + # ip access-list ACL2v4 + # 10 permit ahp 192.0.2.0 0.0.0.255 any + # ip access-list ACL1v6 + # 10 permit sctp any any + # 20 remark IPv6 ACL + # ip access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + - name: Delete all ACLs in given AFI + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + state: deleted + + # After state: + # ------------ + # + # ip access-list ACL1v6 + # 10 permit sctp any any + # 20 remark IPv6 ACL + # ip access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + + + # Before state: + # ------------- + # + # ip access-list ACL1v4 + # 10 permit ip any any + # 20 deny udp any any + # ip access-list ACL2v4 + # 10 permit ahp 192.0.2.0 0.0.0.255 any + # ipv6 access-list ACL1v6 + # 10 permit sctp any any + # 20 remark IPv6 ACL + # ipv6 access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + - name: Delete specific ACLs + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: ACL1v4 + - name: ACL2v4 + - afi: ipv6 + acls: + - name: ACL1v6 + state: deleted + + # After state: + # ------------ + # ipv6 access-list ACL2v6 + # 10 deny ipv6 any 2001:db8:3000::/36 + # 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + # Using parsed + + - name: Parse given config to structured data + cisco.nxos.nxos_acls: + running_config: | + ip access-list ACL1v4 + 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin + ipv6 access-list ACL1v6 + 10 permit sctp any any + state: parsed + + # returns: + # parsed: + # - afi: ipv4 + # acls: + # - name: ACL1v4 + # aces: + # - grant: deny + # destination: + # address: 192.0.2.64 + # wildcard_bits: 0.0.0.255 + # source: + # any: true + # port_protocol: + # lt: 55 + # protocol: tcp + # protocol_options: + # tcp: + # ack: true + # fin: true + # sequence: 50 + # + # - afi: ipv6 + # acls: + # - name: ACL1v6 + # aces: + # - grant: permit + # sequence: 10 + # source: + # any: true + # destination: + # prefix: 2001:db8:12::/32 + # protocol: sctp + + + # Using gathered: + + # Before state: + # ------------ + # + # ip access-list ACL1v4 + # 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin + # ipv6 access-list ACL1v6 + # 10 permit sctp any any + + - name: Gather existing configuration + cisco.nxos.nxos_acls: + state: gathered + + # returns: + # gathered: + # - afi: ipv4 + # acls: + # - name: ACL1v4 + # aces: + # - grant: deny + # destination: + # address: 192.0.2.64 + # wildcard_bits: 0.0.0.255 + # source: + # any: true + # port_protocol: + # lt: 55 + # protocol: tcp + # protocol_options: + # tcp: + # ack: true + # fin: true + # sequence: 50 + + # - afi: ipv6 + # acls: + # - name: ACL1v6 + # aces: + # - grant: permit + # sequence: 10 + # source: + # any: true + # destination: + # prefix: 2001:db8:12::/32 + # protocol: sctp + + + # Using rendered + + - name: Render required configuration to be pushed to the device + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: ACL1v4 + aces: + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + lt: 55 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - afi: ipv6 + acls: + - name: ACL1v6 + aces: + - grant: permit + sequence: 10 + source: + any: true + destination: + prefix: 2001:db8:12::/32 + protocol: sctp + state: rendered + + # returns: + # rendered: + # ip access-list ACL1v4 + # 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin + # ipv6 access-list ACL1v6 + # 10 permit sctp any any + + + +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 model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
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 access-list ACL1v4', '10 permit ip any any precedence critical log', '20 deny tcp any lt smtp host 192.0.2.64 ack fin']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Adharsh Srivats Rangarajan (@adharshsrivatsr) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_banner_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_banner_module.rst new file mode 100644 index 00000000..76383b9d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_banner_module.rst @@ -0,0 +1,404 @@ +.. _cisco.nxos.nxos_banner_module: + + +********************** +cisco.nxos.nxos_banner +********************** + +**Manage multiline banners on Cisco NXOS devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This will configure both exec and motd banners on remote devices running Cisco NXOS. It allows playbooks to add or remove banner text from the active running configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ banner + +
+ string + / required +
+
+
    Choices: +
  • exec
  • +
  • motd
  • +
+
+
Specifies which banner that should be configured on the remote device.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ 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, with no empty lines. Requires state=present.
+
+
+ + +Notes +----- + +.. note:: + - Since responses from the device are always read with surrounding whitespaces stripped, tasks that configure banners with preceeding or trailing whitespaces will not be idempotent. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure the exec banner + cisco.nxos.nxos_banner: + banner: exec + text: | + this is my exec banner + that contains a multiline + string + state: present + - name: remove the motd banner + cisco.nxos.nxos_banner: + banner: motd + state: absent + - name: Configure banner from file + cisco.nxos.nxos_banner: + banner: motd + text: "{{ lookup('file', './config_partial/raw_banner.cfg') }}" + 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:
+
['banner exec', 'this is my exec banner', 'that contains a multiline', 'string']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_global_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_global_module.rst new file mode 100644 index 00000000..606bf4e9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_global_module.rst @@ -0,0 +1,559 @@ +.. _cisco.nxos.nxos_bfd_global_module: + + +************************** +cisco.nxos.nxos_bfd_global +************************** + +**Bidirectional Forwarding Detection (BFD) global-level configuration** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages Bidirectional Forwarding Detection (BFD) global-level configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ echo_interface + +
+ string +
+
+ +
Loopback interface used for echo frames.
+
Valid values are loopback interface name or 'deleted'.
+
Not supported on N5K/N6K
+
+
+ echo_rx_interval + +
+ integer +
+
+ +
BFD Echo receive interval in milliseconds.
+
+
+ fabricpath_interval + +
+ dictionary +
+
+ +
BFD fabricpath interval timer values.
+
Value must be a dict defining values for keys (tx, min_rx, and multiplier).
+
+
+ fabricpath_slow_timer + +
+ integer +
+
+ +
BFD fabricpath slow rate timer in milliseconds.
+
+
+ fabricpath_vlan + +
+ integer +
+
+ +
BFD fabricpath control vlan.
+
+
+ interval + +
+ dictionary +
+
+ +
BFD interval timer values.
+
Value must be a dict defining values for keys (tx, min_rx, and multiplier)
+
+
+ ipv4_echo_rx_interval + +
+ integer +
+
+ +
BFD IPv4 session echo receive interval in milliseconds.
+
+
+ ipv4_interval + +
+ dictionary +
+
+ +
BFD IPv4 interval timer values.
+
Value must be a dict defining values for keys (tx, min_rx, and multiplier).
+
+
+ ipv4_slow_timer + +
+ integer +
+
+ +
BFD IPv4 slow rate timer in milliseconds.
+
+
+ ipv6_echo_rx_interval + +
+ integer +
+
+ +
BFD IPv6 session echo receive interval in milliseconds.
+
+
+ ipv6_interval + +
+ dictionary +
+
+ +
BFD IPv6 interval timer values.
+
Value must be a dict defining values for keys (tx, min_rx, and multiplier).
+
+
+ ipv6_slow_timer + +
+ integer +
+
+ +
BFD IPv6 slow rate timer in milliseconds.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ slow_timer + +
+ integer +
+
+ +
BFD slow rate timer in milliseconds.
+
+
+ startup_timer + +
+ integer +
+
+ +
BFD delayed startup timer in seconds.
+
Not supported on N5K/N6K/N7K
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 9.2(2) + - BFD global will automatically enable 'feature bfd' if it is disabled. + - BFD global does not have a 'state' parameter. All of the BFD commands are unique and are defined if 'feature bfd' is enabled. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_bfd_global: + echo_interface: Ethernet1/2 + echo_rx_interval: 50 + interval: + tx: 50 + min_rx: 50 + multiplier: 4 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ cmds + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['bfd echo-interface loopback1', 'bfd slow-timer 2000']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Chris Van Heuveln (@chrisvanheuveln) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_interfaces_module.rst new file mode 100644 index 00000000..f9095be5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bfd_interfaces_module.rst @@ -0,0 +1,393 @@ +.. _cisco.nxos.nxos_bfd_interfaces_module: + + +****************************** +cisco.nxos.nxos_bfd_interfaces +****************************** + +**BFD interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages attributes of Bidirectional Forwarding Detection (BFD) on the interface. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
The provided configuration
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enable/Disable Bidirectional Forwarding Detection (BFD) on the interface.
+
+
+ echo + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enable/Disable BFD Echo functionality on the interface.
+
+
+ name + +
+ string +
+
+ +
The name 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 NX-OS device by executing the command show running-config | section '^interface|^feature bfd'.
+
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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 7.0(3)I5(1). + - Feature bfd should be enabled for this module. + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted + + - name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + state: deleted + + + # Using merged + + - name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + echo: enable + - name: Ethernet1/2 + bfd: disable + echo: disable + state: merged + + + # Using overridden + + - name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + echo: enable + - name: Ethernet1/2 + bfd: disable + echo: disable + state: overridden + + + # Using replaced + + - name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + echo: enable + - name: Ethernet1/2 + bfd: disable + echo: disable + state: replaced + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/800 + bfd: enable + echo: enable + - name: Ethernet1/801 + bfd: disable + echo: disable + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/800" + # - "bfd" + # - "bfd echo" + # - "interface Ethernet1/801" + # - "no bfd" + # - "no bfd echo" + + # Using parsed + + # parsed.cfg + # ------------ + + # feature bfd + # interface Ethernet1/800 + # no switchport + # no bfd + # no bfd echo + # interface Ethernet1/801 + # no switchport + # no bfd + # interface Ethernet1/802 + # no switchport + # no bfd echo + # interface mgmt0 + # ip address dhcp + # vrf member management + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_bfd_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + + # parsed: + # - bfd: disable + # echo: disable + # name: Ethernet1/800 + # - bfd: disable + # echo: enable + # name: Ethernet1/801 + # - bfd: enable + # echo: disable + # name: Ethernet1/802 + # - bfd: enable + # echo: enable + # name: mgmt0 + + # Using gathered + + # Existing device config state + # ------------------------------- + + # feature bfd + # interface Ethernet1/1 + # no switchport + # no bfd + # interface Ethernet1/2 + # no switchport + # no bfd echo + # interface mgmt0 + # ip address dhcp + # vrf member management + + - name: Gather bfd_interfaces facts from the device using nxos_bfd_interfaces + cisco.nxos.nxos_bfd_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # - name: Ethernet1/1 + # bfd: disable + # echo: enable + # - name: Ethernet1/3 + # echo: disable + # bfd: enable + # - name: mgmt0 + # bfd: enable + # echo: enable + + + +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/1', 'no bfd', 'no bfd echo']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Chris Van Heuveln (@chrisvanheuveln) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_af_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_af_module.rst new file mode 100644 index 00000000..473ab54f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_af_module.rst @@ -0,0 +1,899 @@ +.. _cisco.nxos.nxos_bgp_af_module: + + +********************** +cisco.nxos.nxos_bgp_af +********************** + +**Manages BGP Address-family configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages BGP Address-family configurations on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ additional_paths_install + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Install a backup path into the forwarding table and provide prefix independent convergence (PIC) in case of a PE-CE link failure.
+
+
+ additional_paths_receive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables the receive capability of additional paths for all of the neighbors under this address family for which the capability has not been disabled.
+
+
+ additional_paths_selection + +
+ string +
+
+ +
Configures the capability of selecting additional paths for a prefix. Valid values are a string defining the name of the route-map.
+
+
+ additional_paths_send + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables the send capability of additional paths for all of the neighbors under this address family for which the capability has not been disabled.
+
+
+ advertise_l2vpn_evpn + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise evpn routes.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
  • vpnv4
  • +
  • vpnv6
  • +
  • l2vpn
  • +
+
+
Address Family Identifier.
+
+
+ asn + +
+ string + / required +
+
+ +
BGP autonomous system number. Valid values are String, Integer in ASPLAIN or ASDOT notation.
+
+
+ client_to_client + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure client-to-client route reflection.
+
+
+ dampen_igp_metric + +
+ string +
+
+ +
Specify dampen value for IGP metric-related changes, in seconds. Valid values are integer and keyword 'default'.
+
+
+ dampening_half_time + +
+ string +
+
+ +
Specify decay half-life in minutes for route-flap dampening. Valid values are integer and keyword 'default'.
+
+
+ dampening_max_suppress_time + +
+ string +
+
+ +
Specify max suppress time for route-flap dampening stable route. Valid values are integer and keyword 'default'.
+
+
+ dampening_reuse_time + +
+ string +
+
+ +
Specify route reuse time for route-flap dampening. Valid values are integer and keyword 'default'.
+
+
+ dampening_routemap + +
+ string +
+
+ +
Specify route-map for route-flap dampening. Valid values are a string defining the name of the route-map.
+
+
+ dampening_state + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable route-flap dampening.
+
+
+ dampening_suppress_time + +
+ string +
+
+ +
Specify route suppress time for route-flap dampening. Valid values are integer and keyword 'default'.
+
+
+ default_information_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Default information originate.
+
+
+ default_metric + +
+ string +
+
+ +
Sets default metrics for routes redistributed into BGP. Valid values are Integer or keyword 'default'
+
+
+ distance_ebgp + +
+ string +
+
+ +
Sets the administrative distance for eBGP routes. Valid values are Integer or keyword 'default'.
+
+
+ distance_ibgp + +
+ string +
+
+ +
Sets the administrative distance for iBGP routes. Valid values are Integer or keyword 'default'.
+
+
+ distance_local + +
+ string +
+
+ +
Sets the administrative distance for local BGP routes. Valid values are Integer or keyword 'default'.
+
+
+ inject_map + +
+ list + / elements=list +
+
+ +
An array of route-map names which will specify prefixes to inject. Each array entry must first specify the inject-map name, secondly an exist-map name, and optionally the copy-attributes keyword which indicates that attributes should be copied from the aggregate. For example [['lax_inject_map', 'lax_exist_map'], ['nyc_inject_map', 'nyc_exist_map', 'copy-attributes'], ['fsd_inject_map', 'fsd_exist_map']].
+
+
+ maximum_paths + +
+ string +
+
+ +
Configures the maximum number of equal-cost paths for load sharing. Valid value is an integer in the range 1-64.
+
+
+ maximum_paths_ibgp + +
+ string +
+
+ +
Configures the maximum number of ibgp equal-cost paths for load sharing. Valid value is an integer in the range 1-64.
+
+
+ networks + +
+ list + / elements=list +
+
+ +
Networks to configure. Valid value is a list of network prefixes to advertise. The list must be in the form of an array. Each entry in the array must include a prefix address and an optional route-map. For example [['10.0.0.0/16', 'routemap_LA'], ['192.168.1.1', 'Chicago'], ['192.168.2.0/24'], ['192.168.3.0/24', 'routemap_NYC']].
+
+
+ next_hop_route_map + +
+ string +
+
+ +
Configure a route-map for valid nexthops. Valid values are a string defining the name of the route-map.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ redistribute + +
+ list + / elements=list +
+
+ +
A list of redistribute directives. Multiple redistribute entries are allowed. The list must be in the form of a nested array. the first entry of each array defines the source-protocol to redistribute from; the second entry defines a route-map name. A route-map is highly advised but may be optional on some platforms, in which case it may be omitted from the array list. For example [['direct', 'rm_direct'], ['lisp', 'rm_lisp']].
+
+
+ retain_route_target + +
+ string +
+
added in 1.1.0
+
+ +
Retains all of the routes or the routes which are part of configured route-map. Valid values are route-map names or keyword all or keyword default. all retains all the routes regardless of Target-VPN community. default will disable the retain route target option. If you are using route-map name please ensure that the name is not same as all and default.
+
+
+ safi + +
+ string + / required +
+
+
    Choices: +
  • unicast
  • +
  • multicast
  • +
  • evpn
  • +
+
+
Sub Address Family Identifier.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ suppress_inactive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertises only active routes to peers.
+
+
+ table_map + +
+ string +
+
+ +
Apply table-map to filter routes downloaded into URIB. Valid values are a string.
+
+
+ table_map_filter + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filters routes rejected by the route-map and does not download them to the RIB.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
Name of the VRF. The name 'default' is a valid VRF representing the global bgp.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the whole BGP ASN configuration + - Default, where supported, restores params default value. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # configure a simple address-family + - cisco.nxos.nxos_bgp_af: + asn: 65535 + vrf: TESTING + afi: ipv4 + safi: unicast + advertise_l2vpn_evpn: true + state: present + retain_route_target: all + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['router bgp 65535', 'vrf TESTING', 'address-family ipv4 unicast', 'advertise l2vpn evpn', 'retain route-target all']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_global_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_global_module.rst new file mode 100644 index 00000000..de51f7ac --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_global_module.rst @@ -0,0 +1,5376 @@ +.. _cisco.nxos.nxos_bgp_global_module: + + +************************** +cisco.nxos.nxos_bgp_global +************************** + +**BGP Global resource module.** + + +Version added: 1.4.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages global BGP configuration on devices running Cisco NX-OS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of BGP process configuration.
+
+
+ affinity_group + +
+ dictionary +
+
+ +
Configure an affinity group.
+
+
+ group_id + +
+ integer +
+
+ +
Affinity Group ID.
+
+
+ as_number + +
+ string +
+
+ +
Autonomous System Number of the router.
+
+
+ bestpath + +
+ dictionary +
+
+ +
Define the default bestpath selection algorithm.
+
+
+ always_compare_med + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Compare MED on paths from different AS.
+
+
+ as_path + +
+ dictionary +
+
+ +
AS-Path.
+
+
+ ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ignore AS-Path during bestpath selection.
+
+
+ multipath_relax + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Relax AS-Path restriction when choosing multipaths.
+
+
+ compare_neighborid + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When more paths are available than max path config, use neighborid as tie-breaker.
+
+
+ compare_routerid + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Compare router-id for identical EBGP paths.
+
+
+ cost_community_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ignore cost communities in bestpath selection.
+
+
+ igp_metric_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ignore IGP metric for next-hop during bestpath selection.
+
+
+ med + +
+ dictionary +
+
+ +
MED
+
+
+ confed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Compare MED only from paths originated from within a confederation.
+
+
+ missing_as_worst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Treat missing MED as highest MED.
+
+
+ non_deterministic + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Not always pick the best-MED path among paths from same AS.
+
+
+ cluster_id + +
+ string +
+
+ +
Configure Route Reflector Cluster-ID.
+
+
+ confederation + +
+ dictionary +
+
+ +
AS confederation parameters.
+
+
+ identifier + +
+ string +
+
+ +
Set routing domain confederation AS.
+
+
+ peers + +
+ list + / elements=string +
+
+ +
Peer ASs in BGP confederation.
+
+
+ disable_policy_batching + +
+ dictionary +
+
+ +
Disable batching evaluation of outbound policy for a peer.
+
+
+ ipv4 + +
+ dictionary +
+
+ +
IPv4 address-family settings.
+
+
+ prefix_list + +
+ string +
+
+ +
Name of prefix-list to apply.
+
+
+ ipv6 + +
+ dictionary +
+
+ +
IPv6 address-family settings.
+
+
+ prefix_list + +
+ string +
+
+ +
Name of prefix-list to apply.
+
+
+ nexthop + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Batching based on nexthop.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set policy batching.
+
+
+ dynamic_med_interval + +
+ integer +
+
+ +
Sets the interval for dampening of med changes.
+
+
+ enforce_first_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enforce neighbor AS is the first AS in AS-PATH attribute (EBGP).
+
+
+ enhanced_error + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BGP Enhanced error handling.
+
+
+ fabric_soo + +
+ string +
+
+ +
Fabric site of origin.
+
+
+ fast_external_fallover + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Immediately reset the session if the link to a directly connected BGP peer goes down.
+
+
+ flush_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Flush routes in RIB upon controlled restart.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Configure Graceful Restart functionality.
+
+
+ helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure Graceful Restart Helper mode functionality.
+
+
+ restart_time + +
+ integer +
+
+ +
Maximum time for restart advertised to peers.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful-restart.
+
+
+ stalepath_time + +
+ integer +
+
+ +
Maximum time to keep a restarting peer's stale routes.
+
+
+ graceful_shutdown + +
+ dictionary +
+
+ +
Graceful-shutdown for BGP protocol.
+
+
+ activate + +
+ dictionary +
+
+ +
Send graceful-shutdown community on all routes.
+
+
+ route_map + +
+ string +
+
+ +
Apply route-map to modify attributes for outbound.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activiate graceful-shutdown.
+
+
+ aware + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Lower preference of routes carrying graceful-shutdown community.
+
+
+ isolate + +
+ dictionary +
+
+ +
Isolate this router from BGP perspective.
+
+
+ include_local + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Withdraw both local and remote BGP routes.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Withdraw remote BGP routes to isolate this router.
+
+
+ log_neighbor_changes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log a message for neighbor up/down event.
+
+
+ maxas_limit + +
+ integer +
+
+ +
Allow AS-PATH attribute from EBGP neighbor imposing a limit on number of ASes.
+
+
+ neighbor_down + +
+ dictionary +
+
+ +
Handle BGP neighbor down event, due to various reasons.
+
+
+ fib_accelerate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Accelerate the hardware updates for IP/IPv6 adjacencies for neighbor.
+
+
+ neighbors + +
+ list + / elements=dictionary +
+
+ +
Configure BGP neighbors.
+
+
+ bmp_activate_server + +
+ integer +
+
+ +
Specify server ID for activating BMP monitoring for the peer.
+
+
+ capability + +
+ dictionary +
+
+ +
Capability.
+
+
+ suppress_4_byte_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress 4-byte AS Capability.
+
+
+ description + +
+ string +
+
+ +
Neighbor specific descripion.
+
+
+ disable_connected_check + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable check for directly connected peer.
+
+
+ dont_capability_negotiate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Don't negotiate capability with this neighbor.
+
+
+ dscp + +
+ string +
+
+ +
Set dscp value for tcp transport.
+
+
+ dynamic_capability + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Dynamic Capability
+
+
+ ebgp_multihop + +
+ integer +
+
+ +
Specify multihop TTL for remote peer.
+
+
+ graceful_shutdown + +
+ dictionary +
+
+ +
Graceful-shutdown for this neighbor.
+
+
+ activate + +
+ dictionary +
+
+ +
Send graceful-shutdown community.
+
+
+ route_map + +
+ string +
+
+ +
Apply route-map to modify attributes for outbound.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set activate.
+
+
+ inherit + +
+ dictionary +
+
+ +
Inherit a template.
+
+
+ peer + +
+ string +
+
+ +
Peer template to inherit.
+
+
+ peer_session + +
+ string +
+
+ +
Peer-session template to inherit.
+
+
+ local_as + +
+ string +
+
+ +
Specify the local-as number for the eBGP neighbor.
+
+
+ log_neighbor_changes + +
+ dictionary +
+
+ +
Log message for neighbor up/down event.
+
+
+ disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable logging of neighbor up/down event.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set log-neighbor-changes.
+
+
+ low_memory + +
+ dictionary +
+
+ +
Behaviour in low memory situations.
+
+
+ exempt + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not shutdown this peer when under memory pressure.
+
+
+ neighbor_address + +
+ string + / required +
+
+ +
IP address/Prefix of the neighbor or interface.
+
+
+ neighbor_affinity_group + +
+ dictionary +
+
+ +
Configure an affinity group.
+
+
+ group_id + +
+ integer +
+
+ +
Affinity Group ID.
+
+
+ password + +
+ dictionary +
+
+ +
Configure a password for neighbor.
+
+
+ encryption + +
+ integer +
+
+ +
0 specifies an UNENCRYPTED neighbor password.
+
3 specifies an 3DES ENCRYPTED neighbor password will follow.
+
7 specifies a Cisco type 7 ENCRYPTED neighbor password will follow.
+
+
+ key + +
+ string +
+
+ +
Authentication password.
+
+
+ path_attribute + +
+ list + / elements=dictionary +
+
+ +
BGP path attribute optional filtering.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • discard
  • +
  • treat-as-withdraw
  • +
+
+
Action.
+
+
+ range + +
+ dictionary +
+
+ +
Path attribute range.
+
+
+ end + +
+ integer +
+
+ +
Path attribute range end value.
+
+
+ start + +
+ integer +
+
+ +
Path attribute range start value.
+
+
+ type + +
+ integer +
+
+ +
Path attribute type
+
+
+ peer_type + +
+ string +
+
+
    Choices: +
  • fabric-border-leaf
  • +
  • fabric-external
  • +
+
+
Neighbor facing
+
+
+ remote_as + +
+ string +
+
+ +
Specify Autonomous System Number of the neighbor.
+
+
+ remove_private_as + +
+ dictionary +
+
+ +
Remove private AS number from outbound updates.
+
+
+ all + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All.
+
+
+ replace_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Replace.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove private AS.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shutdown this neighbor.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure keepalive and hold timers.
+
+
+ holdtime + +
+ integer +
+
+ +
Holdtime (seconds).
+
+
+ keepalive + +
+ integer +
+
+ +
Keepalive interval (seconds).
+
+
+ transport + +
+ dictionary +
+
+ +
BGP transport connection.
+
+
+ connection_mode + +
+ dictionary +
+
+ +
Specify type of connection.
+
+
+ passive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Allow passive connection setup only.
+
+
+ ttl_security + +
+ dictionary +
+
+ +
Enable TTL Security Mechanism.
+
+
+ hops + +
+ integer +
+
+ +
Specify hop count for remote peer.
+
+
+ update_source + +
+ string +
+
+ +
Specify source of BGP session and updates.
+
+
+ nexthop + +
+ dictionary +
+
+ +
Nexthop resolution options.
+
+
+ suppress_default_resolution + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prohibit use of default route for nexthop address resolution.
+
+
+ rd + +
+ dictionary +
+
+ +
Secondary Route Distinguisher for vxlan multisite border gateway.
+
+
+ dual + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Generate Secondary RD for all VRFs and L2VNIs.
+
+
+ id + +
+ integer +
+
+ +
Specify 2 byte value for ID.
+
+
+ reconnect_interval + +
+ integer +
+
+ +
Configure connection reconnect interval.
+
+
+ router_id + +
+ string +
+
+ +
Specify the IP address to use as router-id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shutdown BGP protocol.
+
+
+ suppress_fib_pending + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise only routes that are programmed in hardware to peers.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure bgp related timers.
+
+
+ bestpath_limit + +
+ dictionary +
+
+ +
Configure timeout for first bestpath after restart.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure update-delay-always option.
+
+
+ timeout + +
+ integer +
+
+ +
Bestpath timeout (seconds).
+
+
+ bgp + +
+ dictionary +
+
+ +
Configure different bgp keepalive and holdtimes.
+
+
+ holdtime + +
+ integer +
+
+ +
Holdtime (seconds).
+
+
+ keepalive + +
+ integer +
+
+ +
Keepalive interval (seconds).
+
+
+ prefix_peer_timeout + +
+ integer +
+
+ +
Prefix Peer timeout (seconds).
+
+
+ prefix_peer_wait + +
+ integer +
+
+ +
Configure wait timer for a prefix peer.
+
+
+ vrfs + +
+ list + / elements=dictionary +
+
+ +
Virtual Router Context configurations.
+
+
+ allocate_index + +
+ integer +
+
+ +
Configure allocate-index.
+
+
+ bestpath + +
+ dictionary +
+
+ +
Define the default bestpath selection algorithm.
+
+
+ always_compare_med + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Compare MED on paths from different AS.
+
+
+ as_path + +
+ dictionary +
+
+ +
AS-Path.
+
+
+ ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ignore AS-Path during bestpath selection.
+
+
+ multipath_relax + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Relax AS-Path restriction when choosing multipaths.
+
+
+ compare_neighborid + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When more paths are available than max path config, use neighborid as tie-breaker.
+
+
+ compare_routerid + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Compare router-id for identical EBGP paths.
+
+
+ cost_community_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ignore cost communities in bestpath selection.
+
+
+ igp_metric_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ignore IGP metric for next-hop during bestpath selection.
+
+
+ med + +
+ dictionary +
+
+ +
MED
+
+
+ confed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Compare MED only from paths originated from within a confederation.
+
+
+ missing_as_worst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Treat missing MED as highest MED.
+
+
+ non_deterministic + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Not always pick the best-MED path among paths from same AS.
+
+
+ cluster_id + +
+ string +
+
+ +
Configure Route Reflector Cluster-ID.
+
+
+ confederation + +
+ dictionary +
+
+ +
AS confederation parameters.
+
+
+ identifier + +
+ string +
+
+ +
Set routing domain confederation AS.
+
+
+ peers + +
+ list + / elements=string +
+
+ +
Peer ASs in BGP confederation.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Configure Graceful Restart functionality.
+
+
+ helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure Graceful Restart Helper mode functionality.
+
+
+ restart_time + +
+ integer +
+
+ +
Maximum time for restart advertised to peers.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful-restart.
+
+
+ stalepath_time + +
+ integer +
+
+ +
Maximum time to keep a restarting peer's stale routes.
+
+
+ local_as + +
+ string +
+
+ +
Specify the local-as for this vrf.
+
+
+ log_neighbor_changes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log a message for neighbor up/down event.
+
+
+ maxas_limit + +
+ integer +
+
+ +
Allow AS-PATH attribute from EBGP neighbor imposing a limit on number of ASes.
+
+
+ neighbor_down + +
+ dictionary +
+
+ +
Handle BGP neighbor down event, due to various reasons.
+
+
+ fib_accelerate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Accelerate the hardware updates for IP/IPv6 adjacencies for neighbor.
+
+
+ neighbors + +
+ list + / elements=dictionary +
+
+ +
Configure BGP neighbors.
+
+
+ bmp_activate_server + +
+ integer +
+
+ +
Specify server ID for activating BMP monitoring for the peer.
+
+
+ capability + +
+ dictionary +
+
+ +
Capability.
+
+
+ suppress_4_byte_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress 4-byte AS Capability.
+
+
+ description + +
+ string +
+
+ +
Neighbor specific descripion.
+
+
+ disable_connected_check + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable check for directly connected peer.
+
+
+ dont_capability_negotiate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Don't negotiate capability with this neighbor.
+
+
+ dscp + +
+ string +
+
+ +
Set dscp value for tcp transport.
+
+
+ dynamic_capability + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Dynamic Capability
+
+
+ ebgp_multihop + +
+ integer +
+
+ +
Specify multihop TTL for remote peer.
+
+
+ graceful_shutdown + +
+ dictionary +
+
+ +
Graceful-shutdown for this neighbor.
+
+
+ activate + +
+ dictionary +
+
+ +
Send graceful-shutdown community.
+
+
+ route_map + +
+ string +
+
+ +
Apply route-map to modify attributes for outbound.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set activate.
+
+
+ inherit + +
+ dictionary +
+
+ +
Inherit a template.
+
+
+ peer + +
+ string +
+
+ +
Peer template to inherit.
+
+
+ peer_session + +
+ string +
+
+ +
Peer-session template to inherit.
+
+
+ local_as + +
+ string +
+
+ +
Specify the local-as number for the eBGP neighbor.
+
+
+ log_neighbor_changes + +
+ dictionary +
+
+ +
Log message for neighbor up/down event.
+
+
+ disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable logging of neighbor up/down event.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set log-neighbor-changes.
+
+
+ low_memory + +
+ dictionary +
+
+ +
Behaviour in low memory situations.
+
+
+ exempt + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not shutdown this peer when under memory pressure.
+
+
+ neighbor_address + +
+ string + / required +
+
+ +
IP address/Prefix of the neighbor or interface.
+
+
+ neighbor_affinity_group + +
+ dictionary +
+
+ +
Configure an affinity group.
+
+
+ group_id + +
+ integer +
+
+ +
Affinity Group ID.
+
+
+ password + +
+ dictionary +
+
+ +
Configure a password for neighbor.
+
+
+ encryption + +
+ integer +
+
+ +
0 specifies an UNENCRYPTED neighbor password.
+
3 specifies an 3DES ENCRYPTED neighbor password will follow.
+
7 specifies a Cisco type 7 ENCRYPTED neighbor password will follow.
+
+
+ key + +
+ string +
+
+ +
Authentication password.
+
+
+ path_attribute + +
+ list + / elements=dictionary +
+
+ +
BGP path attribute optional filtering.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • discard
  • +
  • treat-as-withdraw
  • +
+
+
Action.
+
+
+ range + +
+ dictionary +
+
+ +
Path attribute range.
+
+
+ end + +
+ integer +
+
+ +
Path attribute range end value.
+
+
+ start + +
+ integer +
+
+ +
Path attribute range start value.
+
+
+ type + +
+ integer +
+
+ +
Path attribute type
+
+
+ peer_type + +
+ string +
+
+
    Choices: +
  • fabric-border-leaf
  • +
  • fabric-external
  • +
+
+
Neighbor facing
+
+
+ remote_as + +
+ string +
+
+ +
Specify Autonomous System Number of the neighbor.
+
+
+ remove_private_as + +
+ dictionary +
+
+ +
Remove private AS number from outbound updates.
+
+
+ all + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All.
+
+
+ replace_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Replace.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove private AS.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shutdown this neighbor.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure keepalive and hold timers.
+
+
+ holdtime + +
+ integer +
+
+ +
Holdtime (seconds).
+
+
+ keepalive + +
+ integer +
+
+ +
Keepalive interval (seconds).
+
+
+ transport + +
+ dictionary +
+
+ +
BGP transport connection.
+
+
+ connection_mode + +
+ dictionary +
+
+ +
Specify type of connection.
+
+
+ passive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Allow passive connection setup only.
+
+
+ ttl_security + +
+ dictionary +
+
+ +
Enable TTL Security Mechanism.
+
+
+ hops + +
+ integer +
+
+ +
Specify hop count for remote peer.
+
+
+ update_source + +
+ string +
+
+ +
Specify source of BGP session and updates.
+
+
+ reconnect_interval + +
+ integer +
+
+ +
Configure connection reconnect interval.
+
+
+ router_id + +
+ string +
+
+ +
Specify the IP address to use as router-id.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure bgp related timers.
+
+
+ bestpath_limit + +
+ dictionary +
+
+ +
Configure timeout for first bestpath after restart.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure update-delay-always option.
+
+
+ timeout + +
+ integer +
+
+ +
Bestpath timeout (seconds).
+
+
+ bgp + +
+ dictionary +
+
+ +
Configure different bgp keepalive and holdtimes.
+
+
+ holdtime + +
+ integer +
+
+ +
Holdtime (seconds).
+
+
+ keepalive + +
+ integer +
+
+ +
Keepalive interval (seconds).
+
+
+ prefix_peer_timeout + +
+ integer +
+
+ +
Prefix Peer timeout (seconds).
+
+
+ prefix_peer_wait + +
+ integer +
+
+ +
Configure wait timer for a prefix peer.
+
+
+ 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 NX-OS device by executing the command show running-config | section '^router 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: +
  • merged ←
  • +
  • replaced
  • +
  • deleted
  • +
  • purged
  • +
  • parsed
  • +
  • gathered
  • +
  • rendered
  • +
+
+
The state the configuration should be left in.
+
State purged removes all the BGP configurations from the target device. Use caution with this state.
+
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 a neighbor, or a vrf context that is to be removed. Please use the cisco.nxos.nxos_bgp_af or cisco.nxos.nxos_bgp_neighbor_af modules for prior cleanup.
+
Refer to examples for more details.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 9.3.6. + - This module works with connection ``network_cli`` and ``httpapi``. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # Nexus9000v# + + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_bgp_global: + config: + as_number: 65563 + router_id: 192.168.1.1 + bestpath: + as_path: + multipath_relax: True + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65040 + log_neighbor_changes: True + maxas_limit: 20 + neighbors: + - neighbor_address: 192.168.1.100 + neighbor_affinity_group: + group_id: 160 + bmp_activate_server: 1 + remote_as: 65563 + description: NBR-1 + low_memory: + exempt: True + - neighbor_address: 192.168.1.101 + remote_as: 65563 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-1 + allocate_index: 5000 + local_as: 200 + log_neighbor_changes: True + neighbors: + - neighbor_address: 198.51.100.1 + description: site-1-nbr-1 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: 65562 + - neighbor_address: 198.51.100.2 + remote_as: 65562 + description: site-1-nbr-2 + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + description: site-2-nbr-1 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: 65568 + neighbor_down: + fib_accelerate: True + + # Task output + # ------------- + # before: {} + # + # commands: + # - router bgp 65563 + # - bestpath as-path multipath-relax + # - bestpath compare-neighborid + # - bestpath cost-community ignore + # - confederation identifier 42 + # - log-neighbor-changes + # - maxas-limit 20 + # - neighbor-down fib-accelerate + # - router-id 192.168.1.1 + # - confederation peers 65020 65030 65040 + # - neighbor 192.168.1.100 + # - remote-as 65563 + # - affinity-group 160 + # - bmp-activate-server 1 + # - description NBR-1 + # - low-memory exempt + # - neighbor 192.168.1.101 + # - remote-as 65563 + # - password 7 12090404011C03162E + # - vrf site-1 + # - allocate-index 5000 + # - local-as 200 + # - log-neighbor-changes + # - neighbor 198.51.100.1 + # - remote-as 65562 + # - description site-1-nbr-1 + # - password 3 13D4D3549493D2877B1DC116EE27A6BE + # - neighbor 198.51.100.2 + # - remote-as 65562 + # - description site-1-nbr-2 + # - vrf site-2 + # - local-as 300 + # - log-neighbor-changes + # - neighbor-down fib-accelerate + # - neighbor 203.0.113.2 + # - remote-as 65568 + # - description site-2-nbr-1 + # - password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + # + # after: + # as_number: '65563' + # bestpath: + # as_path: + # multipath_relax: true + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65040' + # log_neighbor_changes: true + # maxas_limit: 20 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # - neighbor_address: 192.168.1.101 + # password: + # encryption: 7 + # key: 12090404011C03162E + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - allocate_index: 5000 + # local_as: '200' + # log_neighbor_changes: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 198.51.100.1 + # password: + # encryption: 3 + # key: 13D4D3549493D2877B1DC116EE27A6BE + # remote_as: '65562' + # - description: site-1-nbr-2 + # neighbor_address: 198.51.100.2 + # remote_as: '65562' + # vrf: site-1 + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - description: site-2-nbr-1 + # neighbor_address: 203.0.113.2 + # password: + # encryption: 3 + # key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + # remote_as: '65568' + # vrf: site-2 + + + # After state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65040 + # bestpath as-path multipath-relax + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 20 + # log-neighbor-changes + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # neighbor 192.168.1.101 + # remote-as 65563 + # password 7 12090404011C03162E + # vrf site-1 + # local-as 200 + # log-neighbor-changes + # allocate-index 5000 + # neighbor 198.51.100.1 + # remote-as 65562 + # description site-1-nbr-1 + # password 3 13D4D3549493D2877B1DC116EE27A6BE + # neighbor 198.51.100.2 + # remote-as 65562 + # description site-1-nbr-2 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # remote-as 65568 + # description site-2-nbr-1 + # password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + # Using replaced + + # Before state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65040 + # bestpath as-path multipath-relax + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 20 + # log-neighbor-changes + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # neighbor 192.168.1.101 + # remote-as 65563 + # password 7 12090404011C03162E + # vrf site-1 + # local-as 200 + # log-neighbor-changes + # allocate-index 5000 + # neighbor 198.51.100.1 + # remote-as 65562 + # description site-1-nbr-1 + # password 3 13D4D3549493D2877B1DC116EE27A6BE + # neighbor 198.51.100.2 + # remote-as 65562 + # description site-1-nbr-2 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # remote-as 65568 + # description site-2-nbr-1 + # password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + - name: Replace BGP configuration with provided configuration + cisco.nxos.nxos_bgp_global: + config: + as_number: 65563 + router_id: 192.168.1.1 + bestpath: + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65050 + maxas_limit: 40 + neighbors: + - neighbor_address: 192.168.1.100 + neighbor_affinity_group: + group_id: 160 + bmp_activate_server: 1 + remote_as: 65563 + description: NBR-1 + low_memory: + exempt: True + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + state: replaced + + # Task output + # ------------- + # before: + # as_number: '65563' + # bestpath: + # as_path: + # multipath_relax: true + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65040' + # log_neighbor_changes: true + # maxas_limit: 20 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # - neighbor_address: 192.168.1.101 + # password: + # encryption: 7 + # key: 12090404011C03162E + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - allocate_index: 5000 + # local_as: '200' + # log_neighbor_changes: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 198.51.100.1 + # password: + # encryption: 3 + # key: 13D4D3549493D2877B1DC116EE27A6BE + # remote_as: '65562' + # - description: site-1-nbr-2 + # neighbor_address: 198.51.100.2 + # remote_as: '65562' + # vrf: site-1 + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - description: site-2-nbr-1 + # neighbor_address: 203.0.113.2 + # password: + # encryption: 3 + # key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + # remote_as: '65568' + # vrf: site-2 + # + # commands: + # - router bgp 65563 + # - no bestpath as-path multipath-relax + # - no log-neighbor-changes + # - maxas-limit 40 + # - no confederation peers 65020 65030 65040 + # - confederation peers 65020 65030 65050 + # - no neighbor 192.168.1.101 + # - vrf site-2 + # - neighbor 203.0.113.2 + # - no remote-as 65568 + # - no description site-2-nbr-1 + # - password 7 12090404011C03162E + # - no vrf site-1 + + # after: + # as_number: '65563' + # bestpath: + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65050' + # maxas_limit: 40 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - neighbor_address: 203.0.113.2 + # password: + # encryption: 7 + # key: 12090404011C03162E + # vrf: site-2 + # + # After state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65050 + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 40 + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # password 7 12090404011C03162E + + # Using deleted + + # Before state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65040 + # bestpath as-path multipath-relax + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 20 + # log-neighbor-changes + # address-family ipv4 unicast + # default-metric 400 + # suppress-inactive + # default-information originate + # address-family ipv6 multicast + # wait-igp-convergence + # redistribute eigrp eigrp-1 route-map site-1-rmap + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # neighbor 192.168.1.101 + # remote-as 65563 + # password 7 12090404011C03162E + # vrf site-1 + # local-as 200 + # log-neighbor-changes + # allocate-index 5000 + # address-family ipv4 multicast + # maximum-paths 40 + # dampen-igp-metric 1200 + # neighbor 198.51.100.1 + # remote-as 65562 + # description site-1-nbr-1 + # password 3 13D4D3549493D2877B1DC116EE27A6BE + # neighbor 198.51.100.2 + # remote-as 65562 + # description site-1-nbr-2 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # remote-as 65568 + # description site-1-nbr-1 + # password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + - name: Delete BGP configurations handled by this module + cisco.nxos.nxos_bgp_global: + state: deleted + + # Task output + # ------------- + + # before: + # as_number: '65563' + # bestpath: + # as_path: + # multipath_relax: true + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65040' + # log_neighbor_changes: true + # maxas_limit: 20 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # - neighbor_address: 192.168.1.101 + # password: + # encryption: 7 + # key: 12090404011C03162E + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - allocate_index: 5000 + # local_as: '200' + # log_neighbor_changes: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 198.51.100.1 + # password: + # encryption: 3 + # key: 13D4D3549493D2877B1DC116EE27A6BE + # remote_as: '65562' + # - description: site-1-nbr-2 + # neighbor_address: 198.51.100.2 + # remote_as: '65562' + # vrf: site-1 + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 203.0.113.2 + # password: + # encryption: 3 + # key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + # remote_as: '65568' + # vrf: site-2 + # + # commands: + # - router bgp 65563 + # - no bestpath as-path multipath-relax + # - no bestpath compare-neighborid + # - no bestpath cost-community ignore + # - no confederation identifier 42 + # - no log-neighbor-changes + # - no maxas-limit 20 + # - no neighbor-down fib-accelerate + # - no router-id 192.168.1.1 + # - no confederation peers 65020 65030 65040 + # - no neighbor 192.168.1.100 + # - no neighbor 192.168.1.101 + # - no vrf site-1 + # - no vrf site-2 + # + # after: + # as_number: '65563' + # + # After state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # address-family ipv4 unicast + # default-metric 400 + # suppress-inactive + # default-information originate + # address-family ipv6 multicast + # wait-igp-convergence + # redistribute eigrp eigrp-1 route-map site-1-rmap + # + + # Using purged + + # Before state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65040 + # bestpath as-path multipath-relax + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 20 + # log-neighbor-changes + # address-family ipv4 unicast + # default-metric 400 + # suppress-inactive + # default-information originate + # address-family ipv6 multicast + # wait-igp-convergence + # redistribute eigrp eigrp-1 route-map site-1-rmap + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # neighbor 192.168.1.101 + # remote-as 65563 + # password 7 12090404011C03162E + # vrf site-1 + # local-as 200 + # log-neighbor-changes + # allocate-index 5000 + # address-family ipv4 multicast + # maximum-paths 40 + # dampen-igp-metric 1200 + # neighbor 198.51.100.1 + # remote-as 65562 + # description site-1-nbr-1 + # password 3 13D4D3549493D2877B1DC116EE27A6BE + # neighbor 198.51.100.2 + # remote-as 65562 + # description site-1-nbr-2 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # remote-as 65568 + # description site-1-nbr-1 + # password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + - name: Purge all BGP configurations from the device + cisco.nxos.nxos_bgp_global: + state: purged + + # Task output + # ------------- + + # before: + # as_number: '65563' + # bestpath: + # as_path: + # multipath_relax: true + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65040' + # log_neighbor_changes: true + # maxas_limit: 20 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # - neighbor_address: 192.168.1.101 + # password: + # encryption: 7 + # key: 12090404011C03162E + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - allocate_index: 5000 + # local_as: '200' + # log_neighbor_changes: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 198.51.100.1 + # password: + # encryption: 3 + # key: 13D4D3549493D2877B1DC116EE27A6BE + # remote_as: '65562' + # - description: site-1-nbr-2 + # neighbor_address: 198.51.100.2 + # remote_as: '65562' + # vrf: site-1 + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 203.0.113.2 + # password: + # encryption: 3 + # key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + # remote_as: '65568' + # vrf: site-2 + # + # commands: + # - no router bgp 65563 + # + # after: {} + # + # After state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # Nexus9000v# + + # Using rendered + + - name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65563 + router_id: 192.168.1.1 + bestpath: + as_path: + multipath_relax: True + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65040 + log_neighbor_changes: True + maxas_limit: 20 + neighbors: + - neighbor_address: 192.168.1.100 + neighbor_affinity_group: + group_id: 160 + bmp_activate_server: 1 + remote_as: 65563 + description: NBR-1 + low_memory: + exempt: True + - neighbor_address: 192.168.1.101 + remote_as: 65563 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-1 + allocate_index: 5000 + local_as: 200 + log_neighbor_changes: True + neighbors: + - neighbor_address: 198.51.100.1 + description: site-1-nbr-1 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: 65562 + - neighbor_address: 198.51.100.2 + remote_as: 65562 + description: site-1-nbr-2 + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + description: site-1-nbr-1 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: 65568 + neighbor_down: + fib_accelerate: True + + # Task Output (redacted) + # ----------------------- + # rendered: + # - router bgp 65563 + # - bestpath as-path multipath-relax + # - bestpath compare-neighborid + # - bestpath cost-community ignore + # - confederation identifier 42 + # - log-neighbor-changes + # - maxas-limit 20 + # - neighbor-down fib-accelerate + # - router-id 192.168.1.1 + # - confederation peers 65020 65030 65040 + # - neighbor 192.168.1.100 + # - remote-as 65563 + # - affinity-group 160 + # - bmp-activate-server 1 + # - description NBR-1 + # - low-memory exempt + # - neighbor 192.168.1.101 + # - remote-as 65563 + # - password 7 12090404011C03162E + # - vrf site-1 + # - allocate-index 5000 + # - local-as 200 + # - log-neighbor-changes + # - neighbor 198.51.100.1 + # - remote-as 65562 + # - description site-1-nbr-1 + # - password 3 13D4D3549493D2877B1DC116EE27A6BE + # - neighbor 198.51.100.2 + # - remote-as 65562 + # - description site-1-nbr-2 + # - vrf site-2 + # - local-as 300 + # - log-neighbor-changes + # - neighbor-down fib-accelerate + # - neighbor 203.0.113.2 + # - remote-as 65568 + # - description site-1-nbr-1 + # - password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + # Using parsed + + # parsed.cfg + # ------------ + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65040 + # bestpath as-path multipath-relax + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 20 + # log-neighbor-changes + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # neighbor 192.168.1.101 + # remote-as 65563 + # password 7 12090404011C03162E + # vrf site-1 + # local-as 200 + # log-neighbor-changes + # allocate-index 5000 + # neighbor 198.51.100.1 + # remote-as 65562 + # description site-1-nbr-1 + # password 3 13D4D3549493D2877B1DC116EE27A6BE + # neighbor 198.51.100.2 + # remote-as 65562 + # description site-1-nbr-2 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # remote-as 65568 + # description site-1-nbr-1 + # password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + - name: Parse externally provided BGP config + cisco.nxos.nxos_bgp_global: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # parsed: + # as_number: '65563' + # bestpath: + # as_path: + # multipath_relax: true + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65040' + # log_neighbor_changes: true + # maxas_limit: 20 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # - neighbor_address: 192.168.1.101 + # password: + # encryption: 7 + # key: 12090404011C03162E + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - allocate_index: 5000 + # local_as: '200' + # log_neighbor_changes: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 198.51.100.1 + # password: + # encryption: 3 + # key: 13D4D3549493D2877B1DC116EE27A6BE + # remote_as: '65562' + # - description: site-1-nbr-2 + # neighbor_address: 198.51.100.2 + # remote_as: '65562' + # vrf: site-1 + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - description: site-1-nbr-1 + # neighbor_address: 203.0.113.2 + # password: + # encryption: 3 + # key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + # remote_as: '65568' + # vrf: site-2 + + # Using gathered + + # existing config + # + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65563 + # router-id 192.168.1.1 + # confederation identifier 42 + # confederation peers 65020 65030 65050 + # bestpath cost-community ignore + # bestpath compare-neighborid + # neighbor-down fib-accelerate + # maxas-limit 40 + # neighbor 192.168.1.100 + # low-memory exempt + # bmp-activate-server 1 + # remote-as 65563 + # description NBR-1 + # affinity-group 160 + # vrf site-1 + # vrf site-2 + # local-as 300 + # neighbor-down fib-accelerate + # log-neighbor-changes + # neighbor 203.0.113.2 + # password 7 12090404011C03162E + + - name: Gather BGP facts using gathered + cisco.nxos.nxos_bgp_global: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # as_number: '65563' + # bestpath: + # compare_neighborid: true + # cost_community_ignore: true + # confederation: + # identifier: '42' + # peers: + # - '65020' + # - '65030' + # - '65050' + # maxas_limit: 40 + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - bmp_activate_server: 1 + # description: NBR-1 + # low_memory: + # exempt: true + # neighbor_address: 192.168.1.100 + # neighbor_affinity_group: + # group_id: 160 + # remote_as: '65563' + # router_id: 192.168.1.1 + # vrfs: + # - vrf: site-1 + # - local_as: '300' + # log_neighbor_changes: true + # neighbor_down: + # fib_accelerate: true + # neighbors: + # - neighbor_address: 203.0.113.2 + # password: + # encryption: 7 + # key: 12090404011C03162E + # vrf: site-2 + + # Remove a neighbor having AF configurations with state replaced (will fail) + + # Before state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65536 + # log-neighbor-changes + # maxas-limit 20 + # router-id 198.51.100.2 + # neighbor 203.0.113.2 + # address-family ipv4 unicast + # next-hop-self + # remote-as 65538 + # affinity-group 160 + # description NBR-1 + # low-memory exempt + # neighbor 192.0.2.1 + # remote-as 65537 + # password 7 12090404011C03162E + + - name: Remove a neighbor having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + state: replaced + + # Task output (redacted) + # ----------------------- + # fatal: [Nexus9000v]: FAILED! => changed=false + # msg: Neighbor 203.0.113.2 has address-family configurations. + # Please use the nxos_bgp_neighbor_af module to remove those first. + + # Remove a VRF having AF configurations with state replaced (will fail) + + # Before state: + # ------------- + # Nexus9000v# show running-config | section "^router bgp" + # router bgp 65536 + # log-neighbor-changes + # maxas-limit 20 + # router-id 198.51.100.2 + # neighbor 192.0.2.1 + # remote-as 65537 + # password 7 12090404011C03162E + # vrf site-1 + # address-family ipv4 unicast + # default-information originate + # neighbor 203.0.113.2 + # remote-as 65538 + # affinity-group 160 + # description NBR-1 + # low-memory exempt + # vrf site-2 + # neighbor-down fib-accelerate + + - name: Remove a VRF having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + vrfs: + - vrf: site-2 + neighbor_down: + fib_accelerate: True + state: replaced + + # Task output (redacted) + # ----------------------- + # fatal: [Nexus9000v]: FAILED! => changed=false + # msg: VRF site-1 has address-family configurations. + # Please use the nxos_bgp_af module to remove those first. + + + +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 model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
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 bgp 65563', 'maxas-limit 20', 'router-id 192.168.1.1', 'confederation peers 65020 65030 65040', 'neighbor 192.168.1.100', 'remote-as 65563', 'affinity-group 160', 'bmp-activate-server 1', 'description NBR-1', 'low-memory exempt', 'vrf site-1', 'log-neighbor-changes', 'neighbor 198.51.100.1', 'remote-as 65562', 'description site-1-nbr-1', 'password 3 13D4D3549493D2877B1DC116EE27A6BE']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nilashish Chakraborty (@NilashishC) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_module.rst new file mode 100644 index 00000000..8d4da320 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_module.rst @@ -0,0 +1,1073 @@ +.. _cisco.nxos.nxos_bgp_module: + + +******************* +cisco.nxos.nxos_bgp +******************* + +**(deprecated, removed after 2023-01-27) Manages BGP configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2023-01-27 +:Why: Updated module released with more functionality. +:Alternative: nxos_bgp_global + + + +Synopsis +-------- +- Manages BGP configurations on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ asn + +
+ string + / required +
+
+ +
BGP autonomous system number. Valid values are String, Integer in ASPLAIN or ASDOT notation.
+
+
+ bestpath_always_compare_med + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable MED comparison on paths from different autonomous systems.
+
+
+ bestpath_aspath_multipath_relax + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable load sharing across the providers with different (but equal-length) AS paths.
+
+
+ bestpath_compare_neighborid + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable neighborid. Use this when more paths available than max path config.
+
+
+ bestpath_compare_routerid + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable comparison of router IDs for identical eBGP paths.
+
+
+ bestpath_cost_community_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable Ignores the cost community for BGP best-path calculations.
+
+
+ bestpath_med_confed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable enforcement of bestpath to do a MED comparison only between paths originated within a confederation.
+
+
+ bestpath_med_missing_as_worst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable assigns the value of infinity to received routes that do not carry the MED attribute, making these routes the least desirable.
+
+
+ bestpath_med_non_deterministic + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable deterministic selection of the best MED pat from among the paths from the same autonomous system.
+
+
+ cluster_id + +
+ string +
+
+ +
Route Reflector Cluster-ID.
+
+
+ confederation_id + +
+ string +
+
+ +
Routing domain confederation AS.
+
+
+ confederation_peers + +
+ list + / elements=string +
+
+ +
AS confederation parameters.
+
+
+ disable_policy_batching + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable the batching evaluation of prefix advertisement to all peers.
+
+
+ disable_policy_batching_ipv4_prefix_list + +
+ string +
+
+ +
Enable/Disable the batching evaluation of prefix advertisements to all peers with prefix list.
+
+
+ disable_policy_batching_ipv6_prefix_list + +
+ string +
+
+ +
Enable/Disable the batching evaluation of prefix advertisements to all peers with prefix list.
+
+
+ enforce_first_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable enforces the neighbor autonomous system to be the first AS number listed in the AS path attribute for eBGP. On NX-OS, this property is only supported in the global BGP context.
+
+
+ event_history_cli + +
+ string +
+
+
    Choices: +
  • size_small
  • +
  • size_medium
  • +
  • size_large
  • +
  • size_disable
  • +
  • default
  • +
  • true
  • +
  • false
  • +
+
+
Enable/Disable cli event history buffer.
+
+
+ event_history_detail + +
+ string +
+
+
    Choices: +
  • size_small
  • +
  • size_medium
  • +
  • size_large
  • +
  • size_disable
  • +
  • default
  • +
  • true
  • +
  • false
  • +
+
+
Enable/Disable detail event history buffer.
+
+
+ event_history_events + +
+ string +
+
+
    Choices: +
  • size_small
  • +
  • size_medium
  • +
  • size_large
  • +
  • size_disable
  • +
  • default
  • +
  • true
  • +
  • false
  • +
+
+
Enable/Disable event history buffer.
+
+
+ event_history_periodic + +
+ string +
+
+
    Choices: +
  • size_small
  • +
  • size_medium
  • +
  • size_large
  • +
  • size_disable
  • +
  • default
  • +
  • true
  • +
  • false
  • +
+
+
Enable/Disable periodic event history buffer.
+
+
+ fast_external_fallover + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable immediately reset the session if the link to a directly connected BGP peer goes down. Only supported in the global BGP context.
+
+
+ flush_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable flush routes in RIB upon controlled restart. On NX-OS, this property is only supported in the global BGP context.
+
+
+ graceful_restart + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable graceful restart.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable graceful restart helper mode.
+
+
+ graceful_restart_timers_restart + +
+ string +
+
+ +
Set maximum time for a restart sent to the BGP peer.
+
+
+ graceful_restart_timers_stalepath_time + +
+ string +
+
+ +
Set maximum time that BGP keeps the stale routes from the restarting BGP peer.
+
+
+ isolate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable isolate this router from BGP perspective.
+
+
+ local_as + +
+ string +
+
+ +
Local AS number to be used within a VRF instance.
+
+
+ log_neighbor_changes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable message logging for neighbor up/down event.
+
+
+ maxas_limit + +
+ string +
+
+ +
Specify Maximum number of AS numbers allowed in the AS-path attribute. Valid values are between 1 and 512.
+
+
+ neighbor_down_fib_accelerate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable handle BGP neighbor down event, due to various reasons.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ reconnect_interval + +
+ string +
+
+ +
The BGP reconnection interval for dropped sessions. Valid values are between 1 and 60.
+
+
+ router_id + +
+ string +
+
+ +
Router Identifier (ID) of the BGP router VRF instance.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shutdown the BGP protocol.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ suppress_fib_pending + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable advertise only routes programmed in hardware to peers.
+
+
+ timer_bestpath_limit + +
+ string +
+
+ +
Specify timeout for the first best path after a restart, in seconds.
+
+
+ timer_bgp_hold + +
+ string +
+
+ +
Set BGP hold timer.
+
+
+ timer_bgp_keepalive + +
+ string +
+
+ +
Set BGP keepalive timer.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
Name of the VRF. The name 'default' is a valid VRF representing the global BGP.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the whole BGP ASN configuration when ``vrf=default`` or the whole VRF instance within the BGP process when using a different VRF. + - Default when supported restores params default value. + - Configuring global params is only permitted if ``vrf=default``. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Configure a simple ASN + cisco.nxos.nxos_bgp: + asn: 65535 + vrf: test + router_id: 192.0.2.1 + 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 +
commands sent to the device
+
+
Sample:
+
['router bgp 65535', 'vrf test', 'router-id 192.0.2.1']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_af_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_af_module.rst new file mode 100644 index 00000000..a8fb43c1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_af_module.rst @@ -0,0 +1,971 @@ +.. _cisco.nxos.nxos_bgp_neighbor_af_module: + + +******************************* +cisco.nxos.nxos_bgp_neighbor_af +******************************* + +**Manages BGP address-family's neighbors configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages BGP address-family's neighbors configurations on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ additional_paths_receive + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
  • inherit
  • +
+
+
Valid values are enable for basic command enablement; disable for disabling the command at the neighbor af level (it adds the disable keyword to the basic command); and inherit to remove the command at this level (the command value is inherited from a higher BGP layer).
+
+
+ additional_paths_send + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
  • inherit
  • +
+
+
Valid values are enable for basic command enablement; disable for disabling the command at the neighbor af level (it adds the disable keyword to the basic command); and inherit to remove the command at this level (the command value is inherited from a higher BGP layer).
+
+
+ advertise_map_exist + +
+ list + / elements=string +
+
+ +
Conditional route advertisement. This property requires two route maps, an advertise-map and an exist-map. Valid values are an array specifying both the advertise-map name and the exist-map name, or simply 'default' e.g. ['my_advertise_map', 'my_exist_map']. This command is mutually exclusive with the advertise_map_non_exist property.
+
+
+ advertise_map_non_exist + +
+ list + / elements=string +
+
+ +
Conditional route advertisement. This property requires two route maps, an advertise-map and an exist-map. Valid values are an array specifying both the advertise-map name and the non-exist-map name, or simply 'default' e.g. ['my_advertise_map', 'my_non_exist_map']. This command is mutually exclusive with the advertise_map_exist property.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
  • vpnv4
  • +
  • vpnv6
  • +
  • l2vpn
  • +
+
+
Address Family Identifier.
+
+
+ allowas_in + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activate allowas-in property
+
+
+ allowas_in_max + +
+ string +
+
+ +
Max-occurrences value for allowas_in. Valid values are an integer value or 'default'. This is mutually exclusive with allowas_in.
+
+
+ as_override + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activate the as-override feature.
+
+
+ asn + +
+ string + / required +
+
+ +
BGP autonomous system number. Valid values are String, Integer in ASPLAIN or ASDOT notation.
+
+
+ default_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activate the default-originate feature.
+
+
+ default_originate_route_map + +
+ string +
+
+ +
Route-map for the default_originate property. Valid values are a string defining a route-map name, or 'default'. This is mutually exclusive with default_originate.
+
+
+ disable_peer_as_check + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable checking of peer AS-number while advertising
+
+
+ filter_list_in + +
+ string +
+
+ +
Valid values are a string defining a filter-list name, or 'default'.
+
+
+ filter_list_out + +
+ string +
+
+ +
Valid values are a string defining a filter-list name, or 'default'.
+
+
+ max_prefix_interval + +
+ string +
+
+ +
Optional restart interval. Valid values are an integer. Requires max_prefix_limit. May not be combined with max_prefix_warning.
+
+
+ max_prefix_limit + +
+ string +
+
+ +
maximum-prefix limit value. Valid values are an integer value or 'default'.
+
+
+ max_prefix_threshold + +
+ string +
+
+ +
Optional threshold percentage at which to generate a warning. Valid values are an integer value. Requires max_prefix_limit.
+
+
+ max_prefix_warning + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Optional warning-only keyword. Requires max_prefix_limit. May not be combined with max_prefix_interval.
+
+
+ neighbor + +
+ string + / required +
+
+ +
Neighbor Identifier. Valid values are string. Neighbors may use IPv4 or IPv6 notation, with or without prefix length.
+
+
+ next_hop_self + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activate the next-hop-self feature.
+
+
+ next_hop_third_party + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activate the next-hop-third-party feature.
+
+
+ prefix_list_in + +
+ string +
+
+ +
Valid values are a string defining a prefix-list name, or 'default'.
+
+
+ prefix_list_out + +
+ string +
+
+ +
Valid values are a string defining a prefix-list name, or 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ rewrite_evpn_rt_asn + +
+ boolean +
+
added in 1.1.0
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Auto generate route targets for EBGP neighbor.
+
+
+ route_map_in + +
+ string +
+
+ +
Valid values are a string defining a route-map name, or 'default'.
+
+
+ route_map_out + +
+ string +
+
+ +
Valid values are a string defining a route-map name, or 'default'.
+
+
+ route_reflector_client + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Router reflector client.
+
+
+ safi + +
+ string + / required +
+
+
    Choices: +
  • unicast
  • +
  • multicast
  • +
  • evpn
  • +
+
+
Sub Address Family Identifier.
+
+
+ send_community + +
+ string +
+
+
    Choices: +
  • none
  • +
  • both
  • +
  • extended
  • +
  • standard
  • +
  • default
  • +
+
+
send-community attribute.
+
+
+ soft_reconfiguration_in + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • always
  • +
  • inherit
  • +
+
+
Valid values are 'enable' for basic command enablement; 'always' to add the always keyword to the basic command; and 'inherit' to remove the command at this level (the command value is inherited from a higher BGP layer).
+
+
+ soo + +
+ string +
+
+ +
Site-of-origin. Valid values are a string defining a VPN extcommunity or 'default'.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ suppress_inactive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
suppress-inactive feature.
+
+
+ unsuppress_map + +
+ string +
+
+ +
unsuppress-map. Valid values are a string defining a route-map name or 'default'.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
Name of the VRF. The name 'default' is a valid VRF representing the global bgp.
+
+
+ weight + +
+ string +
+
+ +
Weight value. Valid values are an integer value or 'default'.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the whole BGP address-family's neighbor configuration. + - Default, when supported, removes properties + - In order to default maximum-prefix configuration, only ``max_prefix_limit=default`` is needed. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure RR client + cisco.nxos.nxos_bgp_neighbor_af: + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + route_reflector_client: true + state: present + rewrite_evpn_rt_asn: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['router bgp 65535', 'neighbor 192.0.2.3', 'address-family ipv4 unicast', 'route-reflector-client', 'rewrite-evpn-rt-asn']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_module.rst new file mode 100644 index 00000000..dea87a23 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_bgp_neighbor_module.rst @@ -0,0 +1,794 @@ +.. _cisco.nxos.nxos_bgp_neighbor_module: + + +**************************** +cisco.nxos.nxos_bgp_neighbor +**************************** + +**(deprecated, removed after 2023-01-27) Manages BGP neighbors configurations.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2023-01-27 +:Why: Updated module released with more functionality. +:Alternative: nxos_bgp_global + + + +Synopsis +-------- +- Manages BGP neighbors configurations on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ asn + +
+ string + / required +
+
+ +
BGP autonomous system number. Valid values are string, Integer in ASPLAIN or ASDOT notation.
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enables/Disables BFD for a given neighbor.
+
Dependency: ''feature bfd''
+
+
+ capability_negotiation + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure whether or not to negotiate capability with this neighbor.
+
+
+ connected_check + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure whether or not to check for directly connected peer.
+
+
+ description + +
+ string +
+
+ +
Description of the neighbor.
+
+
+ dynamic_capability + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure whether or not to enable dynamic capability.
+
+
+ ebgp_multihop + +
+ string +
+
+ +
Specify multihop TTL for a remote peer. Valid values are integers between 2 and 255, or keyword 'default' to disable this property.
+
+
+ local_as + +
+ string +
+
+ +
Specify the local-as number for the eBGP neighbor. Valid values are String or Integer in ASPLAIN or ASDOT notation, or 'default', which means not to configure it.
+
+
+ log_neighbor_changes + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
  • inherit
  • +
+
+
Specify whether or not to enable log messages for neighbor up/down event.
+
+
+ low_memory_exempt + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Specify whether or not to shut down this neighbor under memory pressure.
+
+
+ maximum_peers + +
+ string +
+
+ +
Specify Maximum number of peers for this neighbor prefix Valid values are between 1 and 1000, or 'default', which does not impose the limit. Note that this parameter is accepted only on neighbors with address/prefix.
+
+
+ neighbor + +
+ string + / required +
+
+ +
Neighbor Identifier. Valid values are string. Neighbors may use IPv4 or IPv6 notation, with or without prefix length.
+
+
+ peer_type + +
+ string +
+
added in 1.1.0
+
+
    Choices: +
  • fabric_border_leaf
  • +
  • fabric_external
  • +
  • disable
  • +
+
+
Specify the peer type for BGP session.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ pwd + +
+ string +
+
+ +
Specify the password for neighbor. Valid value is string.
+
+
+ pwd_type + +
+ string +
+
+
    Choices: +
  • 3des
  • +
  • cisco_type_7
  • +
  • default
  • +
+
+
Specify the encryption type the password will use. Valid values are '3des' or 'cisco_type_7' encryption or keyword 'default'.
+
+
+ remote_as + +
+ string +
+
+ +
Specify Autonomous System Number of the neighbor. Valid values are String or Integer in ASPLAIN or ASDOT notation, or 'default', which means not to configure it.
+
+
+ remove_private_as + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
  • all
  • +
  • replace-as
  • +
+
+
Specify the config to remove private AS number from outbound updates. Valid values are 'enable' to enable this config, 'disable' to disable this config, 'all' to remove all private AS number, or 'replace-as', to replace the private AS number.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure to administratively shutdown this neighbor.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ suppress_4_byte_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure to suppress 4-byte AS Capability.
+
+
+ timers_holdtime + +
+ string +
+
+ +
Specify holdtime timer value. Valid values are integers between 0 and 3600 in terms of seconds, or 'default', which is 180.
+
+
+ timers_keepalive + +
+ string +
+
+ +
Specify keepalive timer value. Valid values are integers between 0 and 3600 in terms of seconds, or 'default', which is 60.
+
+
+ transport_passive_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Specify whether or not to only allow passive connection setup. Valid values are 'true', 'false', and 'default', which defaults to 'false'. This property can only be configured when the neighbor is in 'ip' address format without prefix length.
+
+
+ update_source + +
+ string +
+
+ +
Specify source interface of BGP session and updates.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
Name of the VRF. The name 'default' is a valid VRF representing the global bgp.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the whole BGP neighbor configuration. + - Default, where supported, restores params default value. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # create a new neighbor + - cisco.nxos.nxos_bgp_neighbor: + asn: 65535 + neighbor: 192.0.2.3 + local_as: 20 + remote_as: 30 + bfd: enable + description: just a description + update_source: Ethernet1/3 + state: present + peer_type: fabric_external + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['router bgp 65535', 'neighbor 192.0.2.3', 'remote-as 30', 'update-source Ethernet1/3', 'description just a description', 'local-as 20', 'peer-type fabric-external']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_cliconf.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_cliconf.rst new file mode 100644 index 00000000..b232f639 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_cliconf.rst @@ -0,0 +1,43 @@ +.. _cisco.nxos.nxos_cliconf: + + +*************** +cisco.nxos.nxos +*************** + +**Use NX-OS cliconf to run commands on Cisco NX-OS platform** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This nxos plugin provides low level abstraction apis for sending and receiving CLI commands from Cisco NX-OS network devices. + + + + + + + + + + + +Status +------ + + +Authors +~~~~~~~ + +- Ansible Networking Team + + +.. 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/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_command_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_command_module.rst new file mode 100644 index 00000000..a34abf02 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_command_module.rst @@ -0,0 +1,490 @@ +.. _cisco.nxos.nxos_command_module: + + +*********************** +cisco.nxos.nxos_command +*********************** + +**Run arbitrary command on Cisco NXOS devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Sends an arbitrary command to an NXOS 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 NXOS 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 retires as expired.
+
The commands argument also accepts an alternative form that allows for complex values that specify the command to run and the output format to return. This can be done on a command by command basis. The complex argument supports the keywords command and output where command is the command to run and output is one of 'text' or 'json'.
+
If a command sent to the device requires answering a prompt, it is possible to pass a dict containing command, answer and prompt. Common answers are 'y' or "\r" (carriage return, must be double quotes). See examples.
+
+
+ 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.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ retries + +
+ integer +
+
+ Default:
10
+
+
Specifies the number of retries a command should by 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. See examples.
+

aliases: waitfor
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: run show version on remote devices + cisco.nxos.nxos_command: + commands: show version + + - name: run show version and check to see if output contains Cisco + cisco.nxos.nxos_command: + commands: show version + wait_for: result[0] contains Cisco + + - name: run multiple commands on remote nodes + cisco.nxos.nxos_command: + commands: + - show version + - show interfaces + + - name: run multiple commands and evaluate the output + cisco.nxos.nxos_command: + commands: + - show version + - show interfaces + wait_for: + - result[0] contains Cisco + - result[1] contains loopback0 + + - name: run commands and specify the output format + cisco.nxos.nxos_command: + commands: + - command: show version + output: json + + - name: run commands that require answering a prompt + cisco.nxos.nxos_command: + commands: + - configure terminal + - command: no feature npv + prompt: Do you want to continue + answer: y + + + +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/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_config_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_config_module.rst new file mode 100644 index 00000000..8ecba27c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_config_module.rst @@ -0,0 +1,799 @@ +.. _cisco.nxos.nxos_config_module: + + +********************** +cisco.nxos.nxos_config +********************** + +**Manage Cisco NXOS configuration sections** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Cisco NXOS configurations use a simple block indent file syntax for segmenting configuration into sections. This module provides an implementation for working with NXOS configuration sections in a deterministic way. This module works with either CLI or NXAPI 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 True, if backup is set to false 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 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
  • +
  • intended
  • +
  • running
  • +
+
+
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.
+
+
+ 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 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.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ 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. replace config will only work for NX-OS versions that support `config replace`.
+
+
+ replace_src + +
+ string +
+
+ +
The replace_src argument provides path to the configuration file to load into the remote system. This argument is used to replace the entire config with a flat-file. This is used with argument replace with value config. This is mutually exclusive with the lines and src arguments. This argument will only work for NX-OS versions that support `config replace`. Use nxos_file_copy module to copy the flat file to remote device and then use the path with this argument. The configuration lines in the file 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.
+
+
+ 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. 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.6.
+
+
+ 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. The configuration lines in the source file should be similar to how it will appear if present in the running-configuration of the device including indentation to ensure idempotency and correct diff.
+
+
+ + +Notes +----- + +.. note:: + - 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. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure top level configuration and save it + cisco.nxos.nxos_config: + lines: hostname {{ inventory_hostname }} + save_when: modified + + - name: diff the running-config against a provided config + cisco.nxos.nxos_config: + diff_against: intended + intended_config: "{{ lookup('file', 'master.cfg') }}" + + - cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + before: no ip access-list test + match: exact + + - cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + before: no ip access-list test + replace: block + + - name: replace config with flat file + cisco.nxos.nxos_config: + replace_src: config.txt + replace: config + + - name: for idempotency, use full-form commands + cisco.nxos.nxos_config: + lines: + # - shut + - shutdown + # parents: int eth1/1 + parents: interface Ethernet1/1 + + - name: configurable backup path + cisco.nxos.nxos_config: + 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/nxos_config.2016-07-16@22:28:34
+
+
+ commands + +
+ list +
+
always +
The set of commands that will be pushed to the remote device
+
+
Sample:
+
['hostname foo', 'vlan 1', 'name default']
+
+
+ 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:
+
nxos_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/nxos_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 foo', 'vlan 1', 'name default']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_devicealias_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_devicealias_module.rst new file mode 100644 index 00000000..c84ce27c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_devicealias_module.rst @@ -0,0 +1,273 @@ +.. _cisco.nxos.nxos_devicealias_module: + + +*************************** +cisco.nxos.nxos_devicealias +*************************** + +**Configuration of device alias for Cisco NXOS MDS Switches.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Configuration of device alias for Cisco MDS NXOS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ da + +
+ list + / elements=dictionary +
+
+ +
List of device-alias to be added or removed
+
+
+ name + +
+ string + / required +
+
+ +
Name of the device-alias to be added or removed
+
+
+ pwwn + +
+ string +
+
+ +
pwwn to which the name needs to be associated with
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Removes the device-alias if set to True
+
+
+ distribute + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable device-alias distribution
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • basic
  • +
  • enhanced
  • +
+
+
Mode of devices-alias, basic or enhanced
+
+
+ rename + +
+ list + / elements=dictionary +
+
+ +
List of device-alias to be renamed
+
+
+ new_name + +
+ string + / required +
+
+ +
New name of the device-alias
+
+
+ old_name + +
+ string + / required +
+
+ +
Old name of the device-alias that needs to be renamed
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 8.4(1) + + + +Examples +-------- + +.. code-block:: yaml + + - name: Test that device alias module works + cisco.nxos.nxos_devicealias: + da: + - name: test1_add + pwwn: 56:2:22:11:22:88:11:67 + - name: test2_add + pwwn: 65:22:22:11:22:22:11:d + - name: dev1 + remove: true + - name: dev2 + remove: true + distribute: true + mode: enhanced + rename: + - new_name: bcd + old_name: abc + - new_name: bcd1 + old_name: abc1 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['terminal dont-ask', 'device-alias database', 'device-alias name somename pwwn 10:00:00:00:89:a1:01:03', 'device-alias name somename1 pwwn 10:00:00:00:89:a1:02:03', 'device-alias commit', 'no terminal dont-ask']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_global_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_global_module.rst new file mode 100644 index 00000000..1f9ae7ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_global_module.rst @@ -0,0 +1,355 @@ +.. _cisco.nxos.nxos_evpn_global_module: + + +*************************** +cisco.nxos.nxos_evpn_global +*************************** + +**Handles the EVPN control plane for VXLAN.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Handles the EVPN control plane for VXLAN. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ nv_overlay_evpn + +
+ boolean + / required +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
EVPN control plane.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ + +Notes +----- + +.. note:: + - This module is not supported on Nexus 3000 series of switches. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_evpn_global: + nv_overlay_evpn: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The set of commands to be sent to the remote device
+
+
Sample:
+
['nv overlay evpn']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_vni_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_vni_module.rst new file mode 100644 index 00000000..07956118 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_evpn_vni_module.rst @@ -0,0 +1,445 @@ +.. _cisco.nxos.nxos_evpn_vni_module: + + +************************ +cisco.nxos.nxos_evpn_vni +************************ + +**Manages Cisco EVPN VXLAN Network Identifier (VNI).** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages Cisco Ethernet Virtual Private Network (EVPN) VXLAN Network Identifier (VNI) configurations of a Nexus device. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ route_distinguisher + +
+ string +
+
+ +
The VPN Route Distinguisher (RD). The RD is combined with the IPv4 or IPv6 prefix learned by the PE router to create a globally unique address.
+
+
+ route_target_both + +
+ list + / elements=string +
+
+ +
Enables/Disables route-target settings for both import and export target communities using a single property.
+
+
+ route_target_export + +
+ list + / elements=string +
+
+ +
Sets the route-target 'export' extended communities.
+
+
+ route_target_import + +
+ list + / elements=string +
+
+ +
Sets the route-target 'import' extended communities.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ vni + +
+ string + / required +
+
+ +
The EVPN VXLAN Network Identifier.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - default, where supported, restores params default value. + - RD override is not permitted. You should set it to the default values first and then reconfigure it. + - ``route_target_both``, ``route_target_import`` and ``route_target_export valid`` values are a list of extended communities, (i.e. ['1.2.3.4:5', '33:55']) or the keywords 'auto' or 'default'. + - The ``route_target_both`` property is discouraged due to the inconsistent behavior of the property across Nexus platforms and image versions. For this reason it is recommended to use explicit ``route_target_export`` and ``route_target_import`` properties instead of ``route_target_both``. + - RD valid values are a string in one of the route-distinguisher formats, the keyword 'auto', or the keyword 'default'. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: vni configuration + cisco.nxos.nxos_evpn_vni: + vni: 6000 + route_distinguisher: 60:10 + route_target_import: + - 5000:10 + - 4100:100 + route_target_export: auto + route_target_both: default + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['evpn', 'vni 6000 l2', 'route-target import 5001:10']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_facts_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_facts_module.rst new file mode 100644 index 00000000..2cbfd732 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_facts_module.rst @@ -0,0 +1,766 @@ +.. _cisco.nxos.nxos_facts_module: + + +********************* +cisco.nxos.nxos_facts +********************* + +**Gets facts about NX-OS switches** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Collects facts from Cisco Nexus devices running the NX-OS operating system. Fact collection is supported over both Cli and Nxapi transports. This module prepends all of the base network fact keys with ``ansible_net_``. 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
+
+ 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. Valid subsets are 'all', 'bfd_interfaces', 'lag_interfaces', 'telemetry', 'vlans', 'lacp', 'lacp_interfaces', 'interfaces', 'l3_interfaces', 'l2_interfaces', 'lldp_global', 'acls', 'acl_interfaces', 'ospfv2'.
+
+
+ gather_subset + +
+ list + / elements=string +
+
+ Default:
"!config"
+
+
When supplied, this argument will restrict the facts collected to a given subset. Possible values for this argument include all, hardware, config, legacy, and interfaces. 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.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Gather all legacy facts + cisco.nxos.nxos_facts: + gather_subset: all + - name: Gather only the config and default facts + cisco.nxos.nxos_facts: + gather_subset: + - config + - name: Do not gather hardware facts + cisco.nxos.nxos_facts: + gather_subset: + - '!hardware' + - name: Gather legacy and resource facts + cisco.nxos.nxos_facts: + gather_subset: all + gather_network_resources: all + - name: Gather only the interfaces resource facts and no legacy facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - interfaces + - name: Gather interfaces resource and minimal legacy facts + cisco.nxos.nxos_facts: + gather_subset: min + gather_network_resources: interfaces + + + +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_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_license_hostid + +
+ string +
+
always +
The License host id of the device
+
+
+
+ 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 and CDP neighbors from the device. If both, CDP and LLDP neighbor data is present on one port, CDP is preferred.
+
+
+
+ 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
+
+
+
+ fan_info + +
+ dictionary +
+
when legacy is configured +
A hash of facts about fans in the remote device
+
+
+
+ hostname + +
+ dictionary +
+
when legacy is configured +
The configured hostname of the remote device
+
+
+
+ interfaces_list + +
+ dictionary +
+
when legacy is configured +
The list of interface names on the remote device
+
+
+
+ kickstart + +
+ string +
+
when legacy is configured +
The software version used to boot the system
+
+
+
+ module + +
+ dictionary +
+
when legacy is configured +
A hash of facts about the modules in a remote device
+
+
+
+ platform + +
+ string +
+
when legacy is configured +
The hardware platform reported by the remote device
+
+
+
+ power_supply_info + +
+ string +
+
when legacy is configured +
A hash of facts about the power supplies in the remote device
+
+
+
+ vlan_list + +
+ list +
+
when legacy is configured +
The list of VLAN IDs configured on the remote device
+
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_feature_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_feature_module.rst new file mode 100644 index 00000000..56976faa --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_feature_module.rst @@ -0,0 +1,382 @@ +.. _cisco.nxos.nxos_feature_module: + + +*********************** +cisco.nxos.nxos_feature +*********************** + +**Manage features in NX-OS switches.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Offers ability to enable and disable features in NX-OS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ feature + +
+ string + / required +
+
+ +
Name of feature.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • enabled ←
  • +
  • disabled
  • +
+
+
Desired state of the feature.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure lacp is enabled + cisco.nxos.nxos_feature: + feature: lacp + state: enabled + + - name: Ensure ospf is disabled + cisco.nxos.nxos_feature: + feature: ospf + state: disabled + + - name: Ensure vpc is enabled + cisco.nxos.nxos_feature: + feature: vpc + state: enabled + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The set of commands to be sent to the remote device
+
+
Sample:
+
['nv overlay evpn']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_file_copy_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_file_copy_module.rst new file mode 100644 index 00000000..174b03cb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_file_copy_module.rst @@ -0,0 +1,691 @@ +.. _cisco.nxos.nxos_file_copy_module: + + +************************* +cisco.nxos.nxos_file_copy +************************* + +**Copy a file to a remote NXOS device.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module supports two different workflows for copying a file to flash (or bootflash) on NXOS devices. Files can either be (1) pushed from the Ansible controller to the device or (2) pulled from a remote SCP file server to the device. File copies are initiated from the NXOS device to the remote SCP server. This module only supports the use of connection ``network_cli`` or ``Cli`` transport with connection ``local``. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- paramiko (required when file_pull is False) +- SCPClient (required when file_pull is False) +- pexpect (required when file_pull is True) + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ connect_ssh_port + +
+ - +
+
+ Default:
22
+
+
SSH server port used for file transfer.
+
+
+ file_pull + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
When (False) file is copied from the Ansible controller to the NXOS device.
+
When (True) file is copied from a remote SCP server to the NXOS device. In this mode, the file copy is initiated from the NXOS device.
+
If the file is already present on the device it will be overwritten and therefore the operation is NOT idempotent.
+
+
+ file_pull_compact + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
When file_pull is True, this is used to compact nxos image files. This option can only be used with nxos image files.
+
When (file_pull is False), this is not used.
+
+
+ file_pull_kstack + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
When file_pull is True, this can be used to speed up file copies when the nxos running image supports the use-kstack option.
+
When (file_pull is False), this is not used.
+
+
+ file_pull_protocol + +
+ string +
+
+
    Choices: +
  • scp ←
  • +
  • sftp
  • +
  • ftp
  • +
  • http
  • +
  • https
  • +
  • tftp
  • +
+
+
When file_pull is True, this can be used to define the transfer protocol for copying file from remote to the NXOS device.
+
When (file_pull is False), this is not used.
+
+
+ file_pull_timeout + +
+ - +
+
+ Default:
300
+
+
Use this parameter to set timeout in seconds, when transferring large files or when the network is slow.
+
When (file_pull is False), this is not used.
+
+
+ file_system + +
+ - +
+
+ Default:
"bootflash:"
+
+
The remote file system on the nxos device. If omitted, devices that support a file_system parameter will use their default values.
+
+
+ local_file + +
+ - +
+
+ +
When (file_pull is False) this is the path to the local file on the Ansible controller. The local directory must exist.
+
When (file_pull is True) this is the target file name on the NXOS device.
+
+
+ local_file_directory + +
+ - +
+
+ +
When (file_pull is True) file is copied from a remote SCP server to the NXOS device, and written to this directory on the NXOS device. If the directory does not exist, it will be created under the file_system. This is an optional parameter.
+
When (file_pull is False), this is not used.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ remote_file + +
+ - +
+
+ +
When (file_pull is False) this is the remote file path on the NXOS device. If omitted, the name of the local file will be used. The remote directory must exist.
+
When (file_pull is True) this is the full path to the file on the remote SCP server to be copied to the NXOS device.
+
+
+ remote_scp_server + +
+ - +
+
+ +
The remote scp server address when file_pull is True. This is required if file_pull is True.
+
When (file_pull is False), this is not used.
+
+
+ remote_scp_server_password + +
+ - +
+
+ +
The remote scp server password when file_pull is True. This is required if file_pull is True.
+
When (file_pull is False), this is not used.
+
+
+ remote_scp_server_user + +
+ - +
+
+ +
The remote scp server username when file_pull is True. This is required if file_pull is True.
+
When (file_pull is False), this is not used.
+
+
+ vrf + +
+ - +
+
+ Default:
"management"
+
+
The VRF used to pull the file. Useful when no vrf management is defined
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.0(3)I2(5), 7.0(3)I4(6), 7.0(3)I5(3), 7.0(3)I6(1), 7.0(3)I7(3), 6.0(2)A8(8), 7.0(3)F3(4), 7.3(0)D1(1), 8.3(0), 9.2, 9.3 + - When pushing files (file_pull is False) to the NXOS device, feature scp-server must be enabled. + - When pulling files (file_pull is True) to the NXOS device, feature scp-server is not required. + - When pulling files (file_pull is True) to the NXOS device, no transfer will take place if the file is already present. + - Check mode will tell you if the file would be copied. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # File copy from ansible controller to nxos device + - name: copy from server to device + cisco.nxos.nxos_file_copy: + local_file: ./test_file.txt + remote_file: test_file.txt + + # Initiate file copy from the nxos device to transfer file from an SCP server back to the nxos device + - name: initiate file copy from device + cisco.nxos.nxos_file_copy: + file_pull: true + local_file: xyz + local_file_directory: dir1/dir2/dir3 + remote_file: /mydir/abc + remote_scp_server: 192.168.0.1 + remote_scp_server_user: myUser + remote_scp_server_password: myPassword + vrf: management + + # Initiate file copy from the nxos device to transfer file from a ftp server back to the nxos device. + # remote_scp_server_user and remote_scp_server_password are used to login to the FTP server. + - name: initiate file copy from device + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_protocol: ftp + local_file: xyz + remote_file: /mydir/abc + remote_scp_server: 192.168.0.1 + remote_scp_server_user: myUser + remote_scp_server_password: myPassword + vrf: management + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
success +
Indicates whether or not the file was copied.
+
+
Sample:
+
True
+
+
+ local_file + +
+ string +
+
success +
The path of the local file.
+
+
Sample:
+
/path/to/local/file
+
+
+ remote_file + +
+ string +
+
success +
The path of the remote file.
+
+
Sample:
+
/path/to/remote/file
+
+
+ remote_scp_server + +
+ string +
+
success +
The name of the scp server when file_pull is True.
+
+
Sample:
+
fileserver.example.com
+
+
+ transfer_status + +
+ string +
+
success +
Whether a file was transferred to the nxos device.
+
+
Sample:
+
Sent
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +- Rewritten as a plugin by (@mikewiebe) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_module.rst new file mode 100644 index 00000000..f780b4a0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_module.rst @@ -0,0 +1,535 @@ +.. _cisco.nxos.nxos_gir_module: + + +******************* +cisco.nxos.nxos_gir +******************* + +**Trigger a graceful removal or insertion (GIR) of the switch.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Trigger a graceful removal or insertion (GIR) of the switch. +- GIR processing may take more than 2 minutes. Timeout settings are automatically extended to 200s when user timeout settings are insufficient. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specify desired state of the resource.
+
+
+ system_mode_maintenance + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When system_mode_maintenance=true it puts all enabled protocols in maintenance mode (using the isolate command). When system_mode_maintenance=false it puts all enabled protocols in normal mode (using the no isolate command).
+
+
+ system_mode_maintenance_dont_generate_profile + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When system_mode_maintenance_dont_generate_profile=true it prevents the dynamic searching of enabled protocols and executes commands configured in a maintenance-mode profile. Use this option if you want the system to use a maintenance-mode profile that you have created. When system_mode_maintenance_dont_generate_profile=false it prevents the dynamic searching of enabled protocols and executes commands configured in a normal-mode profile. Use this option if you want the system to use a normal-mode profile that you have created.
+
+
+ system_mode_maintenance_on_reload_reset_reason + +
+ string +
+
+
    Choices: +
  • hw_error
  • +
  • svc_failure
  • +
  • kern_failure
  • +
  • wdog_timeout
  • +
  • fatal_error
  • +
  • lc_failure
  • +
  • match_any
  • +
  • manual_reload
  • +
  • any_other
  • +
  • maintenance
  • +
+
+
Boots the switch into maintenance mode automatically in the event of a specified system crash. Note that not all reset reasons are applicable for all platforms. Also if reset reason is set to match_any, it is not idempotent as it turns on all reset reasons. If reset reason is match_any and state is absent, it turns off all the reset reasons.
+
+
+ system_mode_maintenance_shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shuts down all protocols, vPC domains, and interfaces except the management interface (using the shutdown command). This option is disruptive while system_mode_maintenance (which uses the isolate command) is not.
+
+
+ system_mode_maintenance_timeout + +
+ string +
+
+ +
Keeps the switch in maintenance mode for a specified number of minutes. Range is 5-65535.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state`` has effect only in combination with ``system_mode_maintenance_timeout`` or ``system_mode_maintenance_on_reload_reset_reason``. + - Using ``system_mode_maintenance`` and ``system_mode_maintenance_dont_generate_profile`` would make the module fail, but the system mode will be triggered anyway. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Trigger system maintenance mode + - cisco.nxos.nxos_gir: + system_mode_maintenance: true + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + # Trigger system normal mode + - cisco.nxos.nxos_gir: + system_mode_maintenance: false + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + # Configure on-reload reset-reason for maintenance mode + - cisco.nxos.nxos_gir: + system_mode_maintenance_on_reload_reset_reason: manual_reload + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + # Add on-reload reset-reason for maintenance mode + - cisco.nxos.nxos_gir: + system_mode_maintenance_on_reload_reset_reason: hw_error + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + # Remove on-reload reset-reason for maintenance mode + - cisco.nxos.nxos_gir: + system_mode_maintenance_on_reload_reset_reason: manual_reload + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + # Set timeout for maintenance mode + - cisco.nxos.nxos_gir: + system_mode_maintenance_timeout: 30 + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + # Remove timeout for maintenance mode + - cisco.nxos.nxos_gir: + system_mode_maintenance_timeout: 30 + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ final_system_mode + +
+ string +
+
verbose mode +
describe the last system mode
+
+
Sample:
+
normal
+
+
+ updates + +
+ list +
+
verbose mode +
commands sent to the device
+
+
Sample:
+
['terminal dont-ask', 'system mode maintenance timeout 10']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_profile_management_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_profile_management_module.rst new file mode 100644 index 00000000..47aa5f69 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_gir_profile_management_module.rst @@ -0,0 +1,468 @@ +.. _cisco.nxos.nxos_gir_profile_management_module: + + +************************************** +cisco.nxos.nxos_gir_profile_management +************************************** + +**Create a maintenance-mode or normal-mode profile for GIR.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manage a maintenance-mode or normal-mode profile with configuration commands that can be applied during graceful removal or graceful insertion. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ commands + +
+ list + / elements=string +
+
+ +
List of commands to be included into the profile.
+
+
+ mode + +
+ string + / required +
+
+
    Choices: +
  • maintenance
  • +
  • normal
  • +
+
+
Configure the profile as Maintenance or Normal mode.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specify desired state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the whole profile. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Create a maintenance-mode profile + - cisco.nxos.nxos_gir_profile_management: + mode: maintenance + commands: + - router eigrp 11 + - isolate + + # Remove the maintenance-mode profile + - cisco.nxos.nxos_gir_profile_management: + mode: maintenance + state: absent + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ list +
+
verbose mode +
list of profile entries after module execution.
+
+
Sample:
+
['router bgp 65535', 'isolate', 'router eigrp 10', 'isolate', 'diagnostic bootup level complete', 'router eigrp 11', 'isolate']
+
+
+ existing + +
+ list +
+
verbose mode +
list of existing profile commands.
+
+
Sample:
+
['router bgp 65535', 'isolate', 'router eigrp 10', 'isolate', 'diagnostic bootup level complete']
+
+
+ proposed + +
+ list +
+
verbose mode +
list of commands passed into module.
+
+
Sample:
+
['router eigrp 11', 'isolate']
+
+
+ updates + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['configure maintenance profile maintenance-mode', 'router eigrp 11', 'isolate']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_interfaces_module.rst new file mode 100644 index 00000000..176e5a3f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_interfaces_module.rst @@ -0,0 +1,343 @@ +.. _cisco.nxos.nxos_hsrp_interfaces_module: + + +******************************* +cisco.nxos.nxos_hsrp_interfaces +******************************* + +**HSRP interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages Hot Standby Router Protocol (HSRP) interface attributes. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
The provided configuration
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enable/Disable HSRP Bidirectional Forwarding Detection (BFD) on the interface.
+
+
+ name + +
+ string +
+
+ +
The name 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 NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 7.0(3)I5(1). + - Feature bfd should be enabled for this module. + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted + + - name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + - name: Ethernet1/2 + operation: deleted + + + # Using merged + + - name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + - name: Ethernet1/2 + bfd: disable + operation: merged + + + # Using overridden + + - name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + - name: Ethernet1/2 + bfd: disable + operation: overridden + + + # Using replaced + + - name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + - name: Ethernet1/2 + bfd: disable + operation: replaced + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/800 + bfd: enable + - name: Ethernet1/801 + bfd: enable + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/800" + # - "hsrp bfd" + # - "interface Ethernet1/801" + # - "hsrp bfd" + + # Using parsed + + # parsed.cfg + # ------------ + # interface Ethernet1/800 + # no switchport + # hsrp bfd + # interface Ethernet1/801 + # no switchport + # hsrp bfd + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_hsrp_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + + # parsed: + # - name: Ethernet1/800 + # bfd: enable + # - name: Ethernet1/801 + # bfd: enable + + # Using gathered + + # Existing device config state + # ------------------------------- + + # interface Ethernet1/1 + # no switchport + # hsrp bfd + # interface Ethernet1/2 + # no switchport + # hsrp bfd + # interface Ethernet1/3 + # no switchport + + - name: Gather hsrp_interfaces facts from the device using nxos_hsrp_interfaces + cisco.nxos.nxos_hsrp_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + + # gathered: + # - name: Ethernet1/1 + # bfd: enable + # - name: Ethernet1/2 + # bfd: enable + + + +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 Ethernet1/1', 'hsrp bfd']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Chris Van Heuveln (@chrisvanheuveln) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_module.rst new file mode 100644 index 00000000..4402f951 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_hsrp_module.rst @@ -0,0 +1,539 @@ +.. _cisco.nxos.nxos_hsrp_module: + + +******************** +cisco.nxos.nxos_hsrp +******************** + +**Manages HSRP configuration on NX-OS switches.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages HSRP configuration on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ auth_string + +
+ string +
+
+ +
Authentication string. If this needs to be hidden(for md5 type), the string should be 7 followed by the key string. Otherwise, it can be 0 followed by key string or just key string (for backward compatibility). For text type, this should be just be a key string. if this is 'default', authentication is removed.
+
+
+ auth_type + +
+ string +
+
+
    Choices: +
  • text
  • +
  • md5
  • +
+
+
Authentication type.
+
+
+ group + +
+ string + / required +
+
+ +
HSRP group number.
+
+
+ interface + +
+ string + / required +
+
+ +
Full name of interface that is being managed for HSRP.
+
+
+ preempt + +
+ string +
+
+
    Choices: +
  • enabled
  • +
  • disabled
  • +
+
+
Enable/Disable preempt.
+
+
+ priority + +
+ string +
+
+ +
HSRP priority or keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specify desired state of the resource.
+
+
+ version + +
+ string +
+
+
    Choices: +
  • 1
  • +
  • 2
  • +
+ Default:
1
+
+
HSRP version.
+
+
+ vip + +
+ string +
+
+ +
HSRP virtual IP address or keyword 'default'
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - HSRP feature needs to be enabled first on the system. + - SVIs must exist before using this module. + - Interface must be a L3 port before using this module. + - HSRP cannot be configured on loopback interfaces. + - MD5 authentication is only possible with HSRPv2 while it is ignored if HSRPv1 is used instead, while it will not raise any error. Here we allow MD5 authentication only with HSRPv2 in order to enforce better practice. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure HSRP is configured with following params on a SVI + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + + - name: Ensure HSRP is configured with following params on a SVI with clear text authentication + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + auth_type: text + auth_string: CISCO + + - name: Ensure HSRP is configured with md5 authentication and clear authentication + string + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + auth_type: md5 + auth_string: 0 1234 + + - name: Ensure HSRP is configured with md5 authentication and hidden authentication + string + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + auth_type: md5 + auth_string: 7 1234 + + - name: Remove HSRP config for given interface, group, and VIP + cisco.nxos.nxos_hsrp: + group: 10 + interface: vlan10 + vip: 10.1.1.1 + 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 +
commands sent to the device
+
+
Sample:
+
['interface vlan10', 'hsrp version 2', 'hsrp 30', 'ip 10.30.1.1']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_httpapi.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_httpapi.rst new file mode 100644 index 00000000..61549c9f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_httpapi.rst @@ -0,0 +1,43 @@ +.. _cisco.nxos.nxos_httpapi: + + +*************** +cisco.nxos.nxos +*************** + +**Use NX-API to run commands on Cisco NX-OS platform** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This plugin provides low level abstraction APIs for sending and receiving commands using NX-API with devices running Cisco NX-OS. + + + + + + + + + + + +Status +------ + + +Authors +~~~~~~~ + +- Ansible Networking Team + + +.. 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/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_interface_module.rst new file mode 100644 index 00000000..1c51f5e4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_interface_module.rst @@ -0,0 +1,693 @@ +.. _cisco.nxos.nxos_igmp_interface_module: + + +****************************** +cisco.nxos.nxos_igmp_interface +****************************** + +**Manages IGMP interface configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages IGMP interface configuration settings. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ group_timeout + +
+ string +
+
+ +
Sets the group membership timeout for IGMPv2. Values can range from 3 to 65,535 seconds or keyword 'default'. The default is 260 seconds.
+
+
+ immediate_leave + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables the device to remove the group entry from the multicast routing table immediately upon receiving a leave message for the group. Use this command to minimize the leave latency of IGMPv2 group memberships on a given IGMP interface because the device does not send group-specific queries. The default is disabled.
+
+
+ interface + +
+ string + / required +
+
+ +
The full interface name for IGMP configuration. e.g. Ethernet1/2.
+
+
+ last_member_qrt + +
+ string +
+
+ +
Sets the query interval waited after sending membership reports before the software deletes the group state. Values can range from 1 to 25 seconds or keyword 'default'. The default is 1 second.
+
+
+ last_member_query_count + +
+ string +
+
+ +
Sets the number of times that the software sends an IGMP query in response to a host leave message. Values can range from 1 to 5 or keyword 'default'. The default is 2.
+
+
+ oif_ps + +
+ raw +
+
+ +
Configure prefixes and sources for static outgoing interface (OIF). This is a list of dict where each dict has source and prefix defined or just prefix if source is not needed. The specified values will be configured on the device and if any previous prefix/sources exist, they will be removed. Keyword 'default' is also accepted which removes all existing prefix/sources.
+
+
+ oif_routemap + +
+ string +
+
+ +
Configure a routemap for static outgoing interface (OIF) or keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ querier_timeout + +
+ string +
+
+ +
Sets the querier timeout that the software uses when deciding to take over as the querier. Values can range from 1 to 65535 seconds or keyword 'default'. The default is 255 seconds.
+
+
+ query_interval + +
+ string +
+
+ +
Sets the frequency at which the software sends IGMP host query messages. Values can range from 1 to 18000 seconds or keyword 'default'. The default is 125 seconds.
+
+
+ query_mrt + +
+ string +
+
+ +
Sets the response time advertised in IGMP queries. Values can range from 1 to 25 seconds or keyword 'default'. The default is 10 seconds.
+
+
+ report_llg + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configures report-link-local-groups. Enables sending reports for groups in 224.0.0.0/24. Reports are always sent for nonlink local groups. By default, reports are not sent for link local groups.
+
+
+ restart + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Restart IGMP. This is NOT idempotent as this is action only.
+
+
+ robustness + +
+ string +
+
+ +
Sets the robustness variable. Values can range from 1 to 7 or keyword 'default'. The default is 2.
+
+
+ startup_query_count + +
+ string +
+
+ +
Query count used when the IGMP process starts up. The range is from 1 to 10 or keyword 'default'. The default is 2.
+
+
+ startup_query_interval + +
+ string +
+
+ +
Query interval used when the IGMP process starts up. The range is from 1 to 18000 or keyword 'default'. The default is 31.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
  • default
  • +
+
+
Manages desired state of the resource.
+
+
+ version + +
+ string +
+
+
    Choices: +
  • 2
  • +
  • 3
  • +
  • default
  • +
+
+
IGMP version. It can be 2 or 3 or keyword 'default'.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - When ``state=default``, supported params will be reset to a default state. These include ``version``, ``startup_query_interval``, ``startup_query_count``, ``robustness``, ``querier_timeout``, ``query_mrt``, ``query_interval``, ``last_member_qrt``, ``last_member_query_count``, ``group_timeout``, ``report_llg``, and ``immediate_leave``. + - When ``state=absent``, all configs for ``oif_ps``, and ``oif_routemap`` will be removed. + - PIM must be enabled to use this module. + - This module is for Layer 3 interfaces. + - Route-map check not performed (same as CLI) check when configuring route-map with 'static-oif' + - If restart is set to true with other params set, the restart will happen last, i.e. after the configuration takes place. However, 'restart' itself is not idempotent as it is an action and not configuration. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_igmp_interface: + interface: ethernet1/32 + startup_query_interval: 30 + oif_ps: + - {prefix: 238.2.2.6} + - {source: 192.168.0.1, prefix: 238.2.2.5} + state: present + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of igmp interface configuration after module execution
+
+
Sample:
+
{'startup_query_count': '30', 'oif_ps': [{'prefix': '238.2.2.6'}, {'source': '192.168.0.1', 'prefix': '238.2.2.5'}]}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing igmp_interface configuration
+
+
Sample:
+
{'startup_query_count': '2', 'oif_ps': []}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'startup_query_count': '30', 'oif_ps': [{'prefix': '238.2.2.6'}, {'source': '192.168.0.1', 'prefix': '238.2.2.5'}]}
+
+
+ updates + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['interface Ethernet1/32', 'ip igmp startup-query-count 30', 'ip igmp static-oif 238.2.2.6', 'ip igmp static-oif 238.2.2.5 source 192.168.0.1']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_module.rst new file mode 100644 index 00000000..da41da28 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_module.rst @@ -0,0 +1,424 @@ +.. _cisco.nxos.nxos_igmp_module: + + +******************** +cisco.nxos.nxos_igmp +******************** + +**Manages IGMP global configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages IGMP global configuration configuration settings. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ enforce_rtr_alert + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables or disables the enforce router alert option check for IGMPv2 and IGMPv3 packets.
+
+
+ flush_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Removes routes when the IGMP process is restarted. By default, routes are not flushed.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ restart + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Restarts the igmp process (using an exec config command).
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • default
  • +
+
+
Manages desired state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - When ``state=default``, all supported params will be reset to a default state. + - If restart is set to true with other params set, the restart will happen last, i.e. after the configuration takes place. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Default igmp global params (all params except restart) + cisco.nxos.nxos_igmp: + state: default + + - name: Ensure the following igmp global config exists on the device + cisco.nxos.nxos_igmp: + flush_routes: true + enforce_rtr_alert: true + + - name: Restart the igmp process + cisco.nxos.nxos_igmp: + restart: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ updates + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['ip igmp flush-routes']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_snooping_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_snooping_module.rst new file mode 100644 index 00000000..08d6e321 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_igmp_snooping_module.rst @@ -0,0 +1,458 @@ +.. _cisco.nxos.nxos_igmp_snooping_module: + + +***************************** +cisco.nxos.nxos_igmp_snooping +***************************** + +**Manages IGMP snooping global configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages IGMP snooping global configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ group_timeout + +
+ string +
+
+ +
Group membership timeout value for all VLANs on the device. Accepted values are integer in range 1-10080, never and default.
+
+
+ link_local_grp_supp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Global link-local groups suppression.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ report_supp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Global IGMPv1/IGMPv2 Report Suppression.
+
+
+ snooping + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables/disables IGMP snooping on the switch.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • default
  • +
+
+
Manage the state of the resource.
+
+
+ v3_report_supp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Global IGMPv3 Report Suppression and Proxy Reporting.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - When ``state=default``, params will be reset to a default state. + - ``group_timeout`` also accepts *never* as an input. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure igmp snooping params supported in this module are in there default state + - cisco.nxos.nxos_igmp_snooping: + state: default + + # ensure following igmp snooping params are in the desired state + - cisco.nxos.nxos_igmp_snooping: + group_timeout: never + snooping: true + link_local_grp_supp: false + optimize_mcast_flood: false + report_supp: true + v3_report_supp: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['ip igmp snooping link-local-groups-suppression', 'ip igmp snooping group-timeout 50', 'no ip igmp snooping report-suppression', 'no ip igmp snooping v3-report-suppression', 'no ip igmp snooping']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_install_os_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_install_os_module.rst new file mode 100644 index 00000000..af745704 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_install_os_module.rst @@ -0,0 +1,416 @@ +.. _cisco.nxos.nxos_install_os_module: + + +************************** +cisco.nxos.nxos_install_os +************************** + +**Set boot options like boot, kickstart image and issu.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Install an operating system by setting the boot options like boot image and kickstart image and optionally select to install using ISSU (In Server Software Upgrade). + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ issu + +
+ string +
+
+
    Choices: +
  • required
  • +
  • desired
  • +
  • yes
  • +
  • no ←
  • +
+
+
Upgrade using In Service Software Upgrade (ISSU). (Supported on N5k, N7k, N9k platforms)
+
Selecting 'required' or 'yes' means that upgrades will only proceed if the switch is capable of ISSU.
+
Selecting 'desired' means that upgrades will use ISSU if possible but will fall back to disruptive upgrade if needed.
+
Selecting 'no' means do not use ISSU. Forced disruptive.
+
+
+ kickstart_image_file + +
+ string +
+
+ +
Name of the kickstart image file on flash. (Not required on all Nexus platforms)
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ system_image_file + +
+ string + / required +
+
+ +
Name of the system (or combined) image file on flash.
+
+
+ + +Notes +----- + +.. note:: + - Tested against the following platforms and images - N9k 7.0(3)I4(6), 7.0(3)I5(3), 7.0(3)I6(1), 7.0(3)I7(1), 7.0(3)F2(2), 7.0(3)F3(2) - N3k 6.0(2)A8(6), 6.0(2)A8(8), 7.0(3)I6(1), 7.0(3)I7(1) - N7k 7.3(0)D1(1), 8.0(1), 8.1(1), 8.2(1) + - This module requires both the ANSIBLE_PERSISTENT_CONNECT_TIMEOUT and ANSIBLE_PERSISTENT_COMMAND_TIMEOUT timers to be set to 600 seconds or higher. The module will exit if the timers are not set properly. + - When using connection local, ANSIBLE_PERSISTENT_CONNECT_TIMEOUT and ANSIBLE_PERSISTENT_COMMAND_TIMEOUT can only be set using ENV variables or the ansible.cfg file. + - Do not include full file paths, just the name of the file(s) stored on the top level flash directory. + - This module attempts to install the software immediately, which may trigger a reboot. + - In check mode, the module will indicate if an upgrade is needed and whether or not the upgrade is disruptive or non-disruptive(ISSU). + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Install OS on N9k + check_mode: no + cisco.nxos.nxos_install_os: + system_image_file: nxos.7.0.3.I6.1.bin + issu: desired + + - name: Wait for device to come back up with new image + wait_for: + port: 22 + state: started + timeout: 500 + delay: 60 + host: '{{ inventory_hostname }}' + + - name: Check installed OS for newly installed version + nxos_command: + commands: [show version | json] + provider: '{{ connection }}' + register: output + - assert: + that: + - output['stdout'][0]['kickstart_ver_str'] == '7.0(3)I6(1)' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ install_state + +
+ dictionary +
+
always +
Boot and install information.
+
+
Sample:
+
{'install_state': ['Compatibility check is done:', 'Module bootable Impact Install-type Reason', '------ -------- -------------- ------------ ------', ' 1 yes non-disruptive reset ', 'Images will be upgraded according to following table:', 'Module Image Running-Version(pri:alt) New-Version Upg-Required', '------ ---------- ---------------------------------------- -------------------- ------------', ' 1 nxos 7.0(3)I6(1) 7.0(3)I7(1) yes', ' 1 bios v4.4.0(07/12/2017) v4.4.0(07/12/2017) no']}
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbibo (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_module.rst new file mode 100644 index 00000000..8c65c261 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_module.rst @@ -0,0 +1,1042 @@ +.. _cisco.nxos.nxos_interface_module: + + +************************* +cisco.nxos.nxos_interface +************************* + +**(deprecated, removed after 2022-06-01) Manages physical attributes of interfaces.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_interfaces + + + +Synopsis +-------- +- Manages physical attributes of interfaces of NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • up ←
  • +
  • down
  • +
+
+
Administrative state of the interface.
+
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of Interfaces definitions.
+
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • up
  • +
  • down
  • +
+
+
Administrative state of the interface.
+
+
+ delay + +
+ integer +
+
+ +
Time in seconds to wait before checking for the operational state on remote device. This wait is applicable for operational state arguments.
+
+
+ description + +
+ string +
+
+ +
Interface description.
+
+
+ duplex + +
+ string +
+
+
    Choices: +
  • full
  • +
  • half
  • +
  • auto
  • +
+
+
Interface link status. Applicable for ethernet interface only.
+
+
+ fabric_forwarding_anycast_gateway + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Associate SVI with anycast gateway under VLAN configuration mode. Applicable for SVI interface only.
+
+
+ interface_type + +
+ string +
+
+
    Choices: +
  • loopback
  • +
  • portchannel
  • +
  • svi
  • +
  • nve
  • +
+
+
Interface type to be unconfigured from the device.
+
+
+ ip_forward + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enable/Disable ip forward feature on SVIs.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • layer2
  • +
  • layer3
  • +
+
+
Manage Layer 2 or Layer 3 state of the interface. This option is supported for ethernet and portchannel interface. Applicable for ethernet and portchannel interface only.
+
+
+ mtu + +
+ string +
+
+ +
MTU for a specific interface. Must be an even number between 576 and 9216. Applicable for ethernet interface only.
+
+
+ name + +
+ string + / required +
+
+ +
Full name of interface, i.e. Ethernet1/1, port-channel10.
+
+
+ neighbors + +
+ list + / elements=dictionary +
+
+ +
Check the operational state of given interface name for LLDP neighbor.
+
The following suboptions are available. This is state check parameter only.
+
+
+ host + +
+ string +
+
+ +
LLDP neighbor host for given interface name.
+
+
+ port + +
+ string +
+
+ +
LLDP neighbor port to which given interface name is connected.
+
+
+ rx_rate + +
+ string +
+
+ +
Receiver rate in bits per second (bps).
+
This is state check parameter only.
+
Supports conditionals, see Conditionals in Networking Modules
+
+
+ speed + +
+ string +
+
+ +
Interface link speed. Applicable for ethernet interface only.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
  • default
  • +
+
+
Specify desired state of the resource.
+
+
+ tx_rate + +
+ string +
+
+ +
Transmit rate in bits per second (bps).
+
This is state check parameter only.
+
Supports conditionals, see Conditionals in Networking Modules
+
+
+ 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.
+
+
+ description + +
+ string +
+
+ +
Interface description.
+
+
+ duplex + +
+ string +
+
+
    Choices: +
  • full
  • +
  • half
  • +
  • auto
  • +
+
+
Interface link status. Applicable for ethernet interface only.
+
+
+ fabric_forwarding_anycast_gateway + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Associate SVI with anycast gateway under VLAN configuration mode. Applicable for SVI interface only.
+
+
+ interface_type + +
+ string +
+
+
    Choices: +
  • loopback
  • +
  • portchannel
  • +
  • svi
  • +
  • nve
  • +
+
+
Interface type to be unconfigured from the device.
+
+
+ ip_forward + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enable/Disable ip forward feature on SVIs.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • layer2
  • +
  • layer3
  • +
+
+
Manage Layer 2 or Layer 3 state of the interface. This option is supported for ethernet and portchannel interface. Applicable for ethernet and portchannel interface only.
+
+
+ mtu + +
+ string +
+
+ +
MTU for a specific interface. Must be an even number between 576 and 9216. Applicable for ethernet interface only.
+
+
+ name + +
+ string +
+
+ +
Full name of interface, i.e. Ethernet1/1, port-channel10.
+

aliases: interface
+
+
+ neighbors + +
+ list + / elements=dictionary +
+
+ +
Check the operational state of given interface name for LLDP neighbor.
+
The following suboptions are available. This is state check parameter only.
+
+
+ host + +
+ string +
+
+ +
LLDP neighbor host for given interface name.
+
+
+ port + +
+ string +
+
+ +
LLDP neighbor port to which given interface name is connected.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ rx_rate + +
+ string +
+
+ +
Receiver rate in bits per second (bps).
+
This is state check parameter only.
+
Supports conditionals, see Conditionals in Networking Modules
+
+
+ speed + +
+ string +
+
+ +
Interface link speed. Applicable for ethernet interface only.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
  • default
  • +
+
+
Specify desired state of the resource.
+
+
+ tx_rate + +
+ string +
+
+ +
Transmit rate in bits per second (bps).
+
This is state check parameter only.
+
Supports conditionals, see Conditionals in Networking Modules
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - This module is also used to create logical interfaces such as svis and loopbacks. + - Be cautious of platform specific idiosyncrasies. For example, when you default a loopback interface, the admin state toggles on certain versions of NX-OS. + - The :ref:`cisco.nxos.nxos_overlay_global ` ``anycast_gateway_mac`` attribute must be set before setting the ``fabric_forwarding_anycast_gateway`` property. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure an interface is a Layer 3 port and that it has the proper description + cisco.nxos.nxos_interface: + name: Ethernet1/1 + description: Configured by Ansible + mode: layer3 + + - name: Admin down an interface + cisco.nxos.nxos_interface: + name: Ethernet2/1 + admin_state: down + + - name: Remove all loopback interfaces + cisco.nxos.nxos_interface: + name: loopback + state: absent + + - name: Remove all logical interfaces + cisco.nxos.nxos_interface: + interface_type: '{{ item }} ' + state: absent + loop: + - loopback + - portchannel + - svi + - nve + + - name: Admin up all loopback interfaces + cisco.nxos.nxos_interface: + name: loopback 0-1023 + admin_state: up + + - name: Admin down all loopback interfaces + cisco.nxos.nxos_interface: + name: loopback 0-1023 + admin_state: down + + - name: Check neighbors intent arguments + cisco.nxos.nxos_interface: + name: Ethernet2/3 + neighbors: + - port: Ethernet2/3 + host: abc.mycompany.com + + - name: Add interface using aggregate + cisco.nxos.nxos_interface: + aggregate: + - {name: Ethernet0/1, mtu: 256, description: test-interface-1} + - {name: Ethernet0/2, mtu: 516, description: test-interface-2} + duplex: full + speed: 100 + state: present + + - name: Delete interface using aggregate + cisco.nxos.nxos_interface: + aggregate: + - name: Loopback9 + - name: Loopback10 + state: absent + + - name: Check intent arguments + cisco.nxos.nxos_interface: + name: Ethernet0/2 + state: up + tx_rate: ge(0) + rx_rate: le(0) + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
command list sent to the device
+
+
Sample:
+
['interface Ethernet2/3', 'mtu 1500', 'speed 10']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_ospf_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_ospf_module.rst new file mode 100644 index 00000000..e16f84c6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interface_ospf_module.rst @@ -0,0 +1,622 @@ +.. _cisco.nxos.nxos_interface_ospf_module: + + +****************************** +cisco.nxos.nxos_interface_ospf +****************************** + +**(deprecated, removed after 2022-10-26) Manages configuration of an OSPF interface instance.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-10-26 +:Why: Updated modules released with more functionality +:Alternative: nxos_ospf_interfaces + + + +Synopsis +-------- +- Manages configuration of an OSPF interface instance. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ area + +
+ string + / required +
+
+ +
Ospf area associated with this cisco_interface_ospf instance. Valid values are a string, formatted as an IP address (i.e. "0.0.0.0") or as an integer.
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
  • default
  • +
+
+
Enables bfd at interface level. This overrides the bfd variable set at the ospf router level.
+
Valid values are 'enable', 'disable' or 'default'.
+
Dependency: ''feature bfd''
+
+
+ cost + +
+ string +
+
+ +
The cost associated with this cisco_interface_ospf instance.
+
+
+ dead_interval + +
+ string +
+
+ +
Time interval an ospf neighbor waits for a hello packet before tearing down adjacencies. Valid values are an integer or the keyword 'default'.
+
+
+ hello_interval + +
+ string +
+
+ +
Time between sending successive hello packets. Valid values are an integer or the keyword 'default'.
+
+
+ interface + +
+ string + / required +
+
+ +
Name of this cisco_interface resource. Valid value is a string.
+
+
+ message_digest + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables or disables the usage of message digest authentication.
+
+
+ message_digest_algorithm_type + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • default
  • +
+
+
Algorithm used for authentication among neighboring routers within an area. Valid values are 'md5' and 'default'.
+
+
+ message_digest_encryption_type + +
+ string +
+
+
    Choices: +
  • cisco_type_7
  • +
  • 3des
  • +
  • default
  • +
+
+
Specifies the scheme used for encrypting message_digest_password. Valid values are '3des' or 'cisco_type_7' encryption or 'default'.
+
+
+ message_digest_key_id + +
+ string +
+
+ +
Md5 authentication key-id associated with the ospf instance. If this is present, message_digest_encryption_type, message_digest_algorithm_type and message_digest_password are mandatory. Valid value is an integer and 'default'.
+
+
+ message_digest_password + +
+ string +
+
+ +
Specifies the message_digest password. Valid value is a string.
+
+
+ network + +
+ string +
+
+
    Choices: +
  • point-to-point
  • +
  • broadcast
  • +
+
+
Specifies interface ospf network type. Valid values are 'point-to-point' or 'broadcast'.
+
+
+ ospf + +
+ string + / required +
+
+ +
Name of the ospf instance.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable passive-interface state on this interface. true - (enable) Prevent OSPF from establishing an adjacency or sending routing updates on this interface. false - (disable) Override global 'passive-interface default' for this interface.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Default, where supported, restores params default value. + - To remove an existing authentication configuration you should use ``message_digest_key_id=default`` plus all other options matching their existing values. + - Loopback interfaces only support ospf network type 'point-to-point'. + - ``state=absent`` removes the whole OSPF interface configuration. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_interface_ospf: + interface: ethernet1/32 + ospf: 1 + area: 1 + bfd: disable + cost: default + + - cisco.nxos.nxos_interface_ospf: + interface: loopback0 + ospf: prod + area: 0.0.0.0 + bfd: enable + network: point-to-point + 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 +
commands sent to the device
+
+
Sample:
+
['interface Ethernet1/32', 'ip router ospf 1 area 0.0.0.1', 'ip ospf bfd disable']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interfaces_module.rst new file mode 100644 index 00000000..773a1951 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_interfaces_module.rst @@ -0,0 +1,576 @@ +.. _cisco.nxos.nxos_interfaces_module: + + +************************** +cisco.nxos.nxos_interfaces +************************** + +**Interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages the interface attributes of NX-OS interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of interface options
+
+
+ description + +
+ string +
+
+ +
Interface description.
+
+
+ duplex + +
+ string +
+
+
    Choices: +
  • full
  • +
  • half
  • +
  • auto
  • +
+
+
Interface link status. Applicable for Ethernet interfaces only.
+
+
+ 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
+
+
+ fabric_forwarding_anycast_gateway + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Associate SVI with anycast gateway under VLAN configuration mode. Applicable for SVI interfaces only.
+
+
+ ip_forward + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable IP forward feature on SVIs. Set the value to true to enable or false to disable.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • layer2
  • +
  • layer3
  • +
+
+
Manage Layer2 or Layer3 state of the interface. Applicable for Ethernet and port channel interfaces only.
+
+
+ mtu + +
+ string +
+
+ +
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 interface, e.g. Ethernet1/1, port-channel10.
+
+
+ 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 NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion
+
The state rendered considers the system default mode for interfaces to be "Layer 3" and the system default state for interfaces to be shutdown.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # description testing + # mtu 1800 + + - name: Merge provided configuration with device configuration + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: Configured by Ansible + enabled: true + - name: Ethernet1/2 + description: Configured by Ansible Network + enabled: false + state: merged + + # After state: + # ------------ + # + # interface Ethernet1/1 + # description Configured by Ansible + # no shutdown + # mtu 1800 + # interface Ethernet2 + # description Configured by Ansible Network + # shutdown + + + # Using replaced + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # description Interface 1/1 + # interface Ethernet1/2 + + - name: Replaces device configuration of listed interfaces with provided configuration + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: Configured by Ansible + enabled: true + mtu: 2000 + - name: Ethernet1/2 + description: Configured by Ansible Network + enabled: false + mode: layer2 + state: replaced + + # After state: + # ------------ + # + # interface Ethernet1/1 + # description Configured by Ansible + # no shutdown + # mtu 1500 + # interface Ethernet2/2 + # description Configured by Ansible Network + # shutdown + # switchport + + + # Using overridden + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # description Interface Ethernet1/1 + # interface Ethernet1/2 + # interface mgmt0 + # description Management interface + # ip address dhcp + + - name: Override device configuration of all interfaces with provided configuration + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + enabled: true + - name: Ethernet1/2 + description: Configured by Ansible Network + enabled: false + state: overridden + + # After state: + # ------------ + # + # interface Ethernet1/1 + # interface Ethernet1/2 + # description Configured by Ansible Network + # shutdown + # interface mgmt0 + # ip address dhcp + + + # Using deleted + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # description Interface Ethernet1/1 + # interface Ethernet1/2 + # interface mgmt0 + # description Management interface + # ip address dhcp + + - name: Delete or return interface parameters to default settings + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + state: deleted + + # After state: + # ------------ + # + # interface Ethernet1/1 + # interface Ethernet1/2 + # interface mgmt0 + # description Management interface + # ip address dhcp + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: outbound-intf + mode: layer3 + speed: 100 + - name: Ethernet1/2 + mode: layer2 + enabled: true + duplex: full + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/1" + # - "description outbound-intf" + # - "speed 100" + # - "interface Ethernet1/2" + # - "switchport" + # - "duplex full" + # - "no shutdown" + + # Using parsed + + # parsed.cfg + # ------------ + # interface Ethernet1/800 + # description test-1 + # speed 1000 + # shutdown + # no switchport + # duplex half + # interface Ethernet1/801 + # description test-2 + # switchport + # no shutdown + # mtu 1800 + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # parsed: + # - description: "test-1" + # duplex: "half" + # enabled: false + # mode: "layer3" + # name: "Ethernet1/800" + # speed: "1000" + # + # - description: "test-2" + # enabled: true + # mode: "layer2" + # mtu: "1800" + # name: "Ethernet1/801" + + # Using gathered + + # Existing device config state + # ----------------------------- + # interface Ethernet1/1 + # description outbound-intf + # switchport + # no shutdown + # interface Ethernet1/2 + # description intf-l3 + # speed 1000 + # interface Ethernet1/3 + # interface Ethernet1/4 + # interface Ethernet1/5 + + - name: Gather interfaces facts from the device using nxos_interfaces + cisco.nxos.nxos_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + # - name: Ethernet1/1 + # description: outbound-intf + # mode: layer2 + # enabled: True + # - name: Ethernet1/2 + # description: intf-l3 + # speed: "1000" + + + +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/1', 'mtu 1800']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interface_module.rst new file mode 100644 index 00000000..ad549cf2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interface_module.rst @@ -0,0 +1,639 @@ +.. _cisco.nxos.nxos_l2_interface_module: + + +**************************** +cisco.nxos.nxos_l2_interface +**************************** + +**(deprecated, removed after 2022-06-01) Manage Layer-2 interface on Cisco NXOS devices.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_l2_interfaces + + + +Synopsis +-------- +- This module provides declarative management of Layer-2 interface on Cisco NXOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ access_vlan + +
+ string +
+
+ +
Configure given VLAN in access port. If mode=access, used as the access VLAN ID.
+
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of Layer-2 interface definitions.
+
+
+ access_vlan + +
+ string +
+
+ +
Configure given VLAN in access port. If mode=access, used as the access VLAN ID.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • access
  • +
  • trunk
  • +
+
+
Mode in which interface needs to be configured.
+
+
+ name + +
+ string +
+
+ +
Full name of the interface excluding any logical unit number, i.e. Ethernet1/1.
+

aliases: interface
+
+
+ native_vlan + +
+ string +
+
+ +
Native VLAN to be configured in trunk port. If mode=trunk, used as the trunk native VLAN ID.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
  • unconfigured
  • +
+
+
Manage the state of the Layer-2 Interface configuration.
+
+
+ trunk_allowed_vlans + +
+ string +
+
+ +
List of allowed VLANs in a given trunk port. If mode=trunk, these are the only VLANs that will be configured on the trunk, i.e. "2-10,15".
+
+
+ trunk_vlans + +
+ string +
+
+ +
List of VLANs to be configured in trunk port. If mode=trunk, used as the VLAN range to ADD or REMOVE from the trunk.
+

aliases: trunk_add_vlans
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • access
  • +
  • trunk
  • +
+
+
Mode in which interface needs to be configured.
+
+
+ name + +
+ string +
+
+ +
Full name of the interface excluding any logical unit number, i.e. Ethernet1/1.
+

aliases: interface
+
+
+ native_vlan + +
+ string +
+
+ +
Native VLAN to be configured in trunk port. If mode=trunk, used as the trunk native VLAN ID.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
  • unconfigured
  • +
+
+
Manage the state of the Layer-2 Interface configuration.
+
+
+ trunk_allowed_vlans + +
+ string +
+
+ +
List of allowed VLANs in a given trunk port. If mode=trunk, these are the only VLANs that will be configured on the trunk, i.e. "2-10,15".
+
+
+ trunk_vlans + +
+ string +
+
+ +
List of VLANs to be configured in trunk port. If mode=trunk, used as the VLAN range to ADD or REMOVE from the trunk.
+

aliases: trunk_add_vlans
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.0(3)I5(1). + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure Eth1/5 is in its default l2 interface state + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + state: unconfigured + + - name: Ensure Eth1/5 is configured for access vlan 20 + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: access + access_vlan: 20 + + - name: Ensure Eth1/5 only has vlans 5-10 as trunk vlans + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: trunk + native_vlan: 10 + trunk_vlans: 5-10 + + - name: Ensure eth1/5 is a trunk port and ensure 2-50 are being tagged (doesn't mean + others aren't also being tagged) + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: trunk + native_vlan: 10 + trunk_vlans: 2-50 + + - name: Ensure these VLANs are not being tagged on the trunk + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: trunk + trunk_vlans: 51-4094 + state: absent + + - name: Aggregate Configure interfaces for access_vlan with aggregate + cisco.nxos.nxos_l2_interface: + aggregate: + - {name: Ethernet1/2, access_vlan: 6} + - {name: Ethernet1/7, access_vlan: 15} + mode: access + + + +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:
+
['interface eth1/5', 'switchport access vlan 20']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interfaces_module.rst new file mode 100644 index 00000000..81380ced --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l2_interfaces_module.rst @@ -0,0 +1,537 @@ +.. _cisco.nxos.nxos_l2_interfaces_module: + + +***************************** +cisco.nxos.nxos_l2_interfaces +***************************** + +**L2 interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Layer-2 interfaces attributes of NX-OS Interfaces. + + + + +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
  • +
  • fex-fabric
  • +
  • fabricpath
  • +
+
+
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, i.e. Ethernet1/1.
+
+
+ trunk + +
+ dictionary +
+
+ +
Switchport mode trunk command to configure the interface as a Layer-2 trunk.
+
+
+ allowed_vlans + +
+ string +
+
+ +
List of allowed VLANs in a given trunk port. These are the only VLANs that will be configured on the trunk.
+
+
+ native_vlan + +
+ integer +
+
+ +
Native VLAN to be configured in trunk port. It is used as the trunk native VLAN ID.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # switchport access vlan 20 + # interface Ethernet1/2 + # switchport trunk native vlan 20 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + - name: Merge provided configuration with device configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 10 + allowed_vlans: 2,4,15 + - name: Ethernet1/2 + access: + vlan: 30 + state: merged + + # After state: + # ------------ + # + # interface Ethernet1/1 + # switchport trunk native vlan 10 + # switchport trunk allowed vlans 2,4,15 + # interface Ethernet1/2 + # switchport access vlan 30 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + + # Using replaced + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # switchport access vlan 20 + # interface Ethernet1/2 + # switchport trunk native vlan 20 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + - name: Replace device configuration of specified L2 interfaces with provided configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 20 + allowed_vlans: 5-10, 15 + state: replaced + + # After state: + # ------------ + # + # interface Ethernet1/1 + # switchport trunk native vlan 20 + # switchport trunk allowed vlan 5-10,15 + # interface Ethernet1/2 + # switchport trunk native vlan 20 + # switchport mode trunk + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + + # Using overridden + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # switchport access vlan 20 + # interface Ethernet1/2 + # switchport trunk native vlan 20 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + - name: Override device configuration of all L2 interfaces on device with provided + configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/2 + access: + vlan: 30 + state: overridden + + # After state: + # ------------ + # + # interface Ethernet1/1 + # interface Ethernet1/2 + # switchport access vlan 30 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + + # Using deleted + + # Before state: + # ------------- + # + # interface Ethernet1/1 + # switchport access vlan 20 + # interface Ethernet1/2 + # switchport trunk native vlan 20 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + - name: Delete L2 attributes of given interfaces (Note This won't delete the interface + itself). + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + - name: Ethernet1/2 + state: deleted + + # After state: + # ------------ + # + # interface Ethernet1/1 + # interface Ethernet1/2 + # interface mgmt0 + # ip address dhcp + # ipv6 address auto-config + + # Using rendered + + - name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 10 + allowed_vlans: 2,4,15 + - name: Ethernet1/2 + access: + vlan: 30 + - name: Ethernet1/3 + trunk: + native_vlan: 20 + allowed_vlans: 5-10, 15 + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/1" + # - "switchport trunk allowed vlan 2,4,15" + # - "switchport trunk native vlan 10" + # - "interface Ethernet1/2" + # - "switchport access vlan 30" + # - "interface Ethernet1/3" + # - "switchport trunk allowed vlan 5,6,7,8,9,10,15" + # - "switchport trunk native vlan 20" + + # Using parsed + + # parsed.cfg + # ------------ + # interface Ethernet1/800 + # switchport access vlan 18 + # switchport trunk allowed vlan 210 + # interface Ethernet1/801 + # switchport trunk allowed vlan 2,4,15 + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_l2_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # parsed: + # - name: Ethernet1/800 + # access: + # vlan: 18 + # trunk: + # allowed_vlans: "210" + # - name: Ethernet1/801 + # trunk: + # allowed_vlans: "2,4,15" + + # Using gathered + + # Existing device config state + # ------------------------------- + # Nexus9kvI5# sh running-config | section ^interface + # interface Ethernet1/1 + # switchport access vlan 6 + # switchport trunk allowed vlan 200 + # interface Ethernet1/2 + # switchport trunk native vlan 10 + + - name: Gather l2_interfaces facts from the device using nxos_l2_interfaces + cisco.nxos.nxos_l2_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # - name: "Ethernet1/1" + # access: + # vlan: 6 + # trunk: + # allowed_vlans: "200" + # + # - name: "Ethernet1/2" + # trunk: + # native_vlan: 10 + + + +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/1', 'switchport trunk allowed vlan 2,4,15', 'switchport trunk native vlan 10', 'interface Ethernet1/2', 'switchport access vlan 30', 'interface Ethernet1/3', 'switchport trunk allowed vlan 5,6,7,8,9,10,15', 'switchport trunk native vlan 20']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interface_module.rst new file mode 100644 index 00000000..0367172c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interface_module.rst @@ -0,0 +1,515 @@ +.. _cisco.nxos.nxos_l3_interface_module: + + +**************************** +cisco.nxos.nxos_l3_interface +**************************** + +**(deprecated, removed after 2022-06-01) Manage L3 interfaces on Cisco NXOS network devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_l3_interfaces + + + +Synopsis +-------- +- This module provides declarative management of L3 interfaces on Cisco NXOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of L3 interfaces definitions.
+
+
+ ipv4 + +
+ string +
+
+ +
IPv4 of the L3 interface.
+
+
+ ipv6 + +
+ string +
+
+ +
IPv6 of the L3 interface.
+
+
+ name + +
+ string +
+
+ +
Name of the L3 interface.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
State of the L3 interface configuration.
+
+
+ ipv4 + +
+ string +
+
+ +
IPv4 of the L3 interface.
+
+
+ ipv6 + +
+ string +
+
+ +
IPv6 of the L3 interface.
+
+
+ name + +
+ string +
+
+ +
Name of the L3 interface.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the L3 interface configuration.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.0(3)I5(1). + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Set interface IPv4 address + cisco.nxos.nxos_l3_interface: + name: Ethernet2/3 + ipv4: 192.168.0.1/24 + + - name: Remove interface IPv4 address + cisco.nxos.nxos_l3_interface: + name: Ethernet2/3 + state: absent + + - name: Set IP addresses on aggregate + cisco.nxos.nxos_l3_interface: + aggregate: + - {name: Ethernet2/1, ipv4: 192.168.2.10/24} + - {name: Ethernet2/5, ipv4: 192.168.3.10/24, ipv6: fd5d:12c9:2201:1::1/64} + + - name: Remove IP addresses on aggregate + cisco.nxos.nxos_l3_interface: + aggregate: + - {name: Ethernet2/1, ipv4: 192.168.2.10/24} + - {name: Ethernet2/5, ipv4: 192.168.3.10/24, ipv6: fd5d:12c9:2201:1::1/64} + 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:
+
['interface ethernet2/3', 'no switchport', 'ip address 192.168.22.1/24', 'ipv6 address "fd5d:12c9:2201:1::1/64"', 'no ip address 192.168.22.1/24']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interfaces_module.rst new file mode 100644 index 00000000..c312b11e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_l3_interfaces_module.rst @@ -0,0 +1,620 @@ +.. _cisco.nxos.nxos_l3_interfaces_module: + + +***************************** +cisco.nxos.nxos_l3_interfaces +***************************** + +**L3 interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Layer-3 interfaces attributes of NX-OS Interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of Layer-3 interface options
+
+
+ dot1q + +
+ integer +
+
+ +
Configures IEEE 802.1Q VLAN encapsulation on a subinterface.
+
+
+ evpn_multisite_tracking + +
+ string +
+
added in 1.1.0
+
+
    Choices: +
  • fabric-tracking
  • +
  • dci-tracking
  • +
+
+
VxLAN evpn multisite Interface tracking. Supported only on selected model.
+
+
+ ipv4 + +
+ list + / elements=dictionary +
+
+ +
IPv4 address and attributes of the L3 interface.
+
+
+ address + +
+ string +
+
+ +
IPV4 address of the L3 interface.
+
+
+ secondary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
A boolean attribute to manage addition of secondary IP address.
+
+
+ tag + +
+ integer +
+
+ +
URIB route tag value for local/direct routes.
+
+
+ ipv6 + +
+ list + / elements=dictionary +
+
+ +
IPv6 address and attributes of the L3 interface.
+
+
+ address + +
+ string +
+
+ +
IPV6 address of the L3 interface.
+
+
+ tag + +
+ integer +
+
+ +
URIB route tag value for local/direct routes.
+
+
+ name + +
+ string + / required +
+
+ +
Full name of L3 interface, i.e. Ethernet1/1.
+
+
+ redirects + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables/disables ip redirects
+
+
+ unreachables + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables/disables ip redirects
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
The state overridden would override the IP address configuration of all interfaces on the device with the provided configuration in the task. Use caution with this state as you may loose access to the device.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # interface Ethernet1/6 + + - name: Merge provided configuration with device configuration. + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/6 + ipv4: + - address: 192.168.1.1/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: true + tag: 10 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + - name: Ethernet1/7.42 + dot1q: 42 + redirects: false + unreachables: false + state: merged + + # After state: + # ------------ + # + # interface Ethernet1/6 + # ip address 192.168.22.1/24 tag 5 + # ip address 10.1.1.1/24 secondary tag 10 + # interface Ethernet1/6 + # ipv6 address fd5d:12c9:2201:2::1/64 tag 6 + # interface Ethernet1/7.42 + # encapsulation dot1q 42 + # no ip redirects + # no ip unreachables + + + # Using replaced + + # Before state: + # ------------- + # + # interface Ethernet1/6 + # ip address 192.168.22.1/24 + # ipv6 address "fd5d:12c9:2201:1::1/64" + + - name: Replace device configuration of specified L3 interfaces with provided configuration. + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/6 + ipv4: + - address: 192.168.22.3/24 + state: replaced + + # After state: + # ------------ + # + # interface Ethernet1/6 + # ip address 192.168.22.3/24 + + + # Using overridden + + # Before state: + # ------------- + # + # interface Ethernet1/2 + # ip address 192.168.22.1/24 + # interface Ethernet1/6 + # ipv6 address "fd5d:12c9:2201:1::1/64" + + - name: Override device configuration of all L3 interfaces on device with provided + configuration. + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/2 + ipv4: 192.168.22.3/4 + state: overridden + + # After state: + # ------------ + # + # interface Ethernet1/2 + # ipv4 address 192.168.22.3/24 + # interface Ethernet1/6 + + + # Using deleted + + # Before state: + # ------------- + # + # interface Ethernet1/6 + # ip address 192.168.22.1/24 + # interface Ethernet1/2 + # ipv6 address "fd5d:12c9:2201:1::1/64" + + - name: Delete L3 attributes of given interfaces (This won't delete the interface + itself). + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/6 + - name: Ethernet1/2 + state: deleted + + # After state: + # ------------ + # + # interface Ethernet1/6 + # interface Ethernet1/2 + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/800 + ipv4: + - address: 192.168.1.100/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: true + tag: 10 + - name: Ethernet1/800 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/800" + # - "ip address 192.168.1.100/24 tag 5" + # - "ip address 10.1.1.1/24 secondary tag 10" + # - "interface Ethernet1/800" + # - "ipv6 address fd5d:12c9:2201:2::1/64 tag 6" + + # Using parsed + + # parsed.cfg + # ------------ + # interface Ethernet1/800 + # ip address 192.168.1.100/24 tag 5 + # ip address 10.1.1.1/24 secondary tag 10 + # no ip redirects + # interface Ethernet1/801 + # ipv6 address fd5d:12c9:2201:2::1/64 tag 6 + # ip unreachables + # interface mgmt0 + # ip address dhcp + # vrf member management + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_l3_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + + # parsed: + # - name: Ethernet1/800 + # ipv4: + # - address: 192.168.1.100/24 + # tag: 5 + # - address: 10.1.1.1/24 + # secondary: True + # tag: 10 + # redirects: False + # - name: Ethernet1/801 + # ipv6: + # - address: fd5d:12c9:2201:2::1/64 + # tag: 6 + # unreachables: True + + # Using gathered + + # Existing device config state + # ------------------------------- + # interface Ethernet1/1 + # ip address 192.0.2.100/24 + # interface Ethernet1/2 + # no ip redirects + # ip address 203.0.113.10/24 + # ip unreachables + # ipv6 address 2001:db8::1/32 + + - name: Gather l3_interfaces facts from the device using nxos_l3_interfaces + cisco.nxos.nxos_l3_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + + # gathered: + # - name: Ethernet1/1 + # ipv4: + # - address: 192.0.2.100/24 + # - name: Ethernet1/2 + # ipv4: + # - address: 203.0.113.10/24 + # ipv6: + # - address: 2001:db8::1/32 + # redirects: False + # unreachables: True + + + +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/2', 'ip address 192.168.0.1/2']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_interfaces_module.rst new file mode 100644 index 00000000..821ce616 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_interfaces_module.rst @@ -0,0 +1,575 @@ +.. _cisco.nxos.nxos_lacp_interfaces_module: + + +******************************* +cisco.nxos.nxos_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 NX-OS Interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of LACP interfaces options.
+
+
+ convergence + +
+ dictionary +
+
+ +
This dict contains configurable options related to convergence. Applicable only for Port-channel.
+
+
+ graceful + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
port-channel lacp graceful convergence. Disable this only with lacp ports connected to Non-Nexus peer. Disabling this with Nexus peer can lead to port suspension.
+
+
+ vpc + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable lacp convergence for vPC port channels.
+
+
+ links + +
+ dictionary +
+
+ +
This dict contains configurable options related to max and min port-channel links. Applicable only for Port-channel.
+
+
+ max + +
+ integer +
+
+ +
Port-channel max bundle.
+
+
+ min + +
+ integer +
+
+ +
Port-channel min links.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • delay
  • +
+
+
LACP mode. Applicable only for Port-channel.
+
+
+ name + +
+ string + / required +
+
+ +
Name of the interface.
+
+
+ port_priority + +
+ integer +
+
+ +
LACP port priority for the interface. Range 1-65535. Applicable only for Ethernet.
+
+
+ rate + +
+ string +
+
+
    Choices: +
  • fast
  • +
  • normal
  • +
+
+
Rate at which PDUs are sent by LACP. Applicable only for Ethernet. At fast rate LACP is transmitted once every 1 second. At normal rate LACP is transmitted every 30 seconds after the link is bundled.
+
+
+ suspend_individual + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
port-channel lacp state. Disabling this will cause lacp to put the port to individual state and not suspend the port in case it does not get LACP BPDU from the peer ports in the port-channel.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + + - name: Merge provided configuration with device configuration. + cisco.nxos.nxos_lacp_interfaces: + config: + - name: Ethernet1/3 + port_priority: 5 + rate: fast + state: merged + + # After state: + # ------------ + # + # interface Ethernet1/3 + # lacp port-priority 5 + # lacp rate fast + + + # Using replaced + + # Before state: + # ------------- + # + # interface Ethernet1/3 + # lacp port-priority 5 + # interface port-channel11 + # lacp mode delay + + - name: Replace device lacp interfaces configuration with the given configuration. + cisco.nxos.nxos_lacp_interfaces: + config: + - name: port-channel11 + links: + min: 4 + state: replaced + + # After state: + # ------------ + # + # interface Ethernet1/3 + # lacp port-priority 5 + # interface port-channel11 + # lacp min-links 4 + + + # Using overridden + + # Before state: + # ------------- + # + # interface Ethernet1/3 + # lacp port-priority 5 + # interface port-channel11 + # lacp mode delay + + - name: Override device configuration of all LACP interfaces attributes of given interfaces + on device with provided configuration. + cisco.nxos.nxos_lacp_interfaces: + config: + - name: port-channel11 + links: + min: 4 + state: overridden + + # After state: + # ------------ + # + # interface port-channel11 + # lacp min-links 4 + + + # Using deleted + + # Before state: + # ------------- + # + # interface Ethernet1/3 + # lacp port-priority 5 + # interface port-channel11 + # lacp mode delay + + - name: Delete LACP interfaces configurations. + cisco.nxos.nxos_lacp_interfaces: + state: deleted + + # After state: + # ------------ + # + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_lacp_interfaces: + config: + - name: Ethernet1/800 + rate: fast + - name: Ethernet1/801 + rate: fast + port_priority: 32 + - name: port-channel10 + links: + max: 15 + min: 2 + convergence: + graceful: true + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/800" + # - "lacp rate fast" + # - "interface Ethernet1/801" + # - "lacp port-priority 32" + # - "lacp rate fast" + # - "interface port-channel10" + # - "lacp min-links 2" + # - "lacp max-bundle 15" + # - "lacp graceful-convergence" + + # Using parsed + + # parsed.cfg + # ------------ + + # interface port-channel10 + # lacp min-links 10 + # lacp max-bundle 15 + # interface Ethernet1/800 + # lacp port-priority 100 + # lacp rate fast + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_lacp_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + + # parsed: + # - name: port-channel10 + # links: + # max: 15 + # min: 10 + # - name: Ethernet1/800 + # port_priority: 100 + # rate: fast + + # Using gathered + + # Existing device config state + # ------------------------------- + # interface Ethernet1/1 + # lacp port-priority 5 + # lacp rate fast + # interface port-channel10 + # lacp mode delay + # interface port-channel11 + # lacp max-bundle 10 + # lacp min-links 5 + + - name: Gather lacp_interfaces facts from the device using nxos_lacp_interfaces + cisco.nxos.nxos_lacp_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # - name: Ethernet1/1 + # port_priority: 5 + # rate: fast + # - name: port-channel10 + # mode: delay + # - name: port-channel11 + # links: + # max: 10 + # min: 5 + + + +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 port-channel10', 'lacp min-links 5', 'lacp mode delay']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_module.rst new file mode 100644 index 00000000..ba731feb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lacp_module.rst @@ -0,0 +1,399 @@ +.. _cisco.nxos.nxos_lacp_module: + + +******************** +cisco.nxos.nxos_lacp +******************** + +**LACP resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Global Link Aggregation Control Protocol (LACP) on NX-OS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
LACP global options.
+
+
+ system + +
+ dictionary +
+
+ +
LACP system options
+
+
+ mac + +
+ dictionary +
+
+ +
MAC address to be used for the LACP Protocol exchanges
+
+
+ address + +
+ string +
+
+ +
MAC-address (FORMAT :xxxx.xxxx.xxxx).
+
+
+ role + +
+ string +
+
+
    Choices: +
  • primary
  • +
  • secondary
  • +
+
+
The role for the Switch.
+
+
+ priority + +
+ integer +
+
+ +
The system priority to use in LACP negotiations.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS device by executing the command show running-config | include 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
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL. + - Feature lacp should be enabled for this module. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + + - name: Merge provided configuration with device configuration. + cisco.nxos.nxos_lacp: + config: + system: + priority: 10 + mac: + address: 00c1.4c00.bd15 + state: merged + + # After state: + # ------------ + # + # lacp system-priority 10 + # lacp system-mac 00c1.4c00.bd15 + + + # Using replaced + + # Before state: + # ------------- + # + # lacp system-priority 10 + + - name: Replace device global lacp configuration with the given configuration. + cisco.nxos.nxos_lacp: + config: + system: + mac: + address: 00c1.4c00.bd15 + state: replaced + + # After state: + # ------------ + # + # lacp system-mac 00c1.4c00.bd15 + + + # Using deleted + + # Before state: + # ------------- + # + # lacp system-priority 10 + + - name: Delete global LACP configurations. + cisco.nxos.nxos_lacp: + state: deleted + + # After state: + # ------------ + # + + # Using rendered + + - name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_lacp: + config: + system: + priority: 10 + mac: + address: 00c1.4c00.bd15 + role: secondary + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "lacp system-priority 10" + # - "lacp system-mac 00c1.4c00.bd15 role secondary" + + # Using parsed + + # parsed.cfg + # ------------ + # lacp system-priority 10 + # lacp system-mac 00c1.4c00.bd15 role secondary + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_lacp: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # parsed: + # system: + # priority: 10 + # mac: + # address: 00c1.4c00.bd15 + # role: secondary + + # Using gathered + + # Existing device config state + # ------------------------------- + # Nexus9000v# show running-config | include lacp + # lacp system-priority 11 + # lacp system-mac 00c1.4c00.bd15 role primary + + - name: Gather lacp facts from the device using nxos_lacp + cisco.nxos.nxos_lacp: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # system: + # priority: 11 + # mac: + # address: 00c1.4c00.bd15 + # role: primary + + + +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 15', 'lacp system-mac 00c1.4c00.bd15 role primary']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lag_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lag_interfaces_module.rst new file mode 100644 index 00000000..adf7514a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lag_interfaces_module.rst @@ -0,0 +1,482 @@ +.. _cisco.nxos.nxos_lag_interfaces_module: + + +****************************** +cisco.nxos.nxos_lag_interfaces +****************************** + +**LAG interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages attributes of link aggregation groups of NX-OS Interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of link aggregation group configurations.
+
+
+ members + +
+ list + / elements=dictionary +
+
+ +
The list of interfaces that are part of the group.
+
+
+ force + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true it forces link aggregation group members to match what is declared in the members param. This can be used to remove members.
+
+
+ member + +
+ string +
+
+ +
The interface name.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • active
  • +
  • on
  • +
  • passive
  • +
+
+
Link aggregation group (LAG).
+
+
+ name + +
+ string + / required +
+
+ +
Name of the link aggregation group (LAG).
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL. + - This module works with connection ``network_cli``. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # interface Ethernet1/4 + + - name: Merge provided configuration with device configuration. + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel99 + members: + - member: Ethernet1/4 + state: merged + + # After state: + # ------------ + # + # interface Ethernet1/4 + # channel-group 99 + + + # Using replaced + + # Before state: + # ------------- + # + # interface Ethernet1/4 + # channel-group 99 mode active + + - name: Replace device configuration of specified LAG attributes of given interfaces + with provided configuration. + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel10 + members: + - member: Ethernet1/4 + state: replaced + + # After state: + # ------------ + # + # interface Ethernet1/4 + # channel-group 10 + + + # Using overridden + + # Before state: + # ------------- + # + # interface Ethernet1/4 + # channel-group 10 + # interface Ethernet1/2 + # channel-group 99 mode passive + + - name: Override device configuration of all LAG attributes of given interfaces on + device with provided configuration. + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel20 + members: + - member: Ethernet1/6 + force: true + state: overridden + + # After state: + # ------------ + # interface Ethernet1/2 + # interface Ethernet1/4 + # interface Ethernet1/6 + # channel-group 20 force + + + # Using deleted + + # Before state: + # ------------- + # + # interface Ethernet1/4 + # channel-group 99 mode active + + - name: Delete LAG attributes of given interface (This won't delete the port-channel + itself). + cisco.nxos.nxos_lag_interfaces: + config: + - port-channel: port-channel99 + state: deleted + + - name: Delete LAG attributes of all the interfaces + cisco.nxos.nxos_lag_interfaces: + state: deleted + + # After state: + # ------------ + # + # interface Ethernet1/4 + # no channel-group 99 + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel10 + members: + - member: Ethernet1/800 + mode: active + - member: Ethernet1/801 + - name: port-channel11 + members: + - member: Ethernet1/802 + mode: passive + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "interface Ethernet1/800" + # - "channel-group 10 mode active" + # - "interface Ethernet1/801" + # - "channel-group 10" + # - "interface Ethernet1/802" + # - "channel-group 11 mode passive" + + # Using parsed + + # parsed.cfg + # ------------ + + # interface port-channel10 + # interface port-channel11 + # interface port-channel12 + # interface Ethernet1/800 + # channel-group 10 mode active + # interface Ethernet1/801 + # channel-group 10 mode active + # interface Ethernet1/802 + # channel-group 11 mode passive + # interface Ethernet1/803 + # channel-group 11 mode passive + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_lag_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + + # parsed: + # - members: + # - member: Ethernet1/800 + # mode: active + # - member: Ethernet1/801 + # mode: active + # name: port-channel10 + # + # - members: + # - member: Ethernet1/802 + # mode: passive + # - member: Ethernet1/803 + # mode: passive + # name: port-channel11 + # + # - name: port-channel12 + + # Using gathered + + # Existing device config state + # ------------------------------- + # interface port-channel10 + # interface port-channel11 + # interface Ethernet1/1 + # channel-group 10 mode active + # interface Ethernet1/2 + # channel-group 11 mode passive + # + + - name: Gather lag_interfaces facts from the device using nxos_lag_interfaces + cisco.nxos.nxos_lag_interfaces: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # - name: port-channel10 + # members: + # - member: Ethernet1/1 + # mode: active + # - name: port-channel11 + # members: + # - member: Ethernet1/2 + # mode: passive + + + +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/800', 'channel-group 10 mode active', 'interface Ethernet1/801', 'channel-group 10', 'interface Ethernet1/802', 'channel-group 11 mode passive']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) +- Nilashish Chakraborty (@NilashishC) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_linkagg_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_linkagg_module.rst new file mode 100644 index 00000000..f9a2abe9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_linkagg_module.rst @@ -0,0 +1,637 @@ +.. _cisco.nxos.nxos_linkagg_module: + + +*********************** +cisco.nxos.nxos_linkagg +*********************** + +**(deprecated, removed after 2022-06-01) Manage link aggregation groups on Cisco NXOS devices.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality. +:Alternative: nxos_lag_interfaces + + + +Synopsis +-------- +- This module provides declarative management of link aggregation groups on Cisco NXOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of link aggregation definitions.
+
+
+ force + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true it forces link aggregation group members to match what is declared in the members param. This can be used to remove members.
+
+
+ group + +
+ string + / required +
+
+ +
Channel-group number for the port-channel Link aggregation group.
+
+
+ members + +
+ list + / elements=string +
+
+ +
List of interfaces that will be managed in the link aggregation group.
+
+
+ min_links + +
+ integer +
+
+ +
Minimum number of ports required up before bringing up the link aggregation group.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • active
  • +
  • on
  • +
  • passive
  • +
+
+
Mode for the link aggregation group.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
State of the link aggregation group.
+
+
+ force + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
When true it forces link aggregation group members to match what is declared in the members param. This can be used to remove members.
+
+
+ group + +
+ string +
+
+ +
Channel-group number for the port-channel Link aggregation group.
+
+
+ members + +
+ list + / elements=string +
+
+ +
List of interfaces that will be managed in the link aggregation group.
+
+
+ min_links + +
+ integer +
+
+ +
Minimum number of ports required up before bringing up the link aggregation group.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • active
  • +
  • on ←
  • +
  • passive
  • +
+
+
Mode for the link aggregation group.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Purge links not defined in the aggregate parameter.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the link aggregation group.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.0(3)I5(1). + - ``state=absent`` removes the portchannel config and interface if it already exists. If members to be removed are not explicitly passed, all existing members (if any), are removed. + - Members must be a list. + - LACP needs to be enabled first if active/passive modes are used. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: create link aggregation group + cisco.nxos.nxos_linkagg: + group: 99 + state: present + + - name: delete link aggregation group + cisco.nxos.nxos_linkagg: + group: 99 + state: absent + + - name: set link aggregation group to members + cisco.nxos.nxos_linkagg: + group: 10 + min_links: 3 + mode: active + members: + - Ethernet1/2 + - Ethernet1/4 + + - name: remove link aggregation group from Ethernet1/2 + cisco.nxos.nxos_linkagg: + group: 10 + min_links: 3 + mode: active + members: + - Ethernet1/4 + + - name: Create aggregate of linkagg definitions + cisco.nxos.nxos_linkagg: + aggregate: + - {group: 3} + - {group: 100, min_links: 3} + + - name: Remove aggregate of linkagg definitions + cisco.nxos.nxos_linkagg: + aggregate: + - {group: 3} + - {group: 100, min_links: 3} + 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:
+
['interface port-channel 30', 'lacp min-links 5', 'interface Ethernet2/1', 'channel-group 30 mode active', 'no interface port-channel 30']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_global_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_global_module.rst new file mode 100644 index 00000000..a5a40b98 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_global_module.rst @@ -0,0 +1,660 @@ +.. _cisco.nxos.nxos_lldp_global_module: + + +*************************** +cisco.nxos.nxos_lldp_global +*************************** + +**LLDP resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the Link Layer Discovery Protocol(LLDP) attributes on NX-OS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of link layer discovery configurations
+
+
+ holdtime + +
+ integer +
+
+ +
Amount of time the receiving device should hold the information (in seconds)
+
+
+ port_id + +
+ integer +
+
+
    Choices: +
  • 0
  • +
  • 1
  • +
+
+
This attribute defines if the interface names should be advertised in the long(0) or short(1) form.
+
+
+ reinit + +
+ integer +
+
+ +
Amount of time to delay the initialization of LLDP on any interface (in seconds)
+
+
+ timer + +
+ integer +
+
+ +
Frequency at which LLDP updates need to be transmitted (in seconds)
+
+
+ tlv_select + +
+ dictionary +
+
+ +
This attribute can be used to specify the TLVs that need to be sent and received in the LLDP packets. By default, all TLVs are advertised
+
+
+ dcbxp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify the Data Center Bridging Exchange Protocol TLV
+
+
+ management_address + +
+ dictionary +
+
+ +
Used to specify the management address in TLV messages
+
+
+ v4 + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Management address with TLV v4
+
+
+ v6 + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Management address with TLV v6
+
+
+ port + +
+ dictionary +
+
+ +
Used to manage port based attributes in TLV messages
+
+
+ description + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify the port description TLV
+
+
+ vlan + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify the port VLAN ID TLV
+
+
+ power_management + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify IEEE 802.3 DTE Power via MDI TLV
+
+
+ system + +
+ dictionary +
+
+ +
Used to manage system based attributes in TLV messages
+
+
+ capabilities + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify the system capabilities TLV
+
+
+ description + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify the system description TLV
+
+
+ name + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to specify the 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 NX-OS device by executing the command show running-config | include 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
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion
+
+
+ + +Notes +----- + +.. note:: + - Tested against NxOS 7.3.(0)D1(1) on VIRL + - The LLDP feature needs to be enabled before using this module + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # Before state: + # ------------- + # + # user(config)# show running-config | include lldp + # feature lldp + + - name: Merge provided configuration with device configuration + cisco.nxos.nxos_lldp_global: + config: + timer: 35 + holdtime: 100 + state: merged + + # After state: + # ------------ + # + # user(config)# show running-config | include lldp + # feature lldp + # lldp timer 35 + # lldp holdtime 100 + + + # Using replaced + # Before state: + # ------------- + # + # user(config)# show running-config | include lldp + # feature lldp + # lldp holdtime 100 + # lldp reinit 5 + # lldp timer 35 + + - name: Replace device configuration of specific LLDP attributes with provided configuration + cisco.nxos.nxos_lldp_global: + config: + timer: 40 + tlv_select: + system: + description: true + name: false + management_address: + v4: true + state: replaced + + # After state: + # ------------ + # + # user(config)# show running-config | include lldp + # feature lldp + # lldp timer 40 + # no lldp tlv-select system-name + + + # Using deleted + # Before state: + # ------------- + # + # user(config)# show running-config | include lldp + # feature lldp + # lldp holdtime 5 + # lldp reinit 3 + + - name: Delete LLDP configuration (this will by default remove all lldp configuration) + cisco.nxos.nxos_lldp_global: + state: deleted + + # After state: + # ------------ + # + # user(config)# show running-config | include lldp + # feature lldp + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_lldp_global: + config: + holdtime: 130 + port_id: 1 + reinit: 5 + tlv_select: + dcbxp: yes + power_management: yes + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - "lldp tlv-select dcbxp" + # - "lldp tlv-select power-management" + # - "lldp portid-subtype 1" + # - "lldp reinit 5" + # - "lldp holdtime 130" + + # Using parsed + + # parsed.cfg + # ------------ + # lldp holdtime 131 + # lldp reinit 7 + # no lldp tlv-select system-name + # no lldp tlv-select system-description + + # Task output (redacted) + # ----------------------- + + # parsed: + # holdtime: 131 + # reinit: 7 + # tlv_select: + # system: + # description: false + # name: false + + # Using gathered + + # Existing device config state + # ------------------------------- + # feature lldp + # lldp holdtime 129 + # lldp reinit 5 + # lldp timer 35 + # no lldp tlv-select system-name + + # Task output (redacted) + # ----------------------- + + # gathered: + # reinit: 5 + # timer: 35 + # tlv_select: + # system: + # name: False + # holdtime: 129 + + + +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 125', 'lldp reinit 4', 'no lldp tlv-select system-name']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Adharsh Srivats Rangarajan (@adharshsrivatsr) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_interfaces_module.rst new file mode 100644 index 00000000..da6cef7b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_interfaces_module.rst @@ -0,0 +1,406 @@ +.. _cisco.nxos.nxos_lldp_interfaces_module: + + +******************************* +cisco.nxos.nxos_lldp_interfaces +******************************* + +**LLDP interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages interfaces' configuration for Link Layer Discovery Protocol (LLDP) on NX-OS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of link layer discovery configurations for interfaces.
+
+
+ name + +
+ string + / required +
+
+ +
Name of the interface
+
+
+ receive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to enable or disable the reception of LLDP packets on that interface. By default, this is enabled after LLDP is enabled globally.
+
+
+ tlv_set + +
+ dictionary +
+
+ +
Used to configure TLV parameters on the interface
+
+
+ management_address + +
+ string +
+
+ +
Used to mention the IPv4 or IPv6 management address for the interface
+
+
+ vlan + +
+ integer +
+
+ +
Used to mention the VLAN for the interface
+
+
+ transmit + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Used to enable or disable the transmission of LLDP packets on that interface. By default, this is enabled after LLDP is enabled globally.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS 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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL + - The LLDP feature needs to be enabled before using this module + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + + - name: Merge provided configuration with device configuration + cisco.nxos.nxos_lldp_interfaces: + config: + - name: Ethernet1/4 + receive: false + transmit: true + tlv_set: + management_address: 192.168.122.64 + vlan: 12 + state: merged + + # After state: + # ------------- + # + # interface Ethernet1/4 + # no lldp receive + # lldp tlv-set management-address 192.168.122.64 + # lldp tlv-set vlan 12 + + + # Using replaced + + # Before state: + # ------------ + # + # interface Ethernet1/4 + # no lldp receive + # lldp tlv-set management-address 192.168.122.64 + # interface Ethernet1/5 + # no lldp transmit + # lldp tlv-set vlan 10 + + - name: Replace LLDP configuration on interfaces with given configuration + cisco.nxos.nxos_lldp_interfaces: + config: + - name: Ethernet1/4 + transmit: no + tlv_set: + vlan: 2 + state: replaced + + + # After state: + # ----------- + # + # interface Ethernet1/4 + # no lldp transmit + # lldp tlv_set vlan 2 + # interface Ethernet1/5 + # no lldp transmit + # lldp tlv-set vlan 10 + + + # Using overridden + + # Before state: + # ------------ + # + # interface Ethernet1/4 + # no lldp receive + # lldp tlv-set management-address 192.168.122.64 + # interface Ethernet1/5 + # no lldp transmit + # lldp tlv-set vlan 10 + + - name: Override LLDP configuration on all interfaces with given configuration + cisco.nxos.nxos_lldp_interfaces: + config: + - name: Ethernet1/7 + receive: no + tlv_set: + vlan: 12 + state: overridden + + + # After state: + # ----------- + # + # interface Ethernet1/7 + # no lldp receive + # lldp tlv_set vlan 12 + + + # Using deleted + + # Before state: + # ------------ + # + # interface Ethernet1/4 + # lldp tlv-set management vlan 24 + # no lldp transmit + # interface mgmt0 + # no lldp receive + + - name: Delete LLDP interfaces configuration + cisco.nxos.nxos_lldp_interfaces: + state: deleted + + # After state: + # ------------ + # + + + +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 Ethernet1/2', 'lldp receive', 'lldp tlv-set vlan 12']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Adharsh Srivats Rangarajan (@adharshsrivatsr) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_module.rst new file mode 100644 index 00000000..3902e1c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_lldp_module.rst @@ -0,0 +1,372 @@ +.. _cisco.nxos.nxos_lldp_module: + + +******************** +cisco.nxos.nxos_lldp +******************** + +**(deprecated, removed after 2022-06-01) Manage LLDP configuration on Cisco NXOS network devices.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_lldp_global + + + +Synopsis +-------- +- This module provides declarative management of LLDP service on Cisco NXOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ 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 NXOSv 7.0(3)I5(1). + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Enable LLDP service + cisco.nxos.nxos_lldp: + state: present + + - name: Disable LLDP service + cisco.nxos.nxos_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:
+
['feature lldp']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Ganesh Nalawade (@ganeshrn) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_logging_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_logging_module.rst new file mode 100644 index 00000000..16cf1251 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_logging_module.rst @@ -0,0 +1,680 @@ +.. _cisco.nxos.nxos_logging_module: + + +*********************** +cisco.nxos.nxos_logging +*********************** + +**Manage logging on network devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of logging on Cisco NX-OS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of logging definitions.
+
+
+ dest + +
+ string +
+
+
    Choices: +
  • console
  • +
  • logfile
  • +
  • module
  • +
  • monitor
  • +
  • server
  • +
+
+
Destination of the logs.
+
+
+ dest_level + +
+ integer +
+
+ +
Set logging severity levels.
+

aliases: level
+
+
+ event + +
+ string +
+
+
    Choices: +
  • link-enable
  • +
  • link-default
  • +
  • trunk-enable
  • +
  • trunk-default
  • +
+
+
Link/trunk enable/default interface configuration logging
+
+
+ facility + +
+ string +
+
+ +
Facility name for logging.
+
+
+ facility_level + +
+ integer +
+
+ +
Set logging severity levels for facility based log messages.
+
+
+ facility_link_status + +
+ string +
+
+
    Choices: +
  • link-down-notif
  • +
  • link-down-error
  • +
  • link-up-notif
  • +
  • link-up-error
  • +
+
+
Set logging facility ethpm link status. Not idempotent with version 6.0 images.
+
+
+ file_size + +
+ integer +
+
+ +
Set logfile size
+
+
+ interface + +
+ string +
+
+ +
Interface to be used while configuring source-interface for logging (e.g., 'Ethernet1/2', 'mgmt0')
+
+
+ interface_message + +
+ string +
+
+
    Choices: +
  • add-interface-description
  • +
+
+
Add interface description to interface syslogs. Does not work with version 6.0 images using nxapi as a transport.
+
+
+ name + +
+ string +
+
+ +
If value of dest is logfile it indicates file-name.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Remove any switch logging configuration that does not match what has been configured Not supported for ansible_connection local. All nxos_logging tasks must use the same ansible_connection type.
+
+
+ remote_server + +
+ string +
+
+ +
Hostname or IP Address for remote logging (when dest is 'server').
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the logging configuration.
+
+
+ timestamp + +
+ string +
+
+
    Choices: +
  • microseconds
  • +
  • milliseconds
  • +
  • seconds
  • +
+
+
Set logging timestamp format
+
+
+ use_vrf + +
+ string +
+
+ +
VRF to be used while configuring remote logging (when dest is 'server').
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure console logging with level + cisco.nxos.nxos_logging: + dest: console + level: 2 + state: present + - name: remove console logging configuration + cisco.nxos.nxos_logging: + dest: console + level: 2 + state: absent + - name: configure file logging with level + cisco.nxos.nxos_logging: + dest: logfile + name: testfile + dest_level: 3 + state: present + - name: Configure logging logfile with size + cisco.nxos.nxos_logging: + dest: logfile + name: testfile + dest_level: 3 + file_size: 16384 + - name: configure facility level logging + cisco.nxos.nxos_logging: + facility: daemon + facility_level: 0 + state: present + - name: remove facility level logging + cisco.nxos.nxos_logging: + facility: daemon + facility_level: 0 + state: absent + - name: Configure Remote Logging + cisco.nxos.nxos_logging: + dest: server + remote_server: test-syslogserver.com + facility: auth + facility_level: 1 + use_vrf: management + state: present + - name: Configure Source Interface for Logging + cisco.nxos.nxos_logging: + interface: mgmt0 + state: present + - name: Purge nxos_logging configuration not managed by this playbook + cisco.nxos.nxos_logging: + purge: true + - name: Configure logging timestamp + cisco.nxos.nxos_logging: + timestamp: milliseconds + state: present + - name: Configure logging facility ethpm link status + cisco.nxos.nxos_logging: + facility: ethpm + facility_link_status: link-up-notif + state: present + - name: Configure logging message ethernet description + cisco.nxos.nxos_logging: + interface_message: add-interface-description + state: present + - name: Configure logging event link enable + cisco.nxos.nxos_logging: + event: link-enable + state: present + - name: Configure logging using aggregate + cisco.nxos.nxos_logging: + aggregate: + - {dest: console, dest_level: 2} + - {dest: logfile, dest_level: 2, name: testfile} + - {facility: daemon, facility_level: 0} + 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 console 2', 'logging logfile testfile 3', 'logging level daemon 0']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_auth_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_auth_module.rst new file mode 100644 index 00000000..e6af899a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_auth_module.rst @@ -0,0 +1,446 @@ +.. _cisco.nxos.nxos_ntp_auth_module: + + +************************ +cisco.nxos.nxos_ntp_auth +************************ + +**Manages NTP authentication.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages NTP authentication. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ auth_type + +
+ string +
+
+
    Choices: +
  • text ←
  • +
  • encrypt
  • +
+
+
Whether the given md5string is in cleartext or has been encrypted. If in cleartext, the device will encrypt it before storing it.
+
+
+ authentication + +
+ string +
+
+
    Choices: +
  • on
  • +
  • off
  • +
+
+
Turns NTP authentication on or off.
+
+
+ key_id + +
+ string +
+
+ +
Authentication key identifier (numeric).
+
+
+ md5string + +
+ string +
+
+ +
MD5 String.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ trusted_key + +
+ string +
+
+
    Choices: +
  • false ←
  • +
  • true
  • +
+
+
Whether the given key is required to be supplied by a time source for the device to synchronize to the time source.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - If ``state=absent``, the module will remove the given key configuration if it exists. + - If ``state=absent`` and ``authentication=on``, authentication will be turned off. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Basic NTP authentication configuration + - cisco.nxos.nxos_ntp_auth: + key_id: 32 + md5string: hello + auth_type: text + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['ntp authentication-key 32 md5 helloWorld 0', 'ntp trusted-key 32']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_module.rst new file mode 100644 index 00000000..e1712a62 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_module.rst @@ -0,0 +1,536 @@ +.. _cisco.nxos.nxos_ntp_module: + + +******************* +cisco.nxos.nxos_ntp +******************* + +**Manages core NTP configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages core NTP configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ key_id + +
+ string +
+
+ +
Authentication key identifier to use with given NTP server or peer or keyword 'default'.
+
+
+ peer + +
+ string +
+
+ +
Network address of NTP peer.
+
+
+ prefer + +
+ string +
+
+
    Choices: +
  • enabled
  • +
  • disabled
  • +
+
+
Makes given NTP server or peer the preferred NTP server or peer for the device.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ server + +
+ string +
+
+ +
Network address of NTP server.
+
+
+ source_addr + +
+ string +
+
+ +
Local source address from which NTP messages are sent or keyword 'default'.
+
+
+ source_int + +
+ string +
+
+ +
Local source interface from which NTP messages are sent. Must be fully qualified interface name or keyword 'default'
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ vrf_name + +
+ string +
+
+ +
Makes the device communicate with the given NTP server or peer over a specific VRF or keyword 'default'.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Set NTP Server with parameters + - cisco.nxos.nxos_ntp: + server: 1.2.3.4 + key_id: 32 + prefer: enabled + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of ntp info after module execution
+
+
Sample:
+
{'address': '192.0.2.2', 'key_id': '48', 'peer_type': 'server', 'prefer': 'enabled', 'source': '192.0.2.3', 'source_type': 'source'}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing ntp server/peer
+
+
Sample:
+
{'address': '192.0.2.2', 'key_id': '32', 'peer_type': 'server', 'prefer': 'enabled', 'source': 'ethernet2/1', 'source_type': 'source-interface'}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'address': '192.0.2.2', 'key_id': '48', 'peer_type': 'server', 'prefer': 'enabled', 'source': '192.0.2.3', 'source_type': 'source'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['ntp server 192.0.2.2 prefer key 48', 'no ntp source-interface ethernet2/1', 'ntp source 192.0.2.3']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_options_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_options_module.rst new file mode 100644 index 00000000..6b415519 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ntp_options_module.rst @@ -0,0 +1,414 @@ +.. _cisco.nxos.nxos_ntp_options_module: + + +*************************** +cisco.nxos.nxos_ntp_options +*************************** + +**Manages NTP options.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages NTP options, e.g. authoritative server and logging. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ logging + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Sets whether NTP logging is enabled on the device.
+
+
+ master + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Sets whether the device is an authoritative NTP server.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ stratum + +
+ string +
+
+ +
If master=true, an optional stratum can be supplied (1-15). The device default is 8.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - When ``state=absent``, master and logging will be set to False and stratum will be removed as well + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Basic NTP options configuration + - cisco.nxos.nxos_ntp_options: + master: true + stratum: 12 + logging: false + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['no ntp logging', 'ntp master 12']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_nxapi_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_nxapi_module.rst new file mode 100644 index 00000000..43df15f6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_nxapi_module.rst @@ -0,0 +1,533 @@ +.. _cisco.nxos.nxos_nxapi_module: + + +********************* +cisco.nxos.nxos_nxapi +********************* + +**Manage NXAPI configuration on an NXOS device.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Configures the NXAPI feature on devices running Cisco NXOS. The NXAPI feature is absent from the configuration by default. Since this module manages the NXAPI feature it only supports the use of the ``Cli`` transport. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ http + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
Controls the operating state of the HTTP protocol as one of the underlying transports for NXAPI. By default, NXAPI will enable the HTTP transport when the feature is first configured. To disable the use of the HTTP transport, set the value of this argument to False.
+

aliases: enable_http
+
+
+ http_port + +
+ integer +
+
+ Default:
80
+
+
Configure the port with which the HTTP server will listen on for requests. By default, NXAPI will bind the HTTP service to the standard HTTP port 80. This argument accepts valid port values in the range of 1 to 65535.
+
+
+ https + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Controls the operating state of the HTTPS protocol as one of the underlying transports for NXAPI. By default, NXAPI will disable the HTTPS transport when the feature is first configured. To enable the use of the HTTPS transport, set the value of this argument to True.
+

aliases: enable_https
+
+
+ https_port + +
+ integer +
+
+ Default:
443
+
+
Configure the port with which the HTTPS server will listen on for requests. By default, NXAPI will bind the HTTPS service to the standard HTTPS port 443. This argument accepts valid port values in the range of 1 to 65535.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ sandbox + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
The NXAPI feature provides a web base UI for developers for entering commands. This feature is initially disabled when the NXAPI feature is configured for the first time. When the sandbox argument is set to True, the developer sandbox URL will accept requests and when the value is set to False, the sandbox URL is unavailable. This is supported on NX-OS 7K series.
+

aliases: enable_sandbox
+
+
+ ssl_strong_ciphers + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Controls the use of whether strong or weak ciphers are configured. By default, this feature is disabled and weak ciphers are configured. To enable the use of strong ciphers, set the value of this argument to True.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
The state argument controls whether or not the NXAPI feature is configured on the remote device. When the value is present the NXAPI feature configuration is present in the device running-config. When the values is absent the feature configuration is removed from the running-config.
+
+
+ tlsv1_0 + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
Controls the use of the Transport Layer Security version 1.0 is configured. By default, this feature is enabled. To disable the use of TLSV1.0, set the value of this argument to True.
+
+
+ tlsv1_1 + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Controls the use of the Transport Layer Security version 1.1 is configured. By default, this feature is disabled. To enable the use of TLSV1.1, set the value of this argument to True.
+
+
+ tlsv1_2 + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Controls the use of the Transport Layer Security version 1.2 is configured. By default, this feature is disabled. To enable the use of TLSV1.2, set the value of this argument to True.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Enable NXAPI access with default configuration + cisco.nxos.nxos_nxapi: + state: present + + - name: Enable NXAPI with no HTTP, HTTPS at port 9443 and sandbox disabled + cisco.nxos.nxos_nxapi: + enable_http: false + https_port: 9443 + https: yes + enable_sandbox: no + + - name: remove NXAPI configuration + cisco.nxos.nxos_nxapi: + state: absent + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ updates + +
+ list +
+
always +
Returns the list of commands that need to be pushed into the remote device to satisfy the arguments
+
+
Sample:
+
['no feature nxapi']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_interfaces_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_interfaces_module.rst new file mode 100644 index 00000000..87c04095 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_interfaces_module.rst @@ -0,0 +1,1986 @@ +.. _cisco.nxos.nxos_ospf_interfaces_module: + + +******************************* +cisco.nxos.nxos_ospf_interfaces +******************************* + +**OSPF Interfaces Resource Module.** + + +Version added: 1.3.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages OSPF(v2/v3) configuration of interfaces on devices running Cisco NX-OS. + + + + +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.
+
+
+ authentication + +
+ dictionary +
+
+ +
Authentication settings on the interface.
+
+
+ enable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable authentication on the interface.
+
+
+ key_chain + +
+ string +
+
+ +
Authentication password key-chain.
+
+
+ message_digest + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use message-digest authentication.
+
+
+ null_auth + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use null(disable) authentication.
+
+
+ authentication_key + +
+ dictionary +
+
+ +
Configure the authentication key for the interface.
+
+
+ encryption + +
+ integer +
+
+ +
0 Specifies an UNENCRYPTED authentication key will follow.
+
3 Specifies an 3DES ENCRYPTED authentication key will follow.
+
7 Specifies a Cisco type 7 ENCRYPTED authentication key will follow.
+
+
+ key + +
+ string + / required +
+
+ +
Authentication key.
+
Valid values are Cisco type 7 ENCRYPTED password, 3DES ENCRYPTED password and UNENCRYPTED (cleartext) password based on the value of encryption key.
+
+
+ cost + +
+ integer +
+
+ +
Cost associated with interface.
+
+
+ dead_interval + +
+ integer +
+
+ +
Dead interval value (in seconds).
+
+
+ hello_interval + +
+ integer +
+
+ +
Hello interval value (in seconds).
+
+
+ instance + +
+ integer +
+
+ +
Instance identifier.
+
+
+ message_digest_key + +
+ dictionary +
+
+ +
Message digest authentication password (key) settings.
+
+
+ encryption + +
+ integer +
+
+ +
0 Specifies an UNENCRYPTED ospf password (key) will follow.
+
3 Specifies an 3DES ENCRYPTED ospf password (key) will follow.
+
7 Specifies a Cisco type 7 ENCRYPTED the ospf password (key) will follow.
+
+
+ key + +
+ string + / required +
+
+ +
Authentication key.
+
Valid values are Cisco type 7 ENCRYPTED password, 3DES ENCRYPTED password and UNENCRYPTED (cleartext) password based on the value of encryption key.
+
+
+ key_id + +
+ integer + / required +
+
+ +
Key ID.
+
+
+ mtu_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable OSPF MTU mismatch detection.
+
+
+ multi_areas + +
+ list + / elements=string +
+
+ +
Multi-Areas associated with interface (not tied to OSPF process).
+
Valid values are Area Ids as an integer or IP address.
+
+
+ network + +
+ string +
+
+
    Choices: +
  • broadcast
  • +
  • point-to-point
  • +
+
+
Network type.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress routing updates on the interface.
+
+
+ priority + +
+ integer +
+
+ +
Router priority.
+
+
+ processes + +
+ list + / elements=dictionary +
+
+ +
Interfaces configuration for an OSPF process.
+
+
+ area + +
+ dictionary +
+
+ +
Area associated with interface.
+
+
+ area_id + +
+ string + / required +
+
+ +
Area ID as a decimal or IP address format.
+
+
+ secondaries + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not include secondary IPv4/IPv6 addresses.
+
+
+ multi_areas + +
+ list + / elements=string +
+
+ +
Multi-Areas associated with interface.
+
Valid values are Area Ids as an integer or IP address.
+
+
+ process_id + +
+ string + / required +
+
+ +
OSPF process tag.
+
+
+ retransmit_interval + +
+ integer +
+
+ +
Packet retransmission interval.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shutdown OSPF on this interface.
+
+
+ transmit_delay + +
+ integer +
+
+ +
Packet transmission delay.
+
+
+ name + +
+ string + / required +
+
+ +
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 NX-OS 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: + # ------------- + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # interface Ethernet1/2 + # no switchport + # interface Ethernet1/3 + # no switchport + + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.11 + - afi: ipv6 + processes: + - process_id: "200" + area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + - process_id: "300" + multi_areas: + - 50.50.50.50 + multi_areas: + - 16.10.10.10 + - name: Ethernet1/2 + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: Ethernet1/3 + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + state: merged + + # Task output + # ------------- + # "before": [ + # { + # "name": "Ethernet1/1" + # }, + # { + # "name": "Ethernet1/2" + # }, + # { + # "name": "Ethernet1/3" + # }, + # ] + # + # "commands": [ + # "interface Ethernet1/1", + # "ip router ospf multi-area 11.11.11.11", + # "ip router ospf 100 area 1.1.1.1 secondaries none", + # "ipv6 router ospfv3 multi-area 16.10.10.10", + # "ipv6 router ospfv3 200 area 2.2.2.2", + # "ipv6 router ospfv3 200 multi-area 21.0.0.0", + # "ipv6 router ospfv3 300 multi-area 50.50.50.50", + # "interface Ethernet1/2", + # "ip ospf authentication key-chain test-1", + # "ip ospf authentication", + # "ip ospf message-digest-key 10 md5 3 abc01d272be25d29", + # "ip ospf cost 100", + # "ospfv3 network broadcast", + # "ospfv3 shutdown", + # "interface Ethernet1/3", + # "ip ospf authentication-key 7 12090404011C03162E" + # ] + # + # "after": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.11" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "multi_areas": [ + # "16.10.10.10" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "2.2.2.2" + # }, + # "multi_areas": [ + # "21.0.0.0" + # ], + # "process_id": "200" + # }, + # { + # "multi_areas": [ + # "50.50.50.50" + # ], + # "process_id": "300" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + + # After state: + # ------------- + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.11 + # ipv6 router ospfv3 200 area 2.2.2.2 + # ipv6 router ospfv3 multi-area 16.10.10.10 + # ipv6 router ospfv3 200 multi-area 21.0.0.0 + # ipv6 router ospfv3 300 multi-area 50.50.50.50 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + # ip ospf authentication-key 7 12090404011C03162E + + + # Using replaced + + # Before state: + # ------------ + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.11 + # ipv6 router ospfv3 200 area 2.2.2.2 + # ipv6 router ospfv3 multi-area 16.10.10.10 + # ipv6 router ospfv3 200 multi-area 21.0.0.0 + # ipv6 router ospfv3 300 multi-area 50.50.50.50 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + # ip ospf authentication-key 7 12090404011C03162E + + - name: Replace OSPF configurations of listed interfaces with provided configurations + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + - name: Ethernet1/3 + state: replaced + + # Task output + # ------------- + # "before": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.11" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "multi_areas": [ + # "16.10.10.10" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "2.2.2.2" + # }, + # "multi_areas": [ + # "21.0.0.0" + # ], + # "process_id": "200" + # }, + # { + # "multi_areas": [ + # "50.50.50.50" + # ], + # "process_id": "300" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + # + # "commands": [ + # "interface Ethernet1/1", + # "ip router ospf multi-area 11.11.11.12", + # "no ip router ospf multi-area 11.11.11.11", + # "no ipv6 router ospfv3 multi-area 16.10.10.10", + # "no ipv6 router ospfv3 200 area 2.2.2.2", + # "no ipv6 router ospfv3 200 multi-area 21.0.0.0", + # "no ipv6 router ospfv3 300 multi-area 50.50.50.50", + # "interface Ethernet1/3", + # "no ip ospf authentication-key 7 12090404011C03162E" + # ] + # + # "after": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.12" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "name": "Ethernet1/3" + # }, + # + # After state: + # ------------- + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.12 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + + + # Using overridden + + # Before state: + # ------------ + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.11 + # ipv6 router ospfv3 200 area 2.2.2.2 + # ipv6 router ospfv3 multi-area 16.10.10.10 + # ipv6 router ospfv3 200 multi-area 21.0.0.0 + # ipv6 router ospfv3 300 multi-area 50.50.50.50 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + # ip ospf authentication-key 7 12090404011C03162E + + - name: Overridde all OSPF interfaces configuration with provided configuration + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + state: overridden + + # Task output + # ------------- + # "before": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.11" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "multi_areas": [ + # "16.10.10.10" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "2.2.2.2" + # }, + # "multi_areas": [ + # "21.0.0.0" + # ], + # "process_id": "200" + # }, + # { + # "multi_areas": [ + # "50.50.50.50" + # ], + # "process_id": "300" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + # + # "commands": [ + # "interface Ethernet1/2", + # "no ip ospf authentication key-chain test-1", + # "no ip ospf authentication", + # "no ip ospf message-digest-key 10 md5 3 abc01d272be25d29", + # "no ip ospf cost 100", + # "no ospfv3 network broadcast", + # "no ospfv3 shutdown", + # "interface Ethernet1/3", + # "no ip ospf authentication-key 7 12090404011C03162E", + # "interface Ethernet1/1", + # "ip router ospf multi-area 11.11.11.12", + # "no ip router ospf multi-area 11.11.11.11", + # "no ipv6 router ospfv3 multi-area 16.10.10.10", + # "no ipv6 router ospfv3 200 area 2.2.2.2", + # "no ipv6 router ospfv3 200 multi-area 21.0.0.0", + # "no ipv6 router ospfv3 300 multi-area 50.50.50.50" + # ] + # + # "after": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.12" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "name": "Ethernet1/2" + # }, + # { + # "name": "Ethernet1/3" + # }, + # ] + + # After state: + # ------------- + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.12 + # interface Ethernet1/2 + # no switchport + # interface Ethernet1/3 + # no switchport + + # Using deleted to delete OSPF config of a single interface + + # Before state: + # ------------ + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.11 + # ipv6 router ospfv3 200 area 2.2.2.2 + # ipv6 router ospfv3 multi-area 16.10.10.10 + # ipv6 router ospfv3 200 multi-area 21.0.0.0 + # ipv6 router ospfv3 300 multi-area 50.50.50.50 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + # ip ospf authentication-key 7 12090404011C03162E + + - name: Delete OSPF config from a single interface + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + state: deleted + + # Task output + # ------------- + # "before": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.11" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "multi_areas": [ + # "16.10.10.10" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "2.2.2.2" + # }, + # "multi_areas": [ + # "21.0.0.0" + # ], + # "process_id": "200" + # }, + # { + # "multi_areas": [ + # "50.50.50.50" + # ], + # "process_id": "300" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + # + # "commands": [ + # "interface Ethernet1/1", + # "no ip router ospf multi-area 11.11.11.11", + # "no ip router ospf 100 area 1.1.1.1 secondaries none", + # "no ipv6 router ospfv3 multi-area 16.10.10.10", + # "no ipv6 router ospfv3 200 area 2.2.2.2", + # "no ipv6 router ospfv3 200 multi-area 21.0.0.0", + # "no ipv6 router ospfv3 300 multi-area 50.50.50.50" + # ] + # + # "before": [ + # { + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + + # After state: + # ------------ + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + # ip ospf authentication-key 7 12090404011C03162E + + # Using deleted to delete OSPF config from all interfaces + + # Before state: + # ------------ + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.11 + # ipv6 router ospfv3 200 area 2.2.2.2 + # ipv6 router ospfv3 multi-area 16.10.10.10 + # ipv6 router ospfv3 200 multi-area 21.0.0.0 + # ipv6 router ospfv3 300 multi-area 50.50.50.50 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + # ip ospf authentication-key 7 12090404011C03162E + + - name: Delete OSPF config from all interfaces + cisco.nxos.nxos_ospf_interfaces: + state: deleted + + # Task output + # ------------- + # "before": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.11" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "multi_areas": [ + # "16.10.10.10" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "2.2.2.2" + # }, + # "multi_areas": [ + # "21.0.0.0" + # ], + # "process_id": "200" + # }, + # { + # "multi_areas": [ + # "50.50.50.50" + # ], + # "process_id": "300" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + # + # "commands": [ + # "interface Ethernet1/1", + # "no ip router ospf multi-area 11.11.11.11", + # "no ip router ospf 100 area 1.1.1.1 secondaries none", + # "no ipv6 router ospfv3 multi-area 16.10.10.10", + # "no ipv6 router ospfv3 200 area 2.2.2.2", + # "no ipv6 router ospfv3 200 multi-area 21.0.0.0", + # "no ipv6 router ospfv3 300 multi-area 50.50.50.50", + # "interface Ethernet1/2", + # "no ip ospf authentication key-chain test-1", + # "no ip ospf authentication", + # "no ip ospf message-digest-key 10 md5 3 abc01d272be25d29", + # "no ip ospf cost 100", + # "no ospfv3 network broadcast", + # "no ospfv3 shutdown", + # "interface Ethernet1/3", + # "no ip ospf authentication-key 7 12090404011C03162E" + # ] + # + # "after": [ + # { + # "name": "Ethernet1/1" + # }, + # { + # "name": "Ethernet1/2" + # }, + # { + # "name": "Ethernet1/3" + # }, + # ] + + # After state: + # ------------ + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # interface Ethernet1/2 + # no switchport + # interface Ethernet1/3 + # no switchport + + # Using rendered + + - name: Render platform specific configuration lines with state rendered (without connecting to the device) + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.11 + - afi: ipv6 + processes: + - process_id: "200" + area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + - process_id: "300" + multi_areas: + - 50.50.50.50 + multi_areas: + - 16.10.10.10 + - name: Ethernet1/2 + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: Ethernet1/3 + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + state: rendered + + # Task Output (redacted) + # ----------------------- + # "rendered": [ + # "interface Ethernet1/1", + # "ip router ospf multi-area 11.11.11.11", + # "ip router ospf 100 area 1.1.1.1 secondaries none", + # "ipv6 router ospfv3 multi-area 16.10.10.10", + # "ipv6 router ospfv3 200 area 2.2.2.2", + # "ipv6 router ospfv3 200 multi-area 21.0.0.0", + # "ipv6 router ospfv3 300 multi-area 50.50.50.50", + # "interface Ethernet1/2", + # "ip ospf authentication key-chain test-1", + # "ip ospf authentication", + # "ip ospf message-digest-key 10 md5 3 abc01d272be25d29", + # "ip ospf cost 100", + # "ospfv3 network broadcast", + # "ospfv3 shutdown", + # "interface Ethernet1/3", + # "ip ospf authentication-key 7 12090404011C03162E" + # ] + + # Using parsed + + # parsed.cfg + # ------------ + # interface Ethernet1/1 + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.11 + # ipv6 router ospfv3 200 area 2.2.2.2 + # ipv6 router ospfv3 200 multi-area 21.0.0.0 + # ipv6 router ospfv3 300 multi-area 50.50.50.50 + # ipv6 router ospfv3 multi-area 16.10.10.10 + # interface Ethernet1/2 + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # ip ospf authentication-key 7 12090404011C03162E + + - name: arse externally provided OSPF interfaces config + cisco.nxos.nxos_ospf_interfaces: + running_config: "{{ lookup('file', 'ospf_interfaces.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # "parsed": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.11" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "multi_areas": [ + # "16.10.10.10" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "2.2.2.2" + # }, + # "multi_areas": [ + # "21.0.0.0" + # ], + # "process_id": "200" + # }, + # { + # "multi_areas": [ + # "50.50.50.50" + # ], + # "process_id": "300" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication_key": { + # "encryption": 7, + # "key": "12090404011C03162E" + # } + # } + # ], + # "name": "Ethernet1/3" + # }, + # ] + + # Using gathered + + # On-box config + + # NXOS# show running-config | section ^interface + # interface Ethernet1/1 + # no switchport + # ip router ospf 100 area 1.1.1.1 secondaries none + # ip router ospf multi-area 11.11.11.12 + # interface Ethernet1/2 + # no switchport + # ip ospf authentication + # ip ospf authentication key-chain test-1 + # ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + # ip ospf cost 100 + # ospfv3 network broadcast + # ospfv3 shutdown + # interface Ethernet1/3 + # no switchport + + # Task output (redacted) + # ----------------------- + # "gathered": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "multi_areas": [ + # "11.11.11.12" + # ], + # "processes": [ + # { + # "area": { + # "area_id": "1.1.1.1", + # "secondaries": false + # }, + # "process_id": "100" + # } + # ] + # } + # ], + # "name": "Ethernet1/1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "authentication": { + # "enable": true, + # "key_chain": "test-1" + # }, + # "cost": 100, + # "message_digest_key": { + # "encryption": 3, + # "key": "abc01d272be25d29", + # "key_id": 10 + # } + # }, + # { + # "afi": "ipv6", + # "network": "broadcast", + # "shutdown": true + # } + # ], + # "name": "Ethernet1/2" + # }, + # { + # "name": "Ethernet1/3" + # }, + + + +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 Ethernet1/1', 'ip router ospf multi-area 11.11.11.11', 'ip router ospf 100 area 1.1.1.1 secondaries none', 'no ipv6 router ospfv3 multi-area 16.10.10.10', 'ipv6 router ospfv3 200 area 2.2.2.2', 'ipv6 router ospfv3 200 multi-area 21.0.0.0', 'ipv6 router ospfv3 300 multi-area 50.50.50.50', 'interface Ethernet1/2', 'no ip ospf authentication key-chain test-1', 'ip ospf authentication']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nilashish Chakraborty (@NilashishC) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_module.rst new file mode 100644 index 00000000..c6b1dcc6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_module.rst @@ -0,0 +1,381 @@ +.. _cisco.nxos.nxos_ospf_module: + + +******************** +cisco.nxos.nxos_ospf +******************** + +**(deprecated, removed after 2022-06-01) Manages configuration of an ospf instance.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality. +:Alternative: nxos_ospfv2 and nxos_ospfv3 + + + +Synopsis +-------- +- Manages configuration of an ospf instance. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ ospf + +
+ string + / required +
+
+ +
Name of the ospf instance.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_ospf: + ospf: 1 + 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 +
commands sent to the device
+
+
Sample:
+
['router ospf 1']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_vrf_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_vrf_module.rst new file mode 100644 index 00000000..0880dc1a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospf_vrf_module.rst @@ -0,0 +1,601 @@ +.. _cisco.nxos.nxos_ospf_vrf_module: + + +************************ +cisco.nxos.nxos_ospf_vrf +************************ + +**(deprecated, removed after 2022-10-01)Manages a VRF for an OSPF router.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-10-01 +:Why: Updated modules released with more functionality. +:Alternative: nxos_ospfv2 and nxos_ospfv3 + + + +Synopsis +-------- +- Manages a VRF for an OSPF router. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ auto_cost + +
+ string +
+
+ +
Specifies the reference bandwidth used to assign OSPF cost. Valid values are an integer, in Mbps, or the keyword 'default'.
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enables BFD on all OSPF interfaces.
+
Dependency: ''feature bfd''
+
+
+ default_metric + +
+ string +
+
+ +
Specify the default Metric value. Valid values are an integer or the keyword 'default'.
+
+
+ log_adjacency + +
+ string +
+
+
    Choices: +
  • log
  • +
  • detail
  • +
  • default
  • +
+
+
Controls the level of log messages generated whenever a neighbor changes state. Valid values are 'log', 'detail', and 'default'.
+
+
+ ospf + +
+ string + / required +
+
+ +
Name of the OSPF instance.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Setting to yes will suppress routing update on interface.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ router_id + +
+ string +
+
+ +
Router Identifier (ID) of the OSPF router VRF instance.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of ospf vrf configuration.
+
+
+ timer_throttle_lsa_hold + +
+ string +
+
+ +
Specify the hold interval for rate-limiting Link-State Advertisement (LSA) generation. Valid values are an integer, in milliseconds, or the keyword 'default'.
+
+
+ timer_throttle_lsa_max + +
+ string +
+
+ +
Specify the max interval for rate-limiting Link-State Advertisement (LSA) generation. Valid values are an integer, in milliseconds, or the keyword 'default'.
+
+
+ timer_throttle_lsa_start + +
+ string +
+
+ +
Specify the start interval for rate-limiting Link-State Advertisement (LSA) generation. Valid values are an integer, in milliseconds, or the keyword 'default'.
+
+
+ timer_throttle_spf_hold + +
+ string +
+
+ +
Specify minimum hold time between Shortest Path First (SPF) calculations. Valid values are an integer, in milliseconds, or the keyword 'default'.
+
+
+ timer_throttle_spf_max + +
+ string +
+
+ +
Specify the maximum wait time between Shortest Path First (SPF) calculations. Valid values are an integer, in milliseconds, or the keyword 'default'.
+
+
+ timer_throttle_spf_start + +
+ string +
+
+ +
Specify initial Shortest Path First (SPF) schedule delay. Valid values are an integer, in milliseconds, or the keyword 'default'.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
Name of the resource instance. Valid value is a string. The name 'default' is a valid VRF representing the global OSPF.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Value *default* restores params default value, if any. Otherwise it removes the existing param configuration. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_ospf_vrf: + ospf: 1 + timer_throttle_spf_start: 50 + timer_throttle_spf_hold: 1000 + timer_throttle_spf_max: 2000 + timer_throttle_lsa_start: 60 + timer_throttle_lsa_hold: 1100 + timer_throttle_lsa_max: 3000 + vrf: test + bfd: enable + 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 +
commands sent to the device
+
+
Sample:
+
['router ospf 1', 'vrf test', 'bfd', 'timers throttle lsa 60 1100 3000']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv2_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv2_module.rst new file mode 100644 index 00000000..a0352861 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv2_module.rst @@ -0,0 +1,5400 @@ +.. _cisco.nxos.nxos_ospfv2_module: + + +********************** +cisco.nxos.nxos_ospfv2 +********************** + +**OSPFv2 resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages OSPFv2 configuration on devices running Cisco NX-OS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of OSPF process configuration.
+
+
+ processes + +
+ list + / elements=dictionary +
+
+ +
A list of OSPF instances' configurations.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Configure properties of OSPF Areas.
+
+
+ area_id + +
+ string + / required +
+
+ +
The Area ID as an integer or IP Address.
+
+
+ authentication + +
+ dictionary +
+
+ +
Authentication settings for the Area.
+
+
+ message_digest + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use message-digest authentication.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set authentication for the area.
+
+
+ default_cost + +
+ integer +
+
+ +
Specify the default cost for default summary LSA.
+
+
+ filter_list + +
+ list + / elements=dictionary +
+
+ +
Filter prefixes between OSPF areas.
+
+
+ direction + +
+ string + / required +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
The direction to apply the route map.
+
+
+ route_map + +
+ string + / required +
+
+ +
The Route-map name.
+
+
+ nssa + +
+ dictionary +
+
+ +
NSSA settings for the area.
+
+
+ default_information_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Originate Type-7 default LSA into NSSA area.
+
+
+ no_redistribution + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send redistributed LSAs into NSSA area.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send summary LSAs into NSSA area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure area as NSSA.
+
+
+ translate + +
+ dictionary +
+
+ +
Translate LSA.
+
+
+ type7 + +
+ dictionary +
+
+ +
Translate from Type 7 to Type 5.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always translate LSAs
+
+
+ never + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Never translate LSAs
+
+
+ supress_fa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress forwarding address in translated LSAs.
+
+
+ ranges + +
+ list + / elements=dictionary +
+
+ +
Configure an address range for the area.
+
+
+ cost + +
+ integer +
+
+ +
Cost to use for the range.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress advertising the specified range.
+
+
+ prefix + +
+ string + / required +
+
+ +
IP in Prefix format (x.x.x.x/len)
+
+
+ stub + +
+ dictionary +
+
+ +
Settings for configuring the area as a stub.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prevent ABR from sending summary LSAs into stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure the area as a stub.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Calculate OSPF cost according to bandwidth.
+
+
+ reference_bandwidth + +
+ integer + / required +
+
+ +
Reference bandwidth used to assign OSPF cost.
+
+
+ unit + +
+ string + / required +
+
+
    Choices: +
  • Gbps
  • +
  • Mbps
  • +
+
+
Specify in which unit the reference bandwidth is specified.
+
+
+ bfd + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD on all OSPF interfaces.
+
+
+ default_information + +
+ dictionary +
+
+ +
Control distribution of default routes.
+
+
+ originate + +
+ dictionary +
+
+ +
Distribute a default route.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise a default route.
+
+
+ route_map + +
+ string +
+
+ +
Policy to control distribution of default routes
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable distribution of default route.
+
+
+ default_metric + +
+ integer +
+
+ +
Specify default metric for redistributed routes.
+
+
+ distance + +
+ integer +
+
+ +
Configure the OSPF administrative distance.
+
+
+ flush_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Flush routes on a non-graceful controlled restart.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Configure graceful restart.
+
+
+ grace_period + +
+ integer +
+
+ +
Configure maximum interval to restart gracefully.
+
+
+ helper_disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable helper mode.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful-restart.
+
+
+ isolate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Isolate this router from OSPF perspective.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
Log changes in adjacency state.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Notify all state changes.
+
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable logging changes in adjacency state.
+
+
+ max_lsa + +
+ dictionary +
+
+ +
Feature to limit the number of non-self-originated LSAs.
+
+
+ ignore_count + +
+ integer +
+
+ +
Set count on how many times adjacencies can be suppressed.
+
+
+ ignore_time + +
+ integer +
+
+ +
Set time during which all adjacencies are suppressed.
+
+
+ max_non_self_generated_lsa + +
+ integer + / required +
+
+ +
Set the maximum number of non self-generated LSAs.
+
+
+ reset_time + +
+ integer +
+
+ +
Set number of minutes after which ignore-count is reset to zero.
+
+
+ threshold + +
+ integer +
+
+ +
Threshold value (%) at which to generate a warning message.
+
+
+ warning_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log a warning message when limit is exceeded.
+
+
+ max_metric + +
+ dictionary +
+
+ +
Maximize the cost metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Router LSA configuration.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
External LSA configuration.
+
+
+ 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
  • +
+
+
Advertise Max metric for Stub links as well.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Effective only at startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set on-startup attribute.
+
+
+ wait_for_bgp_asn + +
+ integer +
+
+ +
ASN of BGP to wait for.
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ summary_lsa + +
+ dictionary +
+
+ +
Summary LSAs configuration.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Max metric value for summary LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set summary-lsa attribute.
+
+
+ maximum_paths + +
+ integer +
+
+ +
Maximum paths per destination.
+
+
+ mpls + +
+ dictionary +
+
+ +
OSPF MPLS configuration settings.
+
+
+ traffic_eng + +
+ dictionary +
+
+ +
OSPF MPLS Traffic Engineering commands.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
List of Area IDs.
+
+
+ area_id + +
+ string +
+
+ +
Area Id as an integer or ip address.
+
+
+ multicast_intact + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
MPLS TE multicast support.
+
+
+ router_id + +
+ string +
+
+ +
Router ID associated with TE.
+
+
+ name_lookup + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Display OSPF router ids as DNS names.
+
+
+ passive_interface + +
+ dictionary +
+
+ +
Suppress routing updates on the interface.
+
+
+ default + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Interfaces passive by default.
+
+
+ process_id + +
+ string + / required +
+
+ +
The OSPF process tag.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Redistribute information from another routing protocol.
+
+
+ id + +
+ string +
+
+ +
The identifier for the protocol specified.
+
+
+ protocol + +
+ string + / required +
+
+
    Choices: +
  • bgp
  • +
  • direct
  • +
  • eigrp
  • +
  • isis
  • +
  • lisp
  • +
  • ospf
  • +
  • rip
  • +
  • static
  • +
+
+
The name of the protocol.
+
+
+ route_map + +
+ string + / required +
+
+ +
The route map policy to constrain redistribution.
+
+
+ rfc1583compatibility + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure 1583 compatibility for external path preferences.
+
+
+ router_id + +
+ string +
+
+ +
Set OSPF process router-id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shutdown the OSPF protocol instance.
+
+
+ summary_address + +
+ list + / elements=dictionary +
+
+ +
Configure route summarization for redistribution.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Supress advertising the specified summary.
+
+
+ prefix + +
+ string + / required +
+
+ +
IP prefix in format x.x.x.x/ml.
+
+
+ tag + +
+ integer +
+
+ +
A 32-bit tag value.
+
+
+ table_map + +
+ dictionary +
+
+ +
Policy for filtering/modifying OSPF routes before sending them to RIB.
+
+
+ filter + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Block the OSPF routes from being sent to RIB.
+
+
+ name + +
+ string + / required +
+
+ +
The Route Map name.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure timer related constants.
+
+
+ lsa_arrival + +
+ integer +
+
+ +
Mimimum interval between arrival of a LSA.
+
+
+ lsa_group_pacing + +
+ integer +
+
+ +
LSA group refresh/maxage interval.
+
+
+ throttle + +
+ dictionary +
+
+ +
Configure throttle related constants.
+
+
+ lsa + +
+ dictionary +
+
+ +
Set rate-limiting for LSA generation.
+
+
+ hold_interval + +
+ integer +
+
+ +
The hold interval.
+
+
+ max_interval + +
+ integer +
+
+ +
The max interval.
+
+
+ start_interval + +
+ integer +
+
+ +
The start interval.
+
+
+ spf + +
+ dictionary +
+
+ +
Set OSPF SPF timers.
+
+
+ initial_spf_delay + +
+ integer +
+
+ +
Initial SPF schedule delay in milliseconds.
+
+
+ max_wait_time + +
+ integer +
+
+ +
Maximum wait time between SPF calculations.
+
+
+ min_hold_time + +
+ integer +
+
+ +
Minimum hold time between SPF calculations.
+
+
+ vrfs + +
+ list + / elements=dictionary +
+
+ +
Configure VRF specific OSPF settings.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Configure properties of OSPF Areas.
+
+
+ area_id + +
+ string + / required +
+
+ +
The Area ID as an integer or IP Address.
+
+
+ authentication + +
+ dictionary +
+
+ +
Authentication settings for the Area.
+
+
+ message_digest + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use message-digest authentication.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set authentication for the area.
+
+
+ default_cost + +
+ integer +
+
+ +
Specify the default cost for default summary LSA.
+
+
+ filter_list + +
+ list + / elements=dictionary +
+
+ +
Filter prefixes between OSPF areas.
+
+
+ direction + +
+ string + / required +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
The direction to apply the route map.
+
+
+ route_map + +
+ string + / required +
+
+ +
The Route-map name.
+
+
+ nssa + +
+ dictionary +
+
+ +
NSSA settings for the area.
+
+
+ default_information_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Originate Type-7 default LSA into NSSA area.
+
+
+ no_redistribution + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send redistributed LSAs into NSSA area.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send summary LSAs into NSSA area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure area as NSSA.
+
+
+ translate + +
+ dictionary +
+
+ +
Translate LSA.
+
+
+ type7 + +
+ dictionary +
+
+ +
Translate from Type 7 to Type 5.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always translate LSAs
+
+
+ never + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Never translate LSAs
+
+
+ supress_fa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress forwarding address in translated LSAs.
+
+
+ ranges + +
+ list + / elements=dictionary +
+
+ +
Configure an address range for the area.
+
+
+ cost + +
+ integer +
+
+ +
Cost to use for the range.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress advertising the specified range.
+
+
+ prefix + +
+ string + / required +
+
+ +
IP in Prefix format (x.x.x.x/len)
+
+
+ stub + +
+ dictionary +
+
+ +
Settings for configuring the area as a stub.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prevent ABR from sending summary LSAs into stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure the area as a stub.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Calculate OSPF cost according to bandwidth.
+
+
+ reference_bandwidth + +
+ integer + / required +
+
+ +
Reference bandwidth used to assign OSPF cost.
+
+
+ unit + +
+ string + / required +
+
+
    Choices: +
  • Gbps
  • +
  • Mbps
  • +
+
+
Specify in which unit the reference bandwidth is specified.
+
+
+ bfd + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD on all OSPF interfaces.
+
+
+ capability + +
+ dictionary +
+
+ +
OSPF capability settings.
+
+
+ vrf_lite + +
+ dictionary +
+
+ +
Enable VRF-lite capability settings.
+
+
+ evpn + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ethernet VPN.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable VRF-lite support.
+
+
+ default_information + +
+ dictionary +
+
+ +
Control distribution of default routes.
+
+
+ originate + +
+ dictionary +
+
+ +
Distribute a default route.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise a default route.
+
+
+ route_map + +
+ string +
+
+ +
Policy to control distribution of default routes
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable distribution of default route.
+
+
+ default_metric + +
+ integer +
+
+ +
Specify default metric for redistributed routes.
+
+
+ distance + +
+ integer +
+
+ +
Configure the OSPF administrative distance.
+
+
+ down_bit_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure a PE router to ignore the DN bit for network summary, external and NSSA external LSA.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Configure graceful restart.
+
+
+ grace_period + +
+ integer +
+
+ +
Configure maximum interval to restart gracefully.
+
+
+ helper_disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable helper mode.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful-restart.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
Log changes in adjacency state.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Notify all state changes.
+
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable logging changes in adjacency state.
+
+
+ max_lsa + +
+ dictionary +
+
+ +
Feature to limit the number of non-self-originated LSAs.
+
+
+ ignore_count + +
+ integer +
+
+ +
Set count on how many times adjacencies can be suppressed.
+
+
+ ignore_time + +
+ integer +
+
+ +
Set time during which all adjacencies are suppressed.
+
+
+ max_non_self_generated_lsa + +
+ integer + / required +
+
+ +
Set the maximum number of non self-generated LSAs.
+
+
+ reset_time + +
+ integer +
+
+ +
Set number of minutes after which ignore-count is reset to zero.
+
+
+ threshold + +
+ integer +
+
+ +
Threshold value (%) at which to generate a warning message.
+
+
+ warning_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log a warning message when limit is exceeded.
+
+
+ max_metric + +
+ dictionary +
+
+ +
Maximize the cost metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Router LSA configuration.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
External LSA configuration.
+
+
+ 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
  • +
+
+
Advertise Max metric for Stub links as well.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Effective only at startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set on-startup attribute.
+
+
+ wait_for_bgp_asn + +
+ integer +
+
+ +
ASN of BGP to wait for.
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ summary_lsa + +
+ dictionary +
+
+ +
Summary LSAs configuration.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Max metric value for summary LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set summary-lsa attribute.
+
+
+ maximum_paths + +
+ integer +
+
+ +
Maximum paths per destination.
+
+
+ name_lookup + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Display OSPF router ids as DNS names.
+
+
+ passive_interface + +
+ dictionary +
+
+ +
Suppress routing updates on the interface.
+
+
+ default + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Interfaces passive by default.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Redistribute information from another routing protocol.
+
+
+ id + +
+ string +
+
+ +
The identifier for the protocol specified.
+
+
+ protocol + +
+ string + / required +
+
+
    Choices: +
  • bgp
  • +
  • direct
  • +
  • eigrp
  • +
  • isis
  • +
  • lisp
  • +
  • ospf
  • +
  • rip
  • +
  • static
  • +
+
+
The name of the protocol.
+
+
+ route_map + +
+ string + / required +
+
+ +
The route map policy to constrain redistribution.
+
+
+ rfc1583compatibility + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure 1583 compatibility for external path preferences.
+
+
+ router_id + +
+ string +
+
+ +
Set OSPF process router-id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shutdown the OSPF protocol instance.
+
+
+ summary_address + +
+ list + / elements=dictionary +
+
+ +
Configure route summarization for redistribution.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Supress advertising the specified summary.
+
+
+ prefix + +
+ string + / required +
+
+ +
IP prefix in format x.x.x.x/ml.
+
+
+ tag + +
+ integer +
+
+ +
A 32-bit tag value.
+
+
+ table_map + +
+ dictionary +
+
+ +
Policy for filtering/modifying OSPF routes before sending them to RIB.
+
+
+ filter + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Block the OSPF routes from being sent to RIB.
+
+
+ name + +
+ string + / required +
+
+ +
The Route Map name.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure timer related constants.
+
+
+ lsa_arrival + +
+ integer +
+
+ +
Mimimum interval between arrival of a LSA.
+
+
+ lsa_group_pacing + +
+ integer +
+
+ +
LSA group refresh/maxage interval.
+
+
+ throttle + +
+ dictionary +
+
+ +
Configure throttle related constants.
+
+
+ lsa + +
+ dictionary +
+
+ +
Set rate-limiting for LSA generation.
+
+
+ hold_interval + +
+ integer +
+
+ +
The hold interval.
+
+
+ max_interval + +
+ integer +
+
+ +
The max interval.
+
+
+ start_interval + +
+ integer +
+
+ +
The start interval.
+
+
+ spf + +
+ dictionary +
+
+ +
Set OSPF SPF timers.
+
+
+ initial_spf_delay + +
+ integer +
+
+ +
Initial SPF schedule delay in milliseconds.
+
+
+ max_wait_time + +
+ integer +
+
+ +
Maximum wait time between SPF calculations.
+
+
+ min_hold_time + +
+ integer +
+
+ +
Minimum hold time between SPF calculations.
+
+
+ vrf + +
+ string + / required +
+
+ +
Name/Identifier of the VRF.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS device by executing the command show running-config | section "^router 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: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • gathered
  • +
  • parsed
  • +
  • rendered
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 7.0(3)I5(1). + - This module works with connection ``network_cli`` and ``httpapi``. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # nxos-9k-rdo# + + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 198.51.100.64/27 + not_advertise: true + - prefix: 198.51.100.96/27 + cost: 120 + - area_id: 0.0.0.101 + authentication: + message_digest: true + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: static + route_map: zone1-static-connect + summary_address: + - prefix: 198.51.100.128/27 + tag: 121 + - prefix: 198.51.100.160/27 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: merged + + # Task output + # ------------- + # before: {} + # + # commands: + # - router ospf 102 + # - router-id 198.51.100.1 + # - redistribute eigrp 120 route-map rmap_1 + # - redistribute direct route-map ospf102-direct-connect + # - area 0.0.0.100 filter-list route-map rmap_1 in + # - area 0.0.0.100 filter-list route-map rmap_2 out + # - area 0.0.0.100 range 198.51.100.64/27 not-advertise + # - area 0.0.0.100 range 198.51.100.96/27 cost 120 + # - area 0.0.0.101 authentication message-digest + # - vrf zone1 + # - router-id 198.51.100.129 + # - summary-address 198.51.100.128/27 tag 121 + # - summary-address 198.51.100.160/27 + # - redistribute static route-map zone1-static-connect + # - area 0.0.0.102 nssa no-summary default-information-originate + # - area 0.0.0.103 nssa no-summary + # - area 0.0.0.103 nssa translate type7 always + # - vrf zone2 + # - auto-cost reference-bandwidth 45 Gbps + # - router ospf 100 + # - router-id 203.0.113.20 + # + # after: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # - cost: 120 + # prefix: 198.51.100.96/27 + # - area_id: 0.0.0.101 + # authentication: + # message_digest: true + # process_id: "102" + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # redistribute: + # - protocol: static + # route_map: zone1-static-connect + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + # router ospf 102 + # router-id 198.51.100.1 + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # area 0.0.0.100 range 198.51.100.96/27 cost 120 + # area 0.0.0.101 authentication message-digest + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # redistribute static route-map zone1-static-connect + # summary-address 198.51.100.128/27 tag 121 + # summary-address 198.51.100.160/27 + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + # Using replaced + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + # router ospf 102 + # router-id 198.51.100.1 + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # area 0.0.0.100 range 198.51.100.96/27 cost 120 + # area 0.0.0.101 authentication message-digest + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # redistribute static route-map zone1-static-connect + # summary-address 198.51.100.128/27 tag 121 + # summary-address 198.51.100.160/27 + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Replace device configurations of listed OSPF processes with provided configurations + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_8 + direction: in + ranges: + - prefix: 198.51.100.64/27 + not_advertise: true + - area_id: 0.0.0.101 + stub: + no_summary: true + redistribute: + - protocol: eigrp + id: 130 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: bgp + id: 65563 + route_map: zone1-bgp-connect + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + state: replaced + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # - cost: 120 + # prefix: 198.51.100.96/27 + # - area_id: 0.0.0.101 + # authentication: + # message_digest: true + # process_id: "102" + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # redistribute: + # - protocol: static + # route_map: zone1-static-connect + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - router ospf 102 + # - redistribute eigrp 130 route-map rmap_1 + # - no redistribute eigrp 120 route-map rmap_1 + # - area 0.0.0.100 filter-list route-map rmap_8 in + # - no area 0.0.0.100 filter-list route-map rmap_2 out + # - no area 0.0.0.100 range 198.51.100.96/27 + # - no area 0.0.0.101 authentication + # - area 0.0.0.101 stub no-summary + # - vrf zone1 + # - no summary-address 198.51.100.128/27 tag 121 + # - no summary-address 198.51.100.160/27 + # - redistribute bgp 65563 route-map zone1-bgp-connect + # - no redistribute static route-map zone1-static-connect + # - no area 0.0.0.103 nssa + # - no area 0.0.0.103 nssa translate type7 always + # - no vrf zone2 + # + # after: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - areas: + # - area_id: 0.0.0.101 + # stub: + # no_summary: true + # - area_id: 0.0.0.100 + # filter_list: + # - direction: in + # route_map: rmap_8 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # process_id: "102" + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "130" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # redistribute: + # - id: "65563" + # protocol: bgp + # route_map: zone1-bgp-connect + # router_id: 198.51.100.129 + # vrf: zone1 + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + # router ospf 102 + # router-id 198.51.100.1 + # area 0.0.0.101 stub no-summary + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 130 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_8 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # redistribute bgp 65563 route-map zone1-bgp-connect + + # Using overridden + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + # router ospf 102 + # router-id 198.51.100.1 + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # area 0.0.0.100 range 198.51.100.96/27 cost 120 + # area 0.0.0.101 authentication message-digest + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # redistribute static route-map zone1-static-connect + # summary-address 198.51.100.128/27 tag 121 + # summary-address 198.51.100.160/27 + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Overridde all OSPF configuration with provided configuration + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 104 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + shutdown: true + state: overridden + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # - cost: 120 + # prefix: 198.51.100.96/27 + # - area_id: 0.0.0.101 + # authentication: + # message_digest: true + # process_id: "102" + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # redistribute: + # - protocol: static + # route_map: zone1-static-connect + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - no router ospf 100 + # - router ospf 104 + # - router-id 203.0.113.20 + # - router ospf 102 + # - shutdown + # - no redistribute direct route-map ospf102-direct-connect + # - no redistribute eigrp 120 route-map rmap_1 + # - no area 0.0.0.100 filter-list route-map rmap_2 out + # - no area 0.0.0.100 filter-list route-map rmap_1 in + # - no area 0.0.0.100 range 198.51.100.64/27 + # - no area 0.0.0.100 range 198.51.100.96/27 + # - no area 0.0.0.101 authentication + # - no vrf zone1 + # - no vrf zone2 + # + # after: + # processes: + # - process_id: "102" + # router_id: 198.51.100.1 + # shutdown: true + # - process_id: "104" + # router_id: 203.0.113.20 + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 102 + # router-id 198.51.100.1 + # shutdown + # router ospf 104 + # router-id 203.0.113.20 + + # Using deleted to delete a single OSPF process + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + # router ospf 102 + # router-id 198.51.100.1 + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # area 0.0.0.100 range 198.51.100.96/27 cost 120 + # area 0.0.0.101 authentication message-digest + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # redistribute static route-map zone1-static-connect + # summary-address 198.51.100.128/27 tag 121 + # summary-address 198.51.100.160/27 + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Delete a single OSPF process + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 102 + state: deleted + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # - cost: 120 + # prefix: 198.51.100.96/27 + # - area_id: 0.0.0.101 + # authentication: + # message_digest: true + # process_id: "102" + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # redistribute: + # - protocol: static + # route_map: zone1-static-connect + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - no router ospf 102 + # + # after: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + + # Using deleted all OSPF processes from the device + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospf 100 + # router-id 203.0.113.20 + # router ospf 102 + # router-id 198.51.100.1 + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # area 0.0.0.100 range 198.51.100.96/27 cost 120 + # area 0.0.0.101 authentication message-digest + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # redistribute static route-map zone1-static-connect + # summary-address 198.51.100.128/27 tag 121 + # summary-address 198.51.100.160/27 + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Delete all OSPF processes from the device + cisco.nxos.nxos_ospfv2: + state: deleted + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # - cost: 120 + # prefix: 198.51.100.96/27 + # - area_id: 0.0.0.101 + # authentication: + # message_digest: true + # process_id: "102" + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # redistribute: + # - protocol: static + # route_map: zone1-static-connect + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - no router ospf 100 + # - no router ospf 102 + # + # after: {} + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # nxos-9k-rdo# + + # Using rendered + + - name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 198.51.100.64/27 + not_advertise: true + - prefix: 198.51.100.96/27 + cost: 120 + - area_id: 0.0.0.101 + authentication: + message_digest: true + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: static + route_map: zone1-static-connect + summary_address: + - prefix: 198.51.100.128/27 + tag: 121 + - prefix: 198.51.100.160/27 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: rendered + + # Task Output (redacted) + # ----------------------- + # rendered: + # - router ospf 100 + # - router-id 203.0.113.20 + # - router ospf 102 + # - router-id 198.51.100.1 + # - redistribute eigrp 120 route-map rmap_1 + # - redistribute direct route-map ospf102-direct-connect + # - area 0.0.0.100 filter-list route-map rmap_1 in + # - area 0.0.0.100 filter-list route-map rmap_2 out + # - area 0.0.0.100 range 198.51.100.64/27 not-advertise + # - area 0.0.0.100 range 198.51.100.96/27 cost 120 + # - area 0.0.0.101 authentication message-digest + # - vrf zone1 + # - router-id 198.51.100.129 + # - summary-address 198.51.100.128/27 tag 121 + # - summary-address 198.51.100.160/27 + # - redistribute static route-map zone1-static-connect + # - area 0.0.0.102 nssa no-summary default-information-originate + # - area 0.0.0.103 nssa no-summary + # - area 0.0.0.103 nssa translate type7 always + # - vrf zone2 + # - auto-cost reference-bandwidth 45 Gbps + + # Using parsed + + # parsed.cfg + # ------------ + # router ospf 100 + # router-id 192.0.100.1 + # area 0.0.0.101 nssa no-summary no-redistribution + # area 0.0.0.102 stub no-summary + # redistribute direct route-map ospf-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 192.0.2.0/24 not-advertise + # area 0.0.0.100 range 192.0.3.0/24 cost 120 + # area 0.0.0.100 authentication message-digest + # vrf zone1 + # router-id 192.0.100.2 + # area 0.0.100.1 nssa no-summary no-redistribution + # redistribute static route-map zone1-direct-connect + # summary-address 10.0.0.0/24 tag 120 + # summary-address 11.0.0.0/24 not-advertise + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + # down-bit-ignore + # capability vrf-lite evpn + # shutdown + # router ospf 102 + # router-id 198.54.100.1 + # shutdown + # vrf zone2 + # summary-address 192.0.8.0/24 tag 120 + # vrf zone4 + # shutdown + + - name: Parse externally provided OSPFv2 config + cisco.nxos.nxos_ospfv2: + running_config: "{{ lookup('file', 'ospfv2.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # parsed: + # processes: + # - process_id: "100" + # areas: + # - area_id: 0.0.0.101 + # nssa: + # no_redistribution: true + # no_summary: true + # - area_id: 0.0.0.102 + # stub: + # no_summary: true + # - area_id: 0.0.0.100 + # authentication: + # message_digest: true + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 192.0.2.0/24 + # - cost: 120 + # prefix: 192.0.3.0/24 + # redistribute: + # - protocol: direct + # route_map: ospf-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 192.0.100.1 + # vrfs: + # - vrf: zone1 + # areas: + # - area_id: 0.0.100.1 + # nssa: + # no_redistribution: true + # no_summary: true + # redistribute: + # - protocol: static + # route_map: zone1-direct-connect + # router_id: 192.0.100.2 + # summary_address: + # - prefix: 10.0.0.0/24 + # tag: 120 + # - not_advertise: true + # prefix: 11.0.0.0/24 + # - vrf: zone2 + # auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # capability: + # vrf_lite: + # evpn: true + # down_bit_ignore: true + # shutdown: true + # - process_id: "102" + # router_id: 198.54.100.1 + # shutdown: true + # vrfs: + # - vrf: zone2 + # summary_address: + # - prefix: 192.0.8.0/24 + # tag: 120 + # - vrf: zone4 + # shutdown: true + + # Using gathered + + - name: Gather OSPFv2 facts using gathered + cisco.nxos.nxos_ospfv2: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # processes: + # - process_id: "102" + # areas: + # - area_id: 0.0.0.101 + # stub: + # no_summary: true + # - area_id: 0.0.0.100 + # filter_list: + # - direction: in + # route_map: rmap_8 + # ranges: + # - not_advertise: true + # prefix: 198.51.100.64/27 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "130" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 198.51.100.1 + # vrfs: + # - vrf: zone1 + # areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # redistribute: + # - id: "65563" + # protocol: bgp + # route_map: zone1-bgp-connect + # router_id: 198.51.100.129 + # + + + +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 model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
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 102', 'router-id 198.54.100.1', 'router ospf 100', 'router-id 192.0.100.1', 'redistribute eigrp 120 route-map rmap_1', 'redistribute direct route-map ospf-direct-connect', 'area 0.0.0.100 filter-list route-map rmap_1 in', 'area 0.0.0.100 filter-list route-map rmap_2 out', 'area 0.0.0.100 range 192.0.2.0/24 not-advertise', 'area 0.0.0.100 range 192.0.3.0/24 cost 120', 'vrf zone1', 'router-id 192.0.100.2', 'summary-address 10.0.0.0/24 tag 121', 'summary-address 11.0.0.0/24', 'redistribute static route-map zone1-direct-connect', 'vrf zone2', 'auto-cost reference-bandwidth 45 Gbps', 'capability vrf-lite evpn']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nilashish Chakraborty (@NilashishC) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv3_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv3_module.rst new file mode 100644 index 00000000..99f0fc04 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ospfv3_module.rst @@ -0,0 +1,4452 @@ +.. _cisco.nxos.nxos_ospfv3_module: + + +********************** +cisco.nxos.nxos_ospfv3 +********************** + +**OSPFv3 resource module** + + +Version added: 1.2.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages OSPFv3 configuration on devices running Cisco NX-OS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of OSPFv3 process configuration.
+
+
+ processes + +
+ list + / elements=dictionary +
+
+ +
A list of OSPFv3 instances' configurations.
+
+
+ address_family + +
+ dictionary +
+
+ +
IPv6 unicast address-family OSPFv3 settings.
+
+
+ afi + +
+ string +
+
+
    Choices: +
  • ipv6
  • +
+
+
Configure OSPFv3 settings under IPv6 address-family.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Configure properties of OSPF Areas under address-family.
+
+
+ area_id + +
+ string + / required +
+
+ +
The Area ID as an integer or IP Address.
+
+
+ default_cost + +
+ integer +
+
+ +
Specify the default cost.
+
+
+ filter_list + +
+ list + / elements=dictionary +
+
+ +
Filter prefixes between OSPF areas.
+
+
+ direction + +
+ string + / required +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
The direction to apply the route map.
+
+
+ route_map + +
+ string + / required +
+
+ +
The Route-map name.
+
+
+ ranges + +
+ list + / elements=dictionary +
+
+ +
Configure an address range for the area.
+
+
+ cost + +
+ integer +
+
+ +
Cost to use for the range.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress advertising the specified range.
+
+
+ prefix + +
+ string + / required +
+
+ +
IP in Prefix format (x.x.x.x/len)
+
+
+ default_information + +
+ dictionary +
+
+ +
Control distribution of default routes.
+
+
+ originate + +
+ dictionary +
+
+ +
Distribute a default route.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise a default route.
+
+
+ route_map + +
+ string +
+
+ +
Policy to control distribution of default routes
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable distribution of default route.
+
+
+ distance + +
+ integer +
+
+ +
Configure the OSPF administrative distance.
+
+
+ maximum_paths + +
+ integer +
+
+ +
Maximum paths per destination.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Redistribute information from another routing protocol.
+
+
+ id + +
+ string +
+
+ +
The identifier for the protocol specified.
+
+
+ protocol + +
+ string + / required +
+
+
    Choices: +
  • bgp
  • +
  • direct
  • +
  • eigrp
  • +
  • isis
  • +
  • lisp
  • +
  • ospfv3
  • +
  • rip
  • +
  • static
  • +
+
+
The name of the protocol.
+
+
+ route_map + +
+ string + / required +
+
+ +
The route map policy to constrain redistribution.
+
+
+ safi + +
+ string +
+
+
    Choices: +
  • unicast
  • +
+
+
Configure OSPFv3 settings under IPv6 unicast address-family.
+
+
+ summary_address + +
+ list + / elements=dictionary +
+
+ +
Configure route summarization for redistribution.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Supress advertising the specified summary.
+
+
+ prefix + +
+ string + / required +
+
+ +
IPv6 prefix format 'xxxx:xxxx/ml', 'xxxx:xxxx::/ml' or 'xxxx::xx/128'
+
+
+ tag + +
+ integer +
+
+ +
A 32-bit tag value.
+
+
+ table_map + +
+ dictionary +
+
+ +
Policy for filtering/modifying OSPF routes before sending them to RIB.
+
+
+ filter + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Block the OSPF routes from being sent to RIB.
+
+
+ name + +
+ string + / required +
+
+ +
The Route Map name.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure timer related constants.
+
+
+ throttle + +
+ dictionary +
+
+ +
Configure throttle related constants.
+
+
+ spf + +
+ dictionary +
+
+ +
Set OSPF SPF timers.
+
+
+ initial_spf_delay + +
+ integer +
+
+ +
Initial SPF schedule delay in milliseconds.
+
+
+ max_wait_time + +
+ integer +
+
+ +
Maximum wait time between SPF calculations.
+
+
+ min_hold_time + +
+ integer +
+
+ +
Minimum hold time between SPF calculations.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Configure properties of OSPF Areas.
+
+
+ area_id + +
+ string + / required +
+
+ +
The Area ID as an integer or IP Address.
+
+
+ nssa + +
+ dictionary +
+
+ +
NSSA settings for the area.
+
+
+ default_information_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Originate Type-7 default LSA into NSSA area.
+
+
+ no_redistribution + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send redistributed LSAs into NSSA area.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send summary LSAs into NSSA area.
+
+
+ route_map + +
+ string +
+
+ +
Policy to control distribution of default route.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure area as NSSA.
+
+
+ translate + +
+ dictionary +
+
+ +
Translate LSA.
+
+
+ type7 + +
+ dictionary +
+
+ +
Translate from Type 7 to Type 5.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always translate LSAs
+
+
+ never + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Never translate LSAs
+
+
+ supress_fa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress forwarding address in translated LSAs.
+
+
+ stub + +
+ dictionary +
+
+ +
Settings for configuring the area as a stub.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prevent ABR from sending summary LSAs into stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure the area as a stub.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Calculate OSPF cost according to bandwidth.
+
+
+ reference_bandwidth + +
+ integer + / required +
+
+ +
Reference bandwidth used to assign OSPF cost.
+
+
+ unit + +
+ string + / required +
+
+
    Choices: +
  • Gbps
  • +
  • Mbps
  • +
+
+
Specify in which unit the reference bandwidth is specified.
+
+
+ flush_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Flush routes on a non-graceful controlled restart.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Configure graceful restart.
+
+
+ grace_period + +
+ integer +
+
+ +
Configure maximum interval to restart gracefully.
+
+
+ helper_disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable helper mode.
+
+
+ planned_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart only for a planned restart
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful-restart.
+
+
+ isolate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Isolate this router from OSPF perspective.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
Log changes in adjacency state.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Notify all state changes.
+
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable logging changes in adjacency state.
+
+
+ max_lsa + +
+ dictionary +
+
+ +
Feature to limit the number of non-self-originated LSAs.
+
+
+ ignore_count + +
+ integer +
+
+ +
Set count on how many times adjacencies can be suppressed.
+
+
+ ignore_time + +
+ integer +
+
+ +
Set time during which all adjacencies are suppressed.
+
+
+ max_non_self_generated_lsa + +
+ integer + / required +
+
+ +
Set the maximum number of non self-generated LSAs.
+
+
+ reset_time + +
+ integer +
+
+ +
Set number of minutes after which ignore-count is reset to zero.
+
+
+ threshold + +
+ integer +
+
+ +
Threshold value (%) at which to generate a warning message.
+
+
+ warning_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log a warning message when limit is exceeded.
+
+
+ max_metric + +
+ dictionary +
+
+ +
Maximize the cost metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Router LSA configuration.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
External LSA configuration.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ inter_area_prefix_lsa + +
+ dictionary +
+
+ +
Inter-area-prefix LSAs configuration.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Max metric value for summary LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set summary-lsa attribute.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Effective only at startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set on-startup attribute.
+
+
+ wait_for_bgp_asn + +
+ integer +
+
+ +
ASN of BGP to wait for.
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ stub_prefix_lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise Max metric for Stub links as well.
+
+
+ name_lookup + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Display OSPF router ids as DNS names.
+
+
+ passive_interface + +
+ dictionary +
+
+ +
Suppress routing updates on the interface.
+
+
+ default + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Interfaces passive by default.
+
+
+ process_id + +
+ string + / required +
+
+ +
The OSPF process tag.
+
+
+ router_id + +
+ string +
+
+ +
Set OSPF process router-id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shutdown the OSPF protocol instance.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure timer related constants.
+
+
+ lsa_arrival + +
+ integer +
+
+ +
Mimimum interval between arrival of a LSA.
+
+
+ lsa_group_pacing + +
+ integer +
+
+ +
LSA group refresh/maxage interval.
+
+
+ throttle + +
+ dictionary +
+
+ +
Configure throttle related constants.
+
+
+ lsa + +
+ dictionary +
+
+ +
Set rate-limiting for LSA generation.
+
+
+ hold_interval + +
+ integer +
+
+ +
The hold interval.
+
+
+ max_interval + +
+ integer +
+
+ +
The max interval.
+
+
+ start_interval + +
+ integer +
+
+ +
The start interval.
+
+
+ vrfs + +
+ list + / elements=dictionary +
+
+ +
Configure VRF specific OSPF settings.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Configure properties of OSPF Areas.
+
+
+ area_id + +
+ string + / required +
+
+ +
The Area ID as an integer or IP Address.
+
+
+ nssa + +
+ dictionary +
+
+ +
NSSA settings for the area.
+
+
+ default_information_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Originate Type-7 default LSA into NSSA area.
+
+
+ no_redistribution + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send redistributed LSAs into NSSA area.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send summary LSAs into NSSA area.
+
+
+ route_map + +
+ string +
+
+ +
Policy to control distribution of default route.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure area as NSSA.
+
+
+ translate + +
+ dictionary +
+
+ +
Translate LSA.
+
+
+ type7 + +
+ dictionary +
+
+ +
Translate from Type 7 to Type 5.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always translate LSAs
+
+
+ never + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Never translate LSAs
+
+
+ supress_fa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress forwarding address in translated LSAs.
+
+
+ stub + +
+ dictionary +
+
+ +
Settings for configuring the area as a stub.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prevent ABR from sending summary LSAs into stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure the area as a stub.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Calculate OSPF cost according to bandwidth.
+
+
+ reference_bandwidth + +
+ integer + / required +
+
+ +
Reference bandwidth used to assign OSPF cost.
+
+
+ unit + +
+ string + / required +
+
+
    Choices: +
  • Gbps
  • +
  • Mbps
  • +
+
+
Specify in which unit the reference bandwidth is specified.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Configure graceful restart.
+
+
+ grace_period + +
+ integer +
+
+ +
Configure maximum interval to restart gracefully.
+
+
+ helper_disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable helper mode.
+
+
+ planned_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart only for a planned restart
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful-restart.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
Log changes in adjacency state.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Notify all state changes.
+
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable logging changes in adjacency state.
+
+
+ max_lsa + +
+ dictionary +
+
+ +
Feature to limit the number of non-self-originated LSAs.
+
+
+ ignore_count + +
+ integer +
+
+ +
Set count on how many times adjacencies can be suppressed.
+
+
+ ignore_time + +
+ integer +
+
+ +
Set time during which all adjacencies are suppressed.
+
+
+ max_non_self_generated_lsa + +
+ integer + / required +
+
+ +
Set the maximum number of non self-generated LSAs.
+
+
+ reset_time + +
+ integer +
+
+ +
Set number of minutes after which ignore-count is reset to zero.
+
+
+ threshold + +
+ integer +
+
+ +
Threshold value (%) at which to generate a warning message.
+
+
+ warning_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log a warning message when limit is exceeded.
+
+
+ max_metric + +
+ dictionary +
+
+ +
Maximize the cost metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Router LSA configuration.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
External LSA configuration.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ inter_area_prefix_lsa + +
+ dictionary +
+
+ +
Inter-area-prefix LSAs configuration.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Max metric value for summary LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set summary-lsa attribute.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Effective only at startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set on-startup attribute.
+
+
+ wait_for_bgp_asn + +
+ integer +
+
+ +
ASN of BGP to wait for.
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ stub_prefix_lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise Max metric for Stub links as well.
+
+
+ name_lookup + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Display OSPF router ids as DNS names.
+
+
+ passive_interface + +
+ dictionary +
+
+ +
Suppress routing updates on the interface.
+
+
+ default + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Interfaces passive by default.
+
+
+ router_id + +
+ string +
+
+ +
Set OSPF process router-id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shutdown the OSPF protocol instance.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure timer related constants.
+
+
+ lsa_arrival + +
+ integer +
+
+ +
Mimimum interval between arrival of a LSA.
+
+
+ lsa_group_pacing + +
+ integer +
+
+ +
LSA group refresh/maxage interval.
+
+
+ throttle + +
+ dictionary +
+
+ +
Configure throttle related constants.
+
+
+ lsa + +
+ dictionary +
+
+ +
Set rate-limiting for LSA generation.
+
+
+ hold_interval + +
+ integer +
+
+ +
The hold interval.
+
+
+ max_interval + +
+ integer +
+
+ +
The max interval.
+
+
+ start_interval + +
+ integer +
+
+ +
The start interval.
+
+
+ vrf + +
+ string + / required +
+
+ +
Name/Identifier of the VRF.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS device by executing the command show running-config | section "^router 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: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • gathered
  • +
  • parsed
  • +
  • rendered
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 7.0(3)I5(1). + - This module works with connection ``network_cli`` and ``httpapi``. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # nxos-9k-rdo# + + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 2001:db2::/32 + not_advertise: true + - prefix: 2001:db3::/32 + cost: 120 + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: merged + + # Task output + # ------------- + # before: {} + # + # commands: + # - router ospf 102 + # - router-id 198.51.100.1 + # - address-family ipv6 unicast + # - redistribute eigrp 120 route-map rmap_1 + # - redistribute direct route-map ospf102-direct-connect + # - area 0.0.0.100 filter-list route-map rmap_1 in + # - area 0.0.0.100 filter-list route-map rmap_2 out + # - area 0.0.0.100 range 2001:db2::/32 not-advertise + # - area 0.0.0.100 range 2001:db3::/32 cost 120 + # - vrf zone1 + # - router-id 198.51.100.129 + # - area 0.0.0.102 nssa no-summary default-information-originate + # - area 0.0.0.103 nssa no-summary + # - area 0.0.0.103 nssa translate type7 always + # - vrf zone2 + # - auto-cost reference-bandwidth 45 Gbps + # - router ospf 100 + # - router-id 203.0.113.20 + # + # after: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv4 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # - cost: 120 + # prefix: 2001:db3::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 100 + # router-id 203.0.113.20 + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family ipv6 unicast + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 2001:db2::/32 not-advertise + # area 0.0.0.100 range 2001:db3::/32 cost 120 + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + # Using replaced + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 100 + # router-id 203.0.113.20 + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family upv6 unicast + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 2001:db2::/32 not-advertise + # area 0.0.0.100 range 2001:db3::/32 cost 120 + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Replace device configurations of listed OSPFv3 processes with provided configurations + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_8 + direction: in + ranges: + - not_advertise: true + prefix: 2001:db2::/32 + redistribute: + - protocol: eigrp + id: 130 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + state: replaced + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv4 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # - cost: 120 + # prefix: 2001:db3::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - router ospf 102 + # - address-family ipv6 unicast + # - redistribute eigrp 130 route-map rmap_1 + # - no redistribute eigrp 120 route-map rmap_1 + # - area 0.0.0.100 filter-list route-map rmap_8 in + # - no area 0.0.0.100 filter-list route-map rmap_2 out + # - no area 0.0.0.100 range 2001:db3::/32 + # - vrf zone1 + # - no area 0.0.0.103 nssa + # - no area 0.0.0.103 nssa translate type7 always + # - no vrf zone2 + # + # after: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv6 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: in + # route_map: rmap_8 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "130" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # router_id: 198.51.100.129 + # vrf: zone1 + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 100 + # router-id 203.0.113.20 + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family ipv6 unicast + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 130 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_8 in + # area 0.0.0.100 range 198.51.100.64/27 not-advertise + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + + # Using overridden + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 100 + # router-id 203.0.113.20 + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family ipv6 unicast + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 2001:db2::/32 not-advertise + # area 0.0.0.100 range 2001:db3::/32 cost 120 + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Overridde all OSPFv3 configuration with provided configuration + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 104 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + shutdown: true + state: overridden + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv4 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # - cost: 120 + # prefix: 2001:db3::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - no router ospfv3 100 + # - router ospfv3 104 + # - router-id 203.0.113.20 + # - router ospfv3 102 + # - shutdown + # - address-family ipv6 unicast + # - no redistribute direct route-map ospf102-direct-connect + # - no redistribute eigrp 120 route-map rmap_1 + # - no area 0.0.0.100 filter-list route-map rmap_2 out + # - no area 0.0.0.100 filter-list route-map rmap_1 in + # - no area 0.0.0.100 range 2001:db2::/32 + # - no area 0.0.0.100 range 2001:db3::/32 + # - no vrf zone1 + # - no vrf zone2 + # + # after: + # processes: + # - process_id: "102" + # router_id: 198.51.100.1 + # shutdown: true + # address_family: + # afi: ipv6 + # safi: unicast + # - process_id: "104" + # router_id: 203.0.113.20 + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family ipv6 unicast + # shutdown + # router ospfv3 104 + # router-id 203.0.113.20 + + # Using deleted to delete a single OSPF process + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospf .*" + # router ospfv3 100 + # router-id 203.0.113.20 + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family ipv6 unicast + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 2001:db2::/32 not-advertise + # area 0.0.0.100 range 2001:db3::/32 cost 120 + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Delete a single OSPFv3 process + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 102 + state: deleted + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv4 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # - cost: 120 + # prefix: 2001:db3::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - no router ospfv3 102 + # + # after: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 100 + # router-id 203.0.113.20 + + # Using deleted all OSPFv3 processes from the device + + # Before state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # router ospfv3 100 + # router-id 203.0.113.20 + # router ospfv3 102 + # router-id 198.51.100.1 + # address-family ipv6 unicast + # redistribute direct route-map ospf102-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 2001:db2::/32 not-advertise + # area 0.0.0.100 range 2001:db3::/32 cost 120 + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.0.102 nssa no-summary default-information-originate + # area 0.0.0.103 nssa no-summary + # area 0.0.0.103 nssa translate type7 always + # vrf zone2 + # auto-cost reference-bandwidth 45 Gbps + + - name: Delete all OSPFv3 processes from the device + cisco.nxos.nxos_ospfv3: + state: deleted + + # Task output + # ------------- + # before: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv4 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # - cost: 120 + # prefix: 2001:db3::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + # commands: + # - no router ospfv3 100 + # - no router ospfv3 102 + # + # after: {} + + # After state: + # ------------ + # nxos-9k-rdo# sh running-config | section "^router ospfv3" + # nxos-9k-rdo# + + # Using rendered + + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 2001:db2::/32 + not_advertise: true + - prefix: 2001:db3::/32 + cost: 120 + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: rendered + + # Task Output (redacted) + # ----------------------- + # rendered: + # - router ospfv3 100 + # - router-id 203.0.113.20 + # - router ospfv3 102 + # - router-id 198.51.100.1 + # - address-family ipv6 unicast + # - redistribute eigrp 120 route-map rmap_1 + # - redistribute direct route-map ospf102-direct-connect + # - area 0.0.0.100 filter-list route-map rmap_1 in + # - area 0.0.0.100 filter-list route-map rmap_2 out + # - area 0.0.0.100 range 2001:db2::/32 not-advertise + # - area 0.0.0.100 range 2001:db3::/32 cost 120 + # - vrf zone1 + # - router-id 198.51.100.129 + # - area 0.0.0.102 nssa no-summary default-information-originate + # - area 0.0.0.103 nssa no-summary + # - area 0.0.0.103 nssa translate type7 always + # - vrf zone2 + # - auto-cost reference-bandwidth 45 Gbps + + # Using parsed + + # parsed.cfg + # ------------ + # router ospfv3 100 + # router-id 192.0.100.1 + # address-family ipv6 unicast + # redistribute direct route-map ospf-direct-connect + # redistribute eigrp 120 route-map rmap_1 + # area 0.0.0.100 filter-list route-map rmap_2 out + # area 0.0.0.100 filter-list route-map rmap_1 in + # area 0.0.0.100 range 2001:db2::/32 not-advertise + # area 0.0.0.100 range 2001:db3::/32 cost 120 + # vrf zone1 + # router-id 198.51.100.129 + # area 0.0.100.1 nssa no-summary no-redistribution + # router ospfv3 102 + # router-id 198.54.100.1 + # shutdown + + - name: Parse externally provided OSPFv3 config + cisco.nxos.nxos_ospfv3: + running_config: "{{ lookup('file', 'ospfv2.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + # parsed: + # processes: + # - process_id: "100" + # address_family: + # afi: ipv6 + # safi: unicast + # areas: + # - area_id: 0.0.0.101 + # nssa: + # no_redistribution: true + # no_summary: true + # - area_id: 0.0.0.102 + # stub: + # no_summary: true + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 192.0.2.0/24 + # - cost: 120 + # prefix: 192.0.3.0/24 + # redistribute: + # - protocol: direct + # route_map: ospf-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # router_id: 192.0.100.1 + # vrfs: + # - vrf: zone1 + # areas: + # - area_id: 0.0.100.1 + # nssa: + # no_redistribution: true + # no_summary: true + # router_id: 192.0.100.2 + # - process_id: "102" + # router_id: 198.54.100.1 + # shutdown: True + + # Using gathered + + - name: Gather OSPFv3 facts using gathered + cisco.nxos.nxos_ospfv3: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # processes: + # - process_id: "100" + # router_id: 203.0.113.20 + # - address_family: + # afi: ipv4 + # safi: unicast + # areas: + # - area_id: 0.0.0.100 + # filter_list: + # - direction: out + # route_map: rmap_2 + # - direction: in + # route_map: rmap_1 + # ranges: + # - not_advertise: true + # prefix: 2001:db2::/32 + # - cost: 120 + # prefix: 2001:db3::/32 + # redistribute: + # - protocol: direct + # route_map: ospf102-direct-connect + # - id: "120" + # protocol: eigrp + # route_map: rmap_1 + # process_id: "102" + # router_id: 198.51.100.1 + # vrfs: + # - areas: + # - area_id: 0.0.0.102 + # nssa: + # default_information_originate: true + # no_summary: true + # - area_id: 0.0.0.103 + # nssa: + # no_summary: true + # translate: + # type7: + # always: true + # router_id: 198.51.100.129 + # vrf: zone1 + # - auto_cost: + # reference_bandwidth: 45 + # unit: Gbps + # vrf: zone2 + # + + + +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 model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
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 ospfv3 102', 'router-id 198.54.100.1', 'router ospfv3 100', 'router-id 192.0.100.1', 'address-family ipv6 unicast', 'redistribute eigrp 120 route-map rmap_1', 'redistribute direct route-map ospf-direct-connect', 'area 0.0.0.100 filter-list route-map rmap_1 in', 'area 0.0.0.100 filter-list route-map rmap_2 out', 'area 0.0.0.100 range 2001:db2::/32 not-advertise', 'area 0.0.0.100 range 2001:db3::/32 cost 120', 'vrf zone1', 'router-id 192.0.100.2', 'vrf zone2', 'auto-cost reference-bandwidth 45 Gbps']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nilashish Chakraborty (@NilashishC) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_overlay_global_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_overlay_global_module.rst new file mode 100644 index 00000000..45ab5308 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_overlay_global_module.rst @@ -0,0 +1,353 @@ +.. _cisco.nxos.nxos_overlay_global_module: + + +****************************** +cisco.nxos.nxos_overlay_global +****************************** + +**Configures anycast gateway MAC of the switch.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Configures anycast gateway MAC of the switch. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ anycast_gateway_mac + +
+ string + / required +
+
+ +
Anycast gateway mac of the switch.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Default restores params default value + - Supported MAC address format are "E.E.E", "EE-EE-EE-EE-EE-EE", "EE:EE:EE:EE:EE:EE" and "EEEE.EEEE.EEEE" + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_overlay_global: + anycast_gateway_mac: b.b.b + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['fabric forwarding anycast-gateway-mac 000B.000B.000B']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_interface_module.rst new file mode 100644 index 00000000..5f50de3e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_interface_module.rst @@ -0,0 +1,612 @@ +.. _cisco.nxos.nxos_pim_interface_module: + + +***************************** +cisco.nxos.nxos_pim_interface +***************************** + +**Manages PIM interface configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages PIM interface configuration settings. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
  • default
  • +
+
+
Enables BFD for PIM at the interface level. This overrides the bfd variable set at the pim global level.
+
Valid values are 'enable', 'disable' or 'default'.
+
Dependency: ''feature bfd''
+
+
+ border + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures interface to be a boundary of a PIM domain.
+
+
+ dr_prio + +
+ string +
+
+ +
Configures priority for PIM DR election on interface.
+
+
+ hello_auth_key + +
+ string +
+
+ +
Authentication for hellos on this interface.
+
+
+ hello_interval + +
+ integer +
+
+ +
Hello interval in milliseconds for this interface.
+
+
+ interface + +
+ string + / required +
+
+ +
Full name of the interface such as Ethernet1/33.
+
+
+ jp_policy_in + +
+ string +
+
+ +
Policy for join-prune messages (inbound).
+
+
+ jp_policy_out + +
+ string +
+
+ +
Policy for join-prune messages (outbound).
+
+
+ jp_type_in + +
+ string +
+
+
    Choices: +
  • prefix
  • +
  • routemap
  • +
+
+
Type of policy mapped to jp_policy_in.
+
+
+ jp_type_out + +
+ string +
+
+
    Choices: +
  • prefix
  • +
  • routemap
  • +
+
+
Type of policy mapped to jp_policy_out.
+
+
+ neighbor_policy + +
+ string +
+
+ +
Configures a neighbor policy for filtering adjacencies.
+
+
+ neighbor_type + +
+ string +
+
+
    Choices: +
  • prefix
  • +
  • routemap
  • +
+
+
Type of policy mapped to neighbor_policy.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ sparse + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Enable/disable sparse-mode on the interface.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
  • default
  • +
+
+
Manages desired state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - When ``state=default``, supported params will be reset to a default state. These include ``dr_prio``, ``hello_auth_key``, ``hello_interval``, ``jp_policy_out``, ``jp_policy_in``, ``jp_type_in``, ``jp_type_out``, ``border``, ``neighbor_policy``, ``neighbor_type``. + - The ``hello_auth_key`` param is not idempotent. + - ``hello_auth_key`` only supports clear text passwords. + - When ``state=absent``, pim interface configuration will be set to defaults and pim-sm will be disabled on the interface. + - PIM must be enabled on the device to use this module. + - This module is for Layer 3 interfaces. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure PIM is not running on the interface + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + state: absent + + - name: Ensure the interface has pim-sm enabled with the appropriate priority and + hello interval + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + dr_prio: 10 + hello_interval: 40 + state: present + + - name: Ensure join-prune policies exist + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + jp_policy_in: JPIN + jp_policy_out: JPOUT + jp_type_in: routemap + jp_type_out: routemap + + - name: disable bfd on the interface + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + bfd: disable + + - name: Ensure defaults are in place + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + state: default + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['interface eth1/33', 'ip pim neighbor-policy test', 'ip pim bfd-instance disable', 'ip pim neighbor-policy test']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_module.rst new file mode 100644 index 00000000..792bb32b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_module.rst @@ -0,0 +1,380 @@ +.. _cisco.nxos.nxos_pim_module: + + +******************* +cisco.nxos.nxos_pim +******************* + +**Manages configuration of a PIM instance.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages configuration of a Protocol Independent Multicast (PIM) instance. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • disable
  • +
+
+
Enables BFD on all PIM interfaces.
+
Dependency: ''feature bfd''
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ ssm_range + +
+ list + / elements=string +
+
+ +
Configure group ranges for Source Specific Multicast (SSM). Valid values are multicast addresses or the keyword none or keyword default. none removes all SSM group ranges. default will set ssm_range to the default multicast address. If you set multicast address, please ensure that it is not the same as the default, otherwise use the default option.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Configure ssm_range, enable bfd + cisco.nxos.nxos_pim: + bfd: enable + ssm_range: 224.0.0.0/8 + + - name: Set to default + cisco.nxos.nxos_pim: + ssm_range: default + + - name: Remove all ssm group ranges + cisco.nxos.nxos_pim: + ssm_range: none + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['ip pim bfd', 'ip pim ssm range 224.0.0.0/8']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_rp_address_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_rp_address_module.rst new file mode 100644 index 00000000..ad404f6b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_pim_rp_address_module.rst @@ -0,0 +1,436 @@ +.. _cisco.nxos.nxos_pim_rp_address_module: + + +****************************** +cisco.nxos.nxos_pim_rp_address +****************************** + +**Manages configuration of an PIM static RP address instance.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages configuration of an Protocol Independent Multicast (PIM) static rendezvous point (RP) address instance. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ bidir + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Group range is treated in PIM bidirectional mode.
+
+
+ group_list + +
+ string +
+
+ +
Group range for static RP. Valid values are multicast addresses.
+
+
+ prefix_list + +
+ string +
+
+ +
Prefix list policy for static RP. Valid values are prefix-list policy names.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ route_map + +
+ string +
+
+ +
Route map policy for static RP. Valid values are route-map policy names.
+
+
+ rp_address + +
+ string + / required +
+
+ +
Configures a Protocol Independent Multicast (PIM) static rendezvous point (RP) address. Valid values are unicast addresses.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specify desired state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` is currently not supported on all platforms. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_pim_rp_address: + rp_address: 10.1.1.20 + 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 +
commands sent to the device
+
+
Sample:
+
['router bgp 65535', 'vrf test', 'router-id 192.0.2.1']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ping_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ping_module.rst new file mode 100644 index 00000000..8feb3f4b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_ping_module.rst @@ -0,0 +1,503 @@ +.. _cisco.nxos.nxos_ping_module: + + +******************** +cisco.nxos.nxos_ping +******************** + +**Tests reachability using ping from Nexus switch.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Tests reachability using ping from switch to a remote destination. +- For a general purpose network module, see the :ref:`ansible.netcommon.net_ping ` module. +- For Windows targets, use the :ref:`ansible.windows.win_ping ` module instead. +- For targets running Python, use the :ref:`ansible.builtin.ping ` module instead. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ count + +
+ integer +
+
+ Default:
5
+
+
Number of packets to send.
+
+
+ dest + +
+ string + / required +
+
+ +
IP address or hostname (resolvable by switch) of remote node.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ source + +
+ string +
+
+ +
Source IP Address or hostname (resolvable by switch)
+
+
+ state + +
+ string +
+
+
    Choices: +
  • absent
  • +
  • present ←
  • +
+
+
Determines if the expected result is success or fail.
+
+
+ vrf + +
+ string +
+
+ +
Outgoing VRF.
+
+
+ + +Notes +----- + +.. note:: + - For a general purpose network module, see the :ref:`ansible.netcommon.net_ping ` module. + - For Windows targets, use the :ref:`ansible.windows.win_ping ` module instead. + - For targets running Python, use the :ref:`ansible.builtin.ping ` module instead. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Test reachability to 8.8.8.8 using mgmt vrf + cisco.nxos.nxos_ping: + dest: 8.8.8.8 + vrf: management + host: 68.170.147.165 + + - name: Test reachability to a few different public IPs using mgmt vrf + cisco.nxos.nxos_ping: + dest: nxos_ping + vrf: management + host: 68.170.147.165 + with_items: + - 8.8.8.8 + - 4.4.4.4 + - 198.6.1.4 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
Show the command sent
+
+
Sample:
+
['ping 8.8.8.8 count 2 vrf management']
+
+
+ packet_loss + +
+ string +
+
always +
Percentage of packets lost
+
+
Sample:
+
0.00%
+
+
+ packets_rx + +
+ integer +
+
always +
Packets successfully received
+
+
Sample:
+
2
+
+
+ packets_tx + +
+ integer +
+
always +
Packets successfully transmitted
+
+
Sample:
+
2
+
+
+ rtt + +
+ dictionary +
+
always +
Show RTT stats
+
+
Sample:
+
{'avg': 6.264, 'max': 6.564, 'min': 5.978}
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_reboot_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_reboot_module.rst new file mode 100644 index 00000000..3a3735d4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_reboot_module.rst @@ -0,0 +1,356 @@ +.. _cisco.nxos.nxos_reboot_module: + + +********************** +cisco.nxos.nxos_reboot +********************** + +**Reboot a network device.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Reboot a network device. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ confirm + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Safeguard boolean. Set to true if you're sure you want to reboot.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - The module will fail due to timeout issues, but the reboot will be performed anyway. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_reboot: + confirm: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ rebooted + +
+ boolean +
+
success +
Whether the device was instructed to reboot.
+
+
Sample:
+
True
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rollback_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rollback_module.rst new file mode 100644 index 00000000..5e54f1c1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rollback_module.rst @@ -0,0 +1,392 @@ +.. _cisco.nxos.nxos_rollback_module: + + +************************ +cisco.nxos.nxos_rollback +************************ + +**Set a checkpoint or rollback to a checkpoint.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module offers the ability to set a configuration checkpoint file or rollback to a configuration checkpoint file on Cisco NXOS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ checkpoint_file + +
+ string +
+
+ +
Name of checkpoint file to create. Mutually exclusive with rollback_to.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ rollback_to + +
+ string +
+
+ +
Name of checkpoint file to rollback to. Mutually exclusive with checkpoint_file.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Sometimes ``transport=nxapi`` may cause a timeout error. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_rollback: + checkpoint_file: backup.cfg + username: '{{ un }}' + password: '{{ pwd }}' + host: '{{ inventory_hostname }}' + - cisco.nxos.nxos_rollback: + rollback_to: backup.cfg + username: '{{ un }}' + password: '{{ pwd }}' + host: '{{ inventory_hostname }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ filename + +
+ string +
+
success +
The filename of the checkpoint/rollback file.
+
+
Sample:
+
backup.cfg
+
+
+ status + +
+ string +
+
success +
Which operation took place and whether it was successful.
+
+
Sample:
+
rollback executed
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rpm_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rpm_module.rst new file mode 100644 index 00000000..f6d4f5f5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_rpm_module.rst @@ -0,0 +1,459 @@ +.. _cisco.nxos.nxos_rpm_module: + + +******************* +cisco.nxos.nxos_rpm +******************* + +**Install patch or feature rpms on Cisco NX-OS devices.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Install software maintenance upgrade (smu) RPMS and 3rd party RPMS on Cisco NX-OS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of RPM/patch definitions.
+
+
+ file_system + +
+ string +
+
+ +
The remote file system of the device. If omitted, devices that support a file_system parameter will use their default values.
+
+
+ pkg + +
+ string + / required +
+
+ +
Name of the RPM package.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
If the state is present, the rpm will be installed, If the state is absent, it will be removed.
+
+
+ file_system + +
+ string +
+
+ Default:
"bootflash"
+
+
The remote file system of the device. If omitted, devices that support a file_system parameter will use their default values.
+
+
+ pkg + +
+ string +
+
+ +
Name of the RPM package.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
If the state is present, the rpm will be installed, If the state is absent, it will be removed.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.0(3)I2(5), 7.0(3)I4(6), 7.0(3)I5(3), 7.0(3)I6(1), 7.0(3)I7(3) + - For patches, the minimum platform version needed is 7.0(3)I2(5) + - For feature rpms, the minimum platform version needed is 7.0(3)I6(1) + - The module manages the entire RPM lifecycle (Add, activate, commit, deactivate, remove) + - For reload patches, this module is NOT idempotent until the patch is committed. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_rpm: + pkg: nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000.rpm + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['install add bootflash:nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000.rpm forced', 'install activate nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000 forced', 'install commit nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Sai Chintalapudi (@saichint) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_smu_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_smu_module.rst new file mode 100644 index 00000000..fe81bdbe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_smu_module.rst @@ -0,0 +1,380 @@ +.. _cisco.nxos.nxos_smu_module: + + +******************* +cisco.nxos.nxos_smu +******************* + +**(deprecated, removed after 2022-10-01) Perform SMUs on Cisco NX-OS devices.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-10-01 +:Why: Updated modules released with more functionality. +:Alternative: nxos_rpm + + + +Synopsis +-------- +- Perform software maintenance upgrades (SMUs) on Cisco NX-OS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ file_system + +
+ string +
+
+ Default:
"bootflash:"
+
+
The remote file system of the device. If omitted, devices that support a file_system parameter will use their default values.
+
+
+ pkg + +
+ string + / required +
+
+ +
Name of the remote package.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - The module can only activate and commit a package, not remove or deactivate it. + - Use ``transport=nxapi`` to avoid connection timeout + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_smu: + pkg: nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['install add bootflash:nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm', 'install activate bootflash:nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm force', 'install commit bootflash:nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snapshot_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snapshot_module.rst new file mode 100644 index 00000000..af135d60 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snapshot_module.rst @@ -0,0 +1,596 @@ +.. _cisco.nxos.nxos_snapshot_module: + + +************************ +cisco.nxos.nxos_snapshot +************************ + +**Manage snapshots of the running states of selected features.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Create snapshots of the running states of selected features, add new show commands for snapshot creation, delete and compare existing snapshots. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ action + +
+ string + / required +
+
+
    Choices: +
  • add
  • +
  • compare
  • +
  • create
  • +
  • delete
  • +
  • delete_all
  • +
+
+
Define what snapshot action the module would perform.
+
+
+ compare_option + +
+ string +
+
+
    Choices: +
  • summary
  • +
  • ipv4routes
  • +
  • ipv6routes
  • +
+
+
Snapshot options to be used when action=compare.
+
+
+ comparison_results_file + +
+ string +
+
+ +
Name of the file where snapshots comparison will be stored when action=compare.
+
+
+ description + +
+ string +
+
+ +
Snapshot description to be used when action=create.
+
+
+ element_key1 + +
+ string +
+
+ +
Specify the tags used to distinguish among row entries, to be used when action=add.
+
+
+ element_key2 + +
+ string +
+
+ +
Specify the tags used to distinguish among row entries, to be used when action=add.
+
+
+ path + +
+ string +
+
+ Default:
"./"
+
+
Specify the path of the file where new created snapshot or snapshots comparison will be stored, to be used when action=create and save_snapshot_locally=true or action=compare.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ row_id + +
+ string +
+
+ +
Specifies the tag of each row entry of the show command's XML output, to be used when action=add.
+
+
+ save_snapshot_locally + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Specify to locally store a new created snapshot, to be used when action=create.
+
+
+ section + +
+ string +
+
+ +
Used to name the show command output, to be used when action=add.
+
+
+ show_command + +
+ string +
+
+ +
Specify a new show command, to be used when action=add.
+
+
+ snapshot1 + +
+ string +
+
+ +
First snapshot to be used when action=compare.
+
+
+ snapshot2 + +
+ string +
+
+ +
Second snapshot to be used when action=compare.
+
+
+ snapshot_name + +
+ string +
+
+ +
Snapshot name, to be used when action=create or action=delete.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``transport=cli`` may cause timeout errors. + - The ``element_key1`` and ``element_key2`` parameter specify the tags used to distinguish among row entries. In most cases, only the element_key1 parameter needs to specified to be able to distinguish among row entries. + - ``action=compare`` will always store a comparison report on a local file. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Create a snapshot and store it locally + - cisco.nxos.nxos_snapshot: + action: create + snapshot_name: test_snapshot + description: Done with Ansible + save_snapshot_locally: true + path: /home/user/snapshots/ + + # Delete a snapshot + - cisco.nxos.nxos_snapshot: + action: delete + snapshot_name: test_snapshot + + # Delete all existing snapshots + - cisco.nxos.nxos_snapshot: + action: delete_all + + # Add a show command for snapshots creation + - cisco.nxos.nxos_snapshot: + section: myshow + show_command: show ip interface brief + row_id: ROW_intf + element_key1: intf-name + + # Compare two snapshots + - cisco.nxos.nxos_snapshot: + action: compare + snapshot1: pre_snapshot + snapshot2: post_snapshot + comparison_results_file: compare_snapshots.txt + compare_option: summary + path: ../snapshot_reports/ + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
verbose mode +
commands sent to the device
+
+
Sample:
+
['snapshot create post_snapshot Post-snapshot']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_community_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_community_module.rst new file mode 100644 index 00000000..f5e89673 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_community_module.rst @@ -0,0 +1,423 @@ +.. _cisco.nxos.nxos_snmp_community_module: + + +****************************** +cisco.nxos.nxos_snmp_community +****************************** + +**Manages SNMP community configs.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages SNMP community configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ access + +
+ string +
+
+
    Choices: +
  • ro
  • +
  • rw
  • +
+
+
Access type for community.
+
+
+ acl + +
+ string +
+
+ +
ACL name to filter snmp requests or keyword 'default'.
+
+
+ community + +
+ string + / required +
+
+ +
Case-sensitive community string.
+
+
+ group + +
+ string +
+
+ +
Group to which the community belongs.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure snmp community is configured + - cisco.nxos.nxos_snmp_community: + community: TESTING7 + group: network-operator + 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 +
commands sent to the device
+
+
Sample:
+
['snmp-server community TESTING7 group network-operator']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_contact_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_contact_module.rst new file mode 100644 index 00000000..ccd4c8ee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_contact_module.rst @@ -0,0 +1,374 @@ +.. _cisco.nxos.nxos_snmp_contact_module: + + +**************************** +cisco.nxos.nxos_snmp_contact +**************************** + +**Manages SNMP contact info.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages SNMP contact information. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ contact + +
+ string + / required +
+
+ +
Contact information.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the contact configuration if it is configured. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure snmp contact is configured + - cisco.nxos.nxos_snmp_contact: + contact: Test + 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 +
commands sent to the device
+
+
Sample:
+
['snmp-server contact New_Test']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_host_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_host_module.rst new file mode 100644 index 00000000..3141cfa4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_host_module.rst @@ -0,0 +1,510 @@ +.. _cisco.nxos.nxos_snmp_host_module: + + +************************* +cisco.nxos.nxos_snmp_host +************************* + +**Manages SNMP host configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages SNMP host configuration parameters. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ community + +
+ string +
+
+ +
Community string or v3 username.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ snmp_host + +
+ string + / required +
+
+ +
IP address of hostname of target host.
+
+
+ snmp_type + +
+ string +
+
+
    Choices: +
  • trap
  • +
  • inform
  • +
+
+
type of message to send to host. If this is not specified, trap type is used.
+
+
+ src_intf + +
+ string +
+
+ +
Source interface. Must be fully qualified interface name. If state = absent, the interface is removed.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource. If state = present, the host is added to the configuration. If only vrf and/or vrf_filter and/or src_intf are given, they will be added to the existing host configuration. If state = absent, the host is removed if community parameter is given. It is possible to remove only vrf and/or src_int and/or vrf_filter by providing only those parameters and no community parameter.
+
+
+ udp + +
+ string +
+
+ Default:
162
+
+
UDP port number (0-65535).
+
+
+ v3 + +
+ string +
+
+
    Choices: +
  • noauth
  • +
  • auth
  • +
  • priv
  • +
+
+
Use this when verion is v3. SNMPv3 Security level.
+
+
+ version + +
+ string +
+
+
    Choices: +
  • v1
  • +
  • v2c
  • +
  • v3
  • +
+
+
SNMP version. If this is not specified, v1 is used.
+
+
+ vrf + +
+ string +
+
+ +
VRF to use to source traffic to source. If state = absent, the vrf is removed.
+
+
+ vrf_filter + +
+ string +
+
+ +
Name of VRF to filter. If state = absent, the vrf is removed from the filter.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - ``state=absent`` removes the host configuration if it is configured. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure snmp host is configured + - cisco.nxos.nxos_snmp_host: + snmp_host: 192.0.2.3 + community: TESTING + 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 +
commands sent to the device
+
+
Sample:
+
['snmp-server host 192.0.2.3 filter-vrf another_test_vrf']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_location_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_location_module.rst new file mode 100644 index 00000000..26a09103 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_location_module.rst @@ -0,0 +1,378 @@ +.. _cisco.nxos.nxos_snmp_location_module: + + +***************************** +cisco.nxos.nxos_snmp_location +***************************** + +**Manages SNMP location information.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages SNMP location configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ location + +
+ string + / required +
+
+ +
Location information.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure snmp location is configured + - cisco.nxos.nxos_snmp_location: + location: Test + state: present + + # ensure snmp location is not configured + - cisco.nxos.nxos_snmp_location: + location: Test + 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 +
commands sent to the device
+
+
Sample:
+
['snmp-server location New_Test']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_traps_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_traps_module.rst new file mode 100644 index 00000000..7bc9040d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_traps_module.rst @@ -0,0 +1,411 @@ +.. _cisco.nxos.nxos_snmp_traps_module: + + +************************** +cisco.nxos.nxos_snmp_traps +************************** + +**Manages SNMP traps.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages SNMP traps configurations. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ group + +
+ string + / required +
+
+
    Choices: +
  • aaa
  • +
  • bfd
  • +
  • bgp
  • +
  • bridge
  • +
  • callhome
  • +
  • cfs
  • +
  • config
  • +
  • eigrp
  • +
  • entity
  • +
  • feature-control
  • +
  • generic
  • +
  • hsrp
  • +
  • license
  • +
  • link
  • +
  • lldp
  • +
  • mmode
  • +
  • ospf
  • +
  • pim
  • +
  • rf
  • +
  • rmon
  • +
  • snmp
  • +
  • storm-control
  • +
  • stpx
  • +
  • switchfabric
  • +
  • syslog
  • +
  • sysmgr
  • +
  • system
  • +
  • upgrade
  • +
  • vtp
  • +
  • all
  • +
+
+
Case sensitive group.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • enabled ←
  • +
  • disabled
  • +
+
+
Manage the state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - This module works at the group level for traps. If you need to only enable/disable 1 specific trap within a group, use the :ref:`cisco.nxos.nxos_command ` module. + - Be aware that you can set a trap only for an enabled feature. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure lldp trap configured + - cisco.nxos.nxos_snmp_traps: + group: lldp + state: enabled + + # ensure lldp trap is not configured + - cisco.nxos.nxos_snmp_traps: + group: lldp + state: disabled + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
snmp-server enable traps lldp ;
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_user_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_user_module.rst new file mode 100644 index 00000000..0f7e2eb3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_snmp_user_module.rst @@ -0,0 +1,457 @@ +.. _cisco.nxos.nxos_snmp_user_module: + + +************************* +cisco.nxos.nxos_snmp_user +************************* + +**Manages SNMP users for monitoring.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages SNMP user configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ authentication + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • sha
  • +
+
+
Authentication parameters for the user.
+
+
+ encrypt + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables AES-128 bit encryption when using privacy password.
+
+
+ group + +
+ string +
+
+ +
Group to which the user will belong to. If state = present, and the user is existing, the group is added to the user. If the user is not existing, user entry is created with this group argument. If state = absent, only the group is removed from the user entry. However, to maintain backward compatibility, if the existing user belongs to only one group, and if group argument is same as the existing user's group, then the user entry also is deleted.
+
+
+ privacy + +
+ string +
+
+ +
Privacy password for the user. This is not idempotent
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ pwd + +
+ string +
+
+ +
Authentication password when using md5 or sha. This is not idempotent
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ user + +
+ string + / required +
+
+ +
Name of the user.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Authentication parameters not idempotent. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_snmp_user: + user: ntc + group: network-operator + authentication: md5 + pwd: test_password + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['snmp-server user ntc network-operator auth md5 test_password']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_route_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_route_module.rst new file mode 100644 index 00000000..8edf03d9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_route_module.rst @@ -0,0 +1,630 @@ +.. _cisco.nxos.nxos_static_route_module: + + +**************************** +cisco.nxos.nxos_static_route +**************************** + +**(deprecated, removed after 2022-06-01) Manages static route configuration** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_static_routes + + + +Synopsis +-------- +- Manages static route configuration + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of static route definitions
+
+
+ next_hop + +
+ string + / required +
+
+ +
Next hop address or interface of static route. If interface, it must be the fully-qualified interface name.
+
+
+ pref + +
+ string +
+
+ +
Preference or administrative difference of route (range 1-255) or keyword 'default'.
+

aliases: admin_distance
+
+
+ prefix + +
+ string + / required +
+
+ +
Destination prefix of static route.
+
+
+ route_name + +
+ string +
+
+ +
Name of the route or keyword 'default'. Used with the name parameter on the CLI.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ tag + +
+ string +
+
+ +
Route tag value (numeric) or keyword 'default'.
+
+
+ track + +
+ integer +
+
+ +
Track value (range 1 - 512). Track must already be configured on the device before adding the route.
+
+
+ vrf + +
+ string +
+
+ +
VRF for static route.
+
+
+ next_hop + +
+ string +
+
+ +
Next hop address or interface of static route. If interface, it must be the fully-qualified interface name.
+
+
+ pref + +
+ string +
+
+ +
Preference or administrative difference of route (range 1-255) or keyword 'default'.
+

aliases: admin_distance
+
+
+ prefix + +
+ string +
+
+ +
Destination prefix of static route.
+

aliases: address
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ route_name + +
+ string +
+
+ +
Name of the route or keyword 'default'. Used with the name parameter on the CLI.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ tag + +
+ string +
+
+ +
Route tag value (numeric) or keyword 'default'.
+
+
+ track + +
+ integer +
+
+ +
Track value (range 1 - 512). Track must already be configured on the device before adding the route.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
VRF for static route.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - If no vrf is supplied, vrf is set to default. + - If ``state=absent``, the route will be removed, regardless of the non-required parameters. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_static_route: + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: testing + pref: 100 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['ip route 192.168.20.0/24 192.0.2.3 name testing 100']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_routes_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_routes_module.rst new file mode 100644 index 00000000..e6ed6852 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_static_routes_module.rst @@ -0,0 +1,722 @@ +.. _cisco.nxos.nxos_static_routes_module: + + +***************************** +cisco.nxos.nxos_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 Cisco NX-OS 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 prefix of static route
+
The address format is <ipv4/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)
+
+
+ dest_vrf + +
+ string +
+
+ +
VRF of the destination
+
+
+ forward_router_address + +
+ string +
+
+ +
IP address of the next hop router
+
+
+ interface + +
+ string +
+
+ +
Outgoing interface to take. For anything except 'Null0', then next hop IP address should also be configured.
+
+
+ route_name + +
+ string +
+
+ +
Name of the static route
+
+
+ tag + +
+ integer +
+
+ +
Route tag value (numeric)
+
+
+ track + +
+ integer +
+
+ +
Track value (range 1 - 512). Track must already be configured on the device before adding the route.
+
+
+ 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 NX-OS device by executing the following commands in order show running-config | include '^ip(v6* route') and show running-config | section '^vrf context'.
+
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 NX-OS 7.3.(0)D1(1) on VIRL + - When a route is configured for a non-existent VRF, the VRF is created and the route is added to it. + - When deleting routes for a VRF, all routes inside the VRF are deleted, but the VRF is not deleted. + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted: + + # Before state: + # ------------- + # + # ip route 192.0.2.32/28 192.0.2.12 name new_route + # ip route 192.0.2.26/24 192.0.2.13 tag 12 + + - name: Delete all routes + cisco.nxos.nxos_static_routes: + state: deleted + + # After state: + # ------------ + # + + + # Before state: + # ------------ + # + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + # ip route 192.0.2.64/28 192.0.2.22 tag 4 + # ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + # ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + + - name: Delete routes based on VRF + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + state: deleted + + # After state: + # ----------- + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + + + # Before state: + # ------------ + # + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + # ip route 192.0.2.64/28 192.0.2.22 tag 4 + # ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + # ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + + - name: Delete routes based on AFI in a VRF + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + state: deleted + + # After state: + # ----------- + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + # ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + + + # Before state: + # ----------- + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # vrf context trial_vrf + # ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + + + # Using merged + + # Before state: + # ------------- + # + + - name: Merge new static route configuration + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.64/24 + next_hops: + - forward_router_address: 192.0.2.22 + tag: 4 + admin_distance: 2 + + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/24 + next_hops: + - forward_router_address: 192.0.2.24 + route_name: new_route + - afi: ipv6 + routes: + - dest: 2001:db8::/64 + next_hops: + - interface: eth1/3 + forward_router_address: 2001:db8::12 + state: merged + + # After state: + # ------------ + # + # ip route 192.0.2.16/24 192.0.2.24 name new_route + # ipv6 route 2001:db8::/64 Ethernet1/3 2001:db8::12 + # vrf context trial_vrf + # ip route 192.0.2.0/24 192.0.2.22 tag 4 2 + + + # Using overridden: + + # Before state: + # ------------- + # + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + # ip route 192.0.2.64/28 192.0.2.22 tag 4 + # ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + + - name: Overriden existing static route configuration with new configuration + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.23 + route_name: overridden_route1 + admin_distance: 3 + + - forward_router_address: 192.0.2.45 + route_name: overridden_route2 + dest_vrf: destinationVRF + interface: Ethernet1/2 + state: overridden + + # After state: + # ------------ + # + # ip route 192.0.2.16/28 192.0.2.23 name replaced_route1 3 + # ip route 192.0.2.16/28 Ethernet1/2 192.0.2.45 vrf destinationVRF name replaced_route2 + + + # Using replaced: + + # Before state: + # ------------ + # ip route 192.0.2.16/28 192.0.2.24 name new_route + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + # ip route 192.0.2.64/28 192.0.2.22 tag 4 + # ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + + - name: Replaced the existing static configuration of a prefix with new configuration + cisco.nxos.nxos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.23 + route_name: replaced_route1 + admin_distance: 3 + + - forward_router_address: 192.0.2.45 + route_name: replaced_route2 + dest_vrf: destinationVRF + interface: Ethernet1/2 + state: replaced + + # After state: + # ----------- + # ip route 192.0.2.16/28 192.0.2.23 name replaced_route1 3 + # ip route 192.0.2.16/28 Ethernet1/2 192.0.2.45 vrf destinationVRF name replaced_route2 + # ip route 192.0.2.80/28 192.0.2.26 tag 12 + # vrf context trial_vrf + # ip route 192.0.2.64/28 192.0.2.22 tag 4 + # ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + + + # Using gathered: + + # Before state: + # ------------- + # ipv6 route 2001:db8:12::/32 2001:db8::12 + # vrf context Test + # ip route 192.0.2.48/28 192.0.2.13 + # ip route 192.0.2.48/28 192.0.2.14 5 + + - name: Gather the exisitng condiguration + cisco.nxos.nxos_static_routes: + state: gathered + + # returns: + # gathered: + # - vrf: Test + # address_families: + # - afi: ipv4 + # routes: + # - dest: 192.0.2.48/28 + # next_hops: + # - forward_router_address: 192.0.2.13 + # + # - forward_router_address: 192.0.2.14 + # admin_distance: 5 + # + # - address_families: + # - afi: ipv6 + # routes: + # - dest: 2001:db8:12::/32 + # next_hops: + # - forward_router_address: 2001:db8::12 + + + # Using rendered: + + - name: Render required configuration to be pushed to the device + cisco.nxos.nxos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.48/28 + next_hops: + - forward_router_address: 192.0.2.13 + + - afi: ipv6 + routes: + - dest: 2001:db8::/64 + next_hops: + - interface: eth1/3 + forward_router_address: 2001:db8::12 + state: rendered + + # returns + # rendered: + # vrf context default + # ip route 192.0.2.48/28 192.0.2.13 + # ipv6 route 2001:db8::/64 Ethernet1/3 2001:db8::12 + + + # Using parsed + + - name: Parse the config to structured data + cisco.nxos.nxos_static_routes: + running_config: | + ipv6 route 2002:db8:12::/32 2002:db8:12::1 + vrf context Test + ip route 192.0.2.48/28 192.0.2.13 + ip route 192.0.2.48/28 192.0.2.14 5 + + # returns: + # parsed: + # - vrf: Test + # address_families: + # - afi: ipv4 + # routes: + # - dest: 192.0.2.48/28 + # next_hops: + # - forward_router_address: 192.0.2.13 + # + # - forward_router_address: 192.0.2.14 + # admin_distance: 5 + # + # - address_families: + # - afi: ipv6 + # routes: + # - dest: 2002:db8:12::/32 + # next_hops: + # - forward_router_address: 2002:db8:12::1 + + + +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 192.0.2.48/28 192.0.2.12 Ethernet1/2 name sample_route', 'ipv6 route 2001:db8:3000::/36 2001:db8:200:2::2', 'vrf context test', 'ip route 192.0.2.48/28 192.0.2.121']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Adharsh Srivats Rangarajan (@adharshsrivatsr) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_system_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_system_module.rst new file mode 100644 index 00000000..867307b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_system_module.rst @@ -0,0 +1,468 @@ +.. _cisco.nxos.nxos_system_module: + + +********************** +cisco.nxos.nxos_system +********************** + +**Manage the system attributes on Cisco NXOS devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of node system attributes on Cisco NXOS 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_lookup + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables or disables the DNS lookup feature in Cisco NXOS. This argument accepts boolean values. When enabled, the system will try to resolve hostnames using DNS and when disabled, hostnames will not be resolved.
+
+
+ domain_name + +
+ list + / elements=raw +
+
+ +
Configures the default domain name suffix to be used when referencing this node by its FQDN. This argument accepts either a list of domain names or a list of dicts that configure the domain name and VRF name or keyword 'default'. See examples.
+
+
+ domain_search + +
+ list + / elements=raw +
+
+ +
Configures a list of domain name suffixes to search when performing DNS name resolution. This argument accepts either a list of domain names or a list of dicts that configure the domain name and VRF name or keyword 'default'. See examples.
+
+
+ hostname + +
+ string +
+
+ +
Configure the device hostname parameter. This option takes an ASCII string value or keyword 'default'
+
+
+ name_servers + +
+ list + / elements=raw +
+
+ +
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 or keyword 'default'. See examples.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ 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
+
+
+ system_mtu + +
+ string +
+
+ +
Specifies the mtu, must be an integer or keyword 'default'.
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure hostname and domain-name + cisco.nxos.nxos_system: + hostname: nxos01 + domain_name: test.example.com + + - name: remove configuration + cisco.nxos.nxos_system: + state: absent + + - name: configure name servers + cisco.nxos.nxos_system: + name_servers: + - 8.8.8.8 + - 8.8.4.4 + + - name: configure name servers with VRF support + cisco.nxos.nxos_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 nxos01', 'ip domain-name test.example.com']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_telemetry_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_telemetry_module.rst new file mode 100644 index 00000000..030c297e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_telemetry_module.rst @@ -0,0 +1,753 @@ +.. _cisco.nxos.nxos_telemetry_module: + + +************************* +cisco.nxos.nxos_telemetry +************************* + +**TELEMETRY resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages Telemetry Monitoring Service (TMS) configuration + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
The provided configuration
+
+
+ certificate + +
+ dictionary +
+
+ +
Certificate SSL/TLS and hostname values.
+
Value must be a dict defining values for keys (key and hostname).
+
+
+ hostname + +
+ string +
+
+ +
Certificate hostname
+
+
+ key + +
+ string +
+
+ +
Certificate key
+
+
+ compression + +
+ string +
+
+
    Choices: +
  • gzip
  • +
+
+
Destination profile compression method.
+
+
+ destination_groups + +
+ list + / elements=raw +
+
+ +
List of telemetry destination groups.
+
+
+ destination + +
+ dictionary +
+
+ +
Group destination ipv4, port, protocol and encoding values.
+
Value must be a dict defining values for keys (ip, port, protocol, encoding).
+
+
+ encoding + +
+ string +
+
+
    Choices: +
  • GPB
  • +
  • JSON
  • +
+
+
Destination group encoding.
+
+
+ ip + +
+ string +
+
+ +
Destination group IP address.
+
+
+ port + +
+ integer +
+
+ +
Destination group port number.
+
+
+ protocol + +
+ string +
+
+
    Choices: +
  • HTTP
  • +
  • TCP
  • +
  • UDP
  • +
  • gRPC
  • +
+
+
Destination group protocol.
+
+
+ id + +
+ integer +
+
+ +
Destination group identifier.
+
Value must be a int representing the destination group identifier.
+
+
+ sensor_groups + +
+ list + / elements=raw +
+
+ +
List of telemetry sensor groups.
+
+
+ data_source + +
+ string +
+
+
    Choices: +
  • NX-API
  • +
  • DME
  • +
  • YANG
  • +
+
+
Telemetry data source.
+
+
+ id + +
+ integer +
+
+ +
Sensor group identifier.
+
Value must be a int representing the sensor group identifier.
+
+
+ path + +
+ dictionary +
+
+ +
Telemetry sensor path.
+
Value must be a dict defining values for keys (name, depth, filter_condition, query_condition).
+
Mandatory Keys (name)
+
Optional Keys (depth, filter_condition, query_condition)
+
+
+ depth + +
+ string +
+
+ +
Sensor group depth.
+
+
+ filter_condition + +
+ string +
+
+ +
Sensor group filter condition.
+
+
+ name + +
+ string +
+
+ +
Sensor group path name.
+
+
+ query_condition + +
+ string +
+
+ +
Sensor group query condition.
+
+
+ source_interface + +
+ string +
+
+ +
Destination profile source interface.
+
Valid value is a str representing the source interface name.
+
+
+ subscriptions + +
+ list + / elements=raw +
+
+ +
List of telemetry subscriptions.
+
+
+ destination_group + +
+ integer +
+
+ +
Associated destination group.
+
+
+ id + +
+ integer +
+
+ +
Subscription identifier.
+
Value must be a int representing the subscription identifier.
+
+
+ sensor_group + +
+ dictionary +
+
+ +
Associated sensor group.
+
Value must be a dict defining values for keys (id, sample_interval).
+
+
+ id + +
+ integer +
+
+ +
Associated sensor group id.
+
+
+ sample_interval + +
+ integer +
+
+ +
Associated sensor group id sample interval.
+
+
+ vrf + +
+ string +
+
+ +
Destination profile vrf.
+
Valid value is a str representing the vrf name.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • deleted
  • +
+
+
Final configuration state
+
+
+ + +Notes +----- + +.. note:: + - Supported on N9k Version 7.0(3)I7(5) and later. + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted + # This action will delete all telemetry configuration on the device + + - name: Delete Telemetry Configuration + cisco.nxos.nxos_telemetry: + state: deleted + + + # Using merged + # This action will merge telemetry configuration defined in the playbook with + # telemetry configuration that is already on the device. + + - name: Merge Telemetry Configuration + cisco.nxos.nxos_telemetry: + config: + certificate: + key: /bootflash/server.key + hostname: localhost + compression: gzip + source_interface: Ethernet1/1 + vrf: management + destination_groups: + - id: 2 + destination: + ip: 192.168.0.2 + port: 50001 + protocol: gPRC + encoding: GPB + - id: 55 + destination: + ip: 192.168.0.55 + port: 60001 + protocol: gPRC + encoding: GPB + sensor_groups: + - id: 1 + data_source: NX-API + path: + name: '"show lldp neighbors detail"' + depth: 0 + - id: 55 + data_source: DME + path: + name: sys/ch + depth: unbounded + filter_condition: ne(eqptFt.operSt,"ok") + subscriptions: + - id: 5 + destination_group: 55 + sensor_group: + id: 1 + sample_interval: 1000 + - id: 6 + destination_group: 2 + sensor_group: + id: 55 + sample_interval: 2000 + state: merged + + + # Using replaced + # This action will replace telemetry configuration on the device with the + # telemetry configuration defined in the playbook. + + - name: Override Telemetry Configuration + cisco.nxos.nxos_telemetry: + config: + certificate: + key: /bootflash/server.key + hostname: localhost + compression: gzip + source_interface: Ethernet1/1 + vrf: management + destination_groups: + - id: 2 + destination: + ip: 192.168.0.2 + port: 50001 + protocol: gPRC + encoding: GPB + subscriptions: + - id: 5 + destination_group: 55 + state: replaced + + + +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:
+
['command 1', 'command 2', 'command 3']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Mike Wiebe (@mikewiebe) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_interface_module.rst new file mode 100644 index 00000000..db121f42 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_interface_module.rst @@ -0,0 +1,483 @@ +.. _cisco.nxos.nxos_udld_interface_module: + + +****************************** +cisco.nxos.nxos_udld_interface +****************************** + +**Manages UDLD interface configuration params.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages UDLD interface configuration params. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ interface + +
+ string + / required +
+
+ +
FULL name of the interface, i.e. Ethernet1/1-
+
+
+ mode + +
+ string + / required +
+
+
    Choices: +
  • enabled
  • +
  • disabled
  • +
  • aggressive
  • +
+
+
Manages UDLD mode for an interface.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Feature UDLD must be enabled on the device to use this module. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure Ethernet1/1 is configured to be in aggressive mode + - cisco.nxos.nxos_udld_interface: + interface: Ethernet1/1 + mode: aggressive + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + # Remove the aggressive config only if it's currently in aggressive mode and then disable udld (switch default) + - cisco.nxos.nxos_udld_interface: + interface: Ethernet1/1 + mode: aggressive + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + # ensure Ethernet1/1 has aggressive mode enabled + - cisco.nxos.nxos_udld_interface: + interface: Ethernet1/1 + mode: enabled + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of configuration after module execution
+
+
Sample:
+
{'mode': 'enabled'}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing configuration
+
+
Sample:
+
{'mode': 'aggressive'}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'mode': 'enabled'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['interface ethernet1/33', 'no udld aggressive ; no udld disable']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_module.rst new file mode 100644 index 00000000..0899efc1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_udld_module.rst @@ -0,0 +1,489 @@ +.. _cisco.nxos.nxos_udld_module: + + +******************** +cisco.nxos.nxos_udld +******************** + +**Manages UDLD global configuration params.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages UDLD global configuration params. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggressive + +
+ string +
+
+
    Choices: +
  • enabled
  • +
  • disabled
  • +
+
+
Toggles aggressive mode.
+
+
+ msg_time + +
+ string +
+
+ +
Message time in seconds for UDLD packets or keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ reset + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Ability to reset all ports shut down by UDLD. 'state' parameter cannot be 'absent' when this is present.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource. When set to 'absent', aggressive and msg_time are set to their default values.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Module will fail if the udld feature has not been previously enabled. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ensure udld aggressive mode is globally disabled and se global message interval is 20 + - cisco.nxos.nxos_udld: + aggressive: disabled + msg_time: 20 + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + # Ensure agg mode is globally enabled and msg time is 15 + - cisco.nxos.nxos_udld: + aggressive: enabled + msg_time: 15 + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of udld configuration after module execution
+
+
Sample:
+
{'aggressive': 'enabled', 'msg_time': '40'}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing udld configuration
+
+
Sample:
+
{'aggressive': 'disabled', 'msg_time': '15'}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'aggressive': 'enabled', 'msg_time': '40'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['udld message-time 40', 'udld aggressive']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_user_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_user_module.rst new file mode 100644 index 00000000..76e3ae14 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_user_module.rst @@ -0,0 +1,592 @@ +.. _cisco.nxos.nxos_user_module: + + +******************** +cisco.nxos.nxos_user +******************** + +**Manage the collection of local users on Nexus devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of the local usernames configured on Cisco Nexus 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 Cisco Nexus device. The list entries can either be the username or a hash of username and properties. This argument is mutually exclusive with the name argument.
+

aliases: users, collection
+
+
+ configured_password + +
+ string +
+
+ +
The password to be configured on the network device. The password needs to be provided in cleartext and it will be encrypted on the device. Please note that this option is not same as provider password.
+
+
+ name + +
+ string +
+
+ +
The username to be configured on the remote Cisco Nexus device. This argument accepts a string value and is mutually exclusive with the aggregate argument.
+
+
+ roles + +
+ list + / elements=string +
+
+ +
The role argument 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.
+

aliases: role
+
+
+ sshkey + +
+ string +
+
+ +
The sshkey argument defines the SSH public key to configure for the username. This argument accepts a valid SSH key value.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
The state argument 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 network device. The password needs to be provided in cleartext and it will be encrypted on the device. Please note that this option is not same as provider password.
+
+
+ name + +
+ string +
+
+ +
The username to be configured on the remote Cisco Nexus device. This argument accepts a string value and is mutually exclusive with the aggregate argument.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
The purge argument 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 nxos constraints.
+
+
+ roles + +
+ list + / elements=string +
+
+ +
The role argument 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.
+

aliases: role
+
+
+ sshkey + +
+ string +
+
+ +
The sshkey argument defines the SSH public key to configure for the username. This argument accepts a valid SSH key value.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
The state argument 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:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: create a new user + cisco.nxos.nxos_user: + name: ansible + sshkey: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" + state: present + + - name: remove all users except admin + cisco.nxos.nxos_user: + purge: yes + + - name: set multiple users role + cisco.nxos.nxos_user: + aggregate: + - name: netop + - name: netend + role: network-operator + 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', 'name ansible password password']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlan_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlan_module.rst new file mode 100644 index 00000000..fa584c60 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlan_module.rst @@ -0,0 +1,804 @@ +.. _cisco.nxos.nxos_vlan_module: + + +******************** +cisco.nxos.nxos_vlan +******************** + +**(deprecated, removed after 2022-06-01) Manages VLAN resources and attributes.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2022-06-01 +:Why: Updated modules released with more functionality +:Alternative: nxos_vlans + + + +Synopsis +-------- +- Manages VLAN configurations on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • up ←
  • +
  • down
  • +
+
+
Manage the VLAN administrative state of the VLAN equivalent to shut/no shut in VLAN config mode.
+
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of VLANs definitions.
+
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • up
  • +
  • down
  • +
+
+
Manage the VLAN administrative state of the VLAN equivalent to shut/no shut in VLAN config mode.
+
+
+ associated_interfaces + +
+ list + / elements=string +
+
+ +
This is a intent option and checks the operational state of the for given vlan name for associated interfaces. If the value in the associated_interfaces does not match with the operational state of vlan interfaces on device it will result in failure.
+
+
+ delay + +
+ integer +
+
+ +
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 +
+
+ +
List of interfaces that should be associated to the VLAN or keyword 'default'.
+
+
+ mapped_vni + +
+ string +
+
+ +
The Virtual Network Identifier (VNI) ID that is mapped to the VLAN. Valid values are integer and keyword 'default'. Range 4096-16773119.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • ce
  • +
  • fabricpath
  • +
+
+
Set VLAN mode to classical ethernet or fabricpath. This is a valid option for Nexus 5000 and 7000 series.
+
+
+ name + +
+ string +
+
+ +
Name of VLAN or keyword 'default'.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ vlan_id + +
+ integer + / required +
+
+ +
Single VLAN ID.
+
+
+ vlan_range + +
+ string +
+
+ +
Range of VLANs such as 2-10 or 2,5,10-15, etc.
+
+
+ vlan_state + +
+ string +
+
+
    Choices: +
  • active
  • +
  • suspend
  • +
+
+
Manage the vlan operational state of the VLAN
+
+
+ associated_interfaces + +
+ list + / elements=string +
+
+ +
This is a intent option and checks the operational state of the for given vlan name for associated interfaces. If the value in the associated_interfaces does not match with the operational state of vlan 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 +
+
+ +
List of interfaces that should be associated to the VLAN or keyword 'default'.
+
+
+ mapped_vni + +
+ string +
+
+ +
The Virtual Network Identifier (VNI) ID that is mapped to the VLAN. Valid values are integer and keyword 'default'. Range 4096-16773119.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • ce ←
  • +
  • fabricpath
  • +
+
+
Set VLAN mode to classical ethernet or fabricpath. This is a valid option for Nexus 5000 and 7000 series.
+
+
+ name + +
+ string +
+
+ +
Name of VLAN or keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Purge VLANs not defined in the aggregate parameter. This parameter can be used without aggregate as well.
+
Removal of Vlan 1 is not allowed and will be ignored by purge.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource.
+
+
+ vlan_id + +
+ integer +
+
+ +
Single VLAN ID.
+
+
+ vlan_range + +
+ string +
+
+ +
Range of VLANs such as 2-10 or 2,5,10-15, etc.
+
+
+ vlan_state + +
+ string +
+
+
    Choices: +
  • active ←
  • +
  • suspend
  • +
+
+
Manage the vlan operational state of the VLAN
+
+
+ + +Notes +----- + +.. note:: + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure a range of VLANs are not present on the switch + cisco.nxos.nxos_vlan: + vlan_range: 2-10,20,50,55-60,100-150 + state: absent + + - name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state + cisco.nxos.nxos_vlan: + vlan_id: 50 + admin_state: down + name: WEB + + - name: Ensure VLAN is NOT on the device + cisco.nxos.nxos_vlan: + vlan_id: 50 + state: absent + + - name: Add interfaces to VLAN and check intent (config + intent) + cisco.nxos.nxos_vlan: + vlan_id: 100 + interfaces: + - Ethernet2/1 + - Ethernet2/5 + associated_interfaces: + - Ethernet2/1 + - Ethernet2/5 + + - name: Check interfaces assigned to VLAN + cisco.nxos.nxos_vlan: + vlan_id: 100 + associated_interfaces: + - Ethernet2/1 + - Ethernet2/5 + + - name: Create aggregate of vlans + cisco.nxos.nxos_vlan: + aggregate: + - {vlan_id: 4000, mode: ce} + - {vlan_id: 4001, name: vlan-4001} + + - name: purge vlans - removes all other vlans except the ones mentioned in aggregate) + cisco.nxos.nxos_vlan: + aggregate: + - vlan_id: 1 + - vlan_id: 4001 + purge: yes + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
Set of command strings to send to the remote device
+
+
Sample:
+
['vlan 20', 'vlan 55', 'vn-segment 5000']
+
+

+ + +Status +------ + + +- This module will be removed in version . *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlans_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlans_module.rst new file mode 100644 index 00000000..fc95e86a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vlans_module.rst @@ -0,0 +1,581 @@ +.. _cisco.nxos.nxos_vlans_module: + + +********************* +cisco.nxos.nxos_vlans +********************* + +**VLANs resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module creates and manages VLAN configurations on Cisco NX-OS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of Vlan options
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Manage administrative state of the vlan.
+
+
+ mapped_vni + +
+ integer +
+
+ +
The Virtual Network Identifier (VNI) ID that is mapped to the VLAN.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • ce
  • +
  • fabricpath
  • +
+
+
Set vlan mode to classical ethernet or fabricpath. This is a valid option for Nexus 5000, 6000 and 7000 series.
+
+
+ name + +
+ string +
+
+ +
Name of VLAN.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • active
  • +
  • suspend
  • +
+
+
Manage operational state of the vlan.
+
+
+ vlan_id + +
+ integer + / required +
+
+ +
Vlan ID.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the NX-OS device by executing the commands show vlans | json-pretty and show running-config | section ^vlan in order and delimited by a line.
+
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
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
The state overridden would override the configuration of all the VLANs on the device (including VLAN 1) with the provided configuration in the task. Use caution with this state.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOS 7.3.(0)D1(1) on VIRL + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # vlan 1 + + - name: Merge provided configuration with device configuration. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: test-vlan5 + - vlan_id: 10 + enabled: false + state: merged + + # After state: + # ------------ + # vlan 5 + # name test-vlan5 + # state active + # no shutdown + # vlan 10 + # state active + # shutdown + + + # Using replaced + + # Before state: + # ------------- + # vlan 1 + # vlan 5 + # name test-vlan5 + # vlan 10 + # shutdown + + - name: Replace device configuration of specified vlan with provided configuration. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: test-vlan + enabled: false + - vlan_id: 10 + enabled: false + state: replaced + + # After state: + # ------------ + # vlan 1 + # vlan 5 + # name test-vlan + # state active + # shutdown + # vlan 10 + # state active + # shutdown + + + # Using overridden + + # Before state: + # ------------- + # vlan 1 + # vlan 3 + # name testing + # vlan 5 + # name test-vlan5 + # shutdown + # vlan 10 + # shutdown + + - name: Override device configuration of all vlans with provided configuration. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: test-vlan + - vlan_id: 10 + state: active + state: overridden + + # After state: + # ------------ + # vlan 5 + # name test-vlan + # state active + # no shutdown + # vlan 10 + # state active + # no shutdown + + + # Using deleted + + # Before state: + # ------------- + # vlan 1 + # vlan 5 + # vlan 10 + + - name: Delete vlans. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + - vlan_id: 10 + state: deleted + + # After state: + # ------------ + # + + # Using rendered + + - name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: vlan5 + mapped_vni: 100 + + - vlan_id: 6 + name: vlan6 + state: suspend + state: rendered + + # Task Output (redacted) + # ----------------------- + + # rendered: + # - vlan 5 + # - name vlan5 + # - vn-segment 100 + # - vlan 6 + # - name vlan6 + # - state suspend + + # Using parsed + + # parsed.cfg + # ------------ + # { + # "TABLE_vlanbrief": { + # "ROW_vlanbrief": [ + # { + # "vlanshowbr-vlanid": "1", + # "vlanshowbr-vlanid-utf": "1", + # "vlanshowbr-vlanname": "default", + # "vlanshowbr-vlanstate": "active", + # "vlanshowbr-shutstate": "noshutdown" + # }, + # { + # "vlanshowbr-vlanid": "5", + # "vlanshowbr-vlanid-utf": "5", + # "vlanshowbr-vlanname": "vlan5", + # "vlanshowbr-vlanstate": "suspend", + # "vlanshowbr-shutstate": "noshutdown" + # }, + # { + # "vlanshowbr-vlanid": "6", + # "vlanshowbr-vlanid-utf": "6", + # "vlanshowbr-vlanname": "VLAN0006", + # "vlanshowbr-vlanstate": "active", + # "vlanshowbr-shutstate": "noshutdown" + # }, + # { + # "vlanshowbr-vlanid": "7", + # "vlanshowbr-vlanid-utf": "7", + # "vlanshowbr-vlanname": "vlan7", + # "vlanshowbr-vlanstate": "active", + # "vlanshowbr-shutstate": "noshutdown" + # } + # ] + # }, + # "TABLE_mtuinfo": { + # "ROW_mtuinfo": [ + # { + # "vlanshowinfo-vlanid": "1", + # "vlanshowinfo-media-type": "enet", + # "vlanshowinfo-vlanmode": "ce-vlan" + # }, + # { + # "vlanshowinfo-vlanid": "5", + # "vlanshowinfo-media-type": "enet", + # "vlanshowinfo-vlanmode": "ce-vlan" + # }, + # { + # "vlanshowinfo-vlanid": "6", + # "vlanshowinfo-media-type": "enet", + # "vlanshowinfo-vlanmode": "ce-vlan" + # }, + # { + # "vlanshowinfo-vlanid": "7", + # "vlanshowinfo-media-type": "enet", + # "vlanshowinfo-vlanmode": "ce-vlan" + # } + # ] + # } + # } + # + # vlan 1,5-7 + # vlan 5 + # state suspend + # name vlan5 + # vlan 7 + # name vlan7 + # vn-segment 100 + + - name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_vlans: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Task output (redacted) + # ----------------------- + + # parsed: + # - vlan_id: 5 + # enabled: True + # mode: "ce" + # name: "vlan5" + # state: suspend + # + # - vlan_id: 6 + # enabled: True + # mode: "ce" + # state: active + # + # - vlan_id: 7 + # enabled: True + # mode: "ce" + # name: "vlan7" + # state: active + # mapped_vni: 100 + + # Using gathered + + # Existing device config state + # ------------------------------- + # nxos-9k# show vlan | json + # {"TABLE_vlanbrief": {"ROW_vlanbrief": [{"vlanshowbr-vlanid": "1", "vlanshowbr-vlanid-utf": "1", "vlanshowbr-vlanname": "default", "vlanshowbr-vlanstate + # ": "active", "vlanshowbr-shutstate": "noshutdown"}, {"vlanshowbr-vlanid": "5", "vlanshowbr-vlanid-utf": "5", "vlanshowbr-vlanname": "vlan5", "vlanshowb + # r-vlanstate": "suspend", "vlanshowbr-shutstate": "noshutdown"}, {"vlanshowbr-vlanid": "6", "vlanshowbr-vlanid-utf": "6", "vlanshowbr-vlanname": "VLAN00 + # 06", "vlanshowbr-vlanstate": "active", "vlanshowbr-shutstate": "noshutdown"}, {"vlanshowbr-vlanid": "7", "vlanshowbr-vlanid-utf": "7", "vlanshowbr-vlan + # name": "vlan7", "vlanshowbr-vlanstate": "active", "vlanshowbr-shutstate": "shutdown"}]}, "TABLE_mtuinfo": {"ROW_mtuinfo": [{"vlanshowinfo-vlanid": "1", + # "vlanshowinfo-media-type": "enet", "vlanshowinfo-vlanmode": "ce-vlan"}, {"vlanshowinfo-vlanid": "5", "vlanshowinfo-media-type": "enet", "vlanshowinfo- + # vlanmode": "ce-vlan"}, {"vlanshowinfo-vlanid": "6", "vlanshowinfo-media-type": "enet", "vlanshowinfo-vlanmode": "ce-vlan"}, {"vlanshowinfo-vlanid": "7" + # , "vlanshowinfo-media-type": "enet", "vlanshowinfo-vlanmode": "ce-vlan"}]}} + # + # nxos-9k# show running-config | section ^vlan + # vlan 1,5-7 + # vlan 5 + # state suspend + # name vlan5 + # vlan 7 + # shutdown + # name vlan7 + # vn-segment 190 + + - name: Gather vlans facts from the device using nxos_vlans + cisco.nxos.nxos_vlans: + state: gathered + + # Task output (redacted) + # ----------------------- + # gathered: + # - vlan_id: 5 + # enabled: True + # mode: "ce" + # name: "vlan5" + # state: suspend + # + # - vlan_id: 6 + # enabled: True + # mode: "ce" + # state: active + # + # - vlan_id: 7 + # enabled: False + # mode: "ce" + # name: "vlan7" + # state: active + # mapped_vni: 190 + + + +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 5', 'name test-vlan5', 'state suspend']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_interface_module.rst new file mode 100644 index 00000000..73048ac4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_interface_module.rst @@ -0,0 +1,409 @@ +.. _cisco.nxos.nxos_vpc_interface_module: + + +***************************** +cisco.nxos.nxos_vpc_interface +***************************** + +**Manages interface VPC configuration** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages interface VPC configuration + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ peer_link + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set to true/false for peer link config on associated portchannel.
+
+
+ portchannel + +
+ string + / required +
+
+ +
Group number of the portchannel that will be configured.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manages desired state of the resource.
+
+
+ vpc + +
+ string +
+
+ +
VPC group/id that will be configured on associated portchannel.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Either vpc or peer_link param is required, but not both. + - ``state=absent`` removes whatever VPC config is on a port-channel if one exists. + - Re-assigning a vpc or peerlink from one portchannel to another is not supported. The module will force the user to unconfigure an existing vpc/pl before configuring the same value on a new portchannel + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_vpc_interface: + portchannel: 10 + vpc: 100 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['interface port-channel100', 'vpc 10']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_module.rst new file mode 100644 index 00000000..ce788a08 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vpc_module.rst @@ -0,0 +1,585 @@ +.. _cisco.nxos.nxos_vpc_module: + + +******************* +cisco.nxos.nxos_vpc +******************* + +**Manages global VPC configuration** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages global VPC configuration + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ auto_recovery + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables/Disables auto recovery on platforms that support disable
+
timers are not modifiable with this attribute
+
mutually exclusive with auto_recovery_reload_delay
+
+
+ auto_recovery_reload_delay + +
+ string +
+
+ +
Manages auto-recovery reload-delay timer in seconds
+
mutually exclusive with auto_recovery
+
+
+ delay_restore + +
+ string +
+
+ +
manages delay restore command and config value in seconds
+
+
+ delay_restore_interface_vlan + +
+ string +
+
+ +
manages delay restore interface-vlan command and config value in seconds
+
not supported on all platforms
+
+
+ delay_restore_orphan_port + +
+ string +
+
+ +
manages delay restore orphan-port command and config value in seconds
+
not supported on all platforms
+
+
+ domain + +
+ string + / required +
+
+ +
VPC domain
+
+
+ peer_gw + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables/Disables peer gateway
+
+
+ pkl_dest + +
+ string +
+
+ +
Destination (remote) IP address used for peer keepalive link
+
pkl_dest is required whenever pkl options are used.
+
+
+ pkl_src + +
+ string +
+
+ +
Source IP address used for peer keepalive link
+
+
+ pkl_vrf + +
+ string +
+
+ +
VRF used for peer keepalive link
+
The VRF must exist on the device before using pkl_vrf.
+
(Note) 'default' is an overloaded term: Default vrf context for pkl_vrf is 'management'; 'pkl_vrf: default' refers to the literal 'default' rib.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ role_priority + +
+ string +
+
+ +
Role priority for device. Remember lower is better.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manages desired state of the resource
+
+
+ system_priority + +
+ string +
+
+ +
System priority device. Remember they must match between peers.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - The feature vpc must be enabled before this module can be used + - If not using management vrf, vrf must be globally on the device before using in the pkl config + - Although source IP isn't required on the command line it is required when using this module. The PKL VRF must also be configured prior to using this module. + - Both pkl_src and pkl_dest are needed when changing PKL VRF. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure a simple asn + cisco.nxos.nxos_vpc: + domain: 100 + role_priority: 1000 + system_priority: 2000 + pkl_dest: 192.168.100.4 + pkl_src: 10.1.100.20 + peer_gw: true + auto_recovery: true + + - name: configure + cisco.nxos.nxos_vpc: + domain: 100 + role_priority: 32667 + system_priority: 2000 + peer_gw: true + pkl_src: 10.1.100.2 + pkl_dest: 192.168.100.4 + auto_recovery: true + + - name: Configure VPC with delay restore and existing keepalive VRF + cisco.nxos.nxos_vpc: + domain: 10 + role_priority: 28672 + system_priority: 2000 + delay_restore: 180 + peer_gw: true + pkl_src: 1.1.1.2 + pkl_dest: 1.1.1.1 + pkl_vrf: vpckeepalive + auto_recovery: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['vpc domain 100', 'peer-keepalive destination 192.168.100.4 source 10.1.100.20 vrf management', 'auto-recovery', 'peer-gateway']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_af_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_af_module.rst new file mode 100644 index 00000000..81c2911d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_af_module.rst @@ -0,0 +1,538 @@ +.. _cisco.nxos.nxos_vrf_af_module: + + +********************** +cisco.nxos.nxos_vrf_af +********************** + +**Manages VRF AF.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages VRF AF + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Address-Family Identifier (AFI).
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ route_target_both_auto_evpn + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable the EVPN route-target 'auto' setting for both import and export target communities.
+
+
+ route_targets + +
+ list + / elements=dictionary +
+
+ +
Specify the route-targets which should be imported and/or exported under the AF. This argument accepts a list of dicts that specify the route-target, the direction (import|export|both) and state of each route-target. Default direction is direction=both. See examples.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • import
  • +
  • export
  • +
  • both ←
  • +
+
+
Indicates the direction of the route-target (import|export|both)
+
+
+ rt + +
+ string + / required +
+
+ +
Defines the route-target itself
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the route-target with the given direction should be present or not on the device.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ vrf + +
+ string + / required +
+
+ +
Name of the VRF.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Default, where supported, restores params default value. + - In case of ``state=absent`` the address-family configuration will be absent. Therefore the options ``route_target_both_auto_evpn`` and ``route_targets`` are ignored. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_target_both_auto_evpn: true + state: present + + - cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: import + - rt: 65001:1000 + direction: import + + - cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: import + - rt: 65001:1000 + state: absent + + - cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: export + - rt: 65001:1000 + direction: export + + - cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: export + state: absent + + - cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: both + state: present + - rt: 65001:1000 + direction: import + state: present + - rt: 65002:1000 + direction: both + 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 +
commands sent to the device
+
+
Sample:
+
['vrf context ntc', 'address-family ipv4 unicast']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_interface_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_interface_module.rst new file mode 100644 index 00000000..b4656cfb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_interface_module.rst @@ -0,0 +1,399 @@ +.. _cisco.nxos.nxos_vrf_interface_module: + + +***************************** +cisco.nxos.nxos_vrf_interface +***************************** + +**Manages interface specific VRF configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages interface specific VRF configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ interface + +
+ string + / required +
+
+ +
Full name of interface to be managed, i.e. Ethernet1/1.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manages desired state of the resource.
+
+
+ vrf + +
+ string + / required +
+
+ +
Name of VRF to be managed.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - VRF needs to be added globally with :ref:`cisco.nxos.nxos_vrf ` before adding a VRF to an interface. + - Remove a VRF from an interface will still remove all L3 attributes just as it does from CLI. + - VRF is not read from an interface until IP address is configured on that interface. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure vrf ntc exists on Eth1/1 + cisco.nxos.nxos_vrf_interface: + vrf: ntc + interface: Ethernet1/1 + state: present + + - name: Ensure ntc VRF does not exist on Eth1/1 + cisco.nxos.nxos_vrf_interface: + vrf: ntc + interface: Ethernet1/1 + 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 +
commands sent to the device
+
+
Sample:
+
['interface loopback16', 'vrf member ntc']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_module.rst new file mode 100644 index 00000000..33c6f8db --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrf_module.rst @@ -0,0 +1,727 @@ +.. _cisco.nxos.nxos_vrf_module: + + +******************* +cisco.nxos.nxos_vrf +******************* + +**Manages global VRF configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of VRFs on CISCO NXOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • up ←
  • +
  • down
  • +
+
+
Administrative state of the VRF.
+
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of VRFs definitions.
+
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • up
  • +
  • down
  • +
+
+
Administrative state of the VRF.
+
+
+ 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 +
+
+ +
Time in seconds to wait before checking for the operational state on remote device. This wait is applicable for operational state arguments.
+
+
+ description + +
+ string +
+
+ +
Description of the VRF or keyword 'default'.
+
+
+ interfaces + +
+ list + / elements=string +
+
+ +
List of interfaces to check the VRF has been configured correctly or keyword 'default'.
+
+
+ name + +
+ string +
+
+ +
Name of VRF to be managed.
+

aliases: vrf
+
+
+ rd + +
+ string +
+
+ +
VPN Route Distinguisher (RD). Valid values are a string in one of the route-distinguisher formats (ASN2:NN, ASN4:NN, or IPV4:NN); the keyword 'auto', or the keyword 'default'.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
Manages desired state of the resource.
+
+
+ vni + +
+ string +
+
+ +
Specify virtual network identifier. Valid values are Integer or keyword 'default'.
+
+
+ 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.
+
+
+ description + +
+ string +
+
+ +
Description of the VRF or keyword 'default'.
+
+
+ interfaces + +
+ list + / elements=string +
+
+ +
List of interfaces to check the VRF has been configured correctly or keyword 'default'.
+
+
+ name + +
+ string +
+
+ +
Name of VRF to be managed.
+

aliases: vrf
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Purge VRFs not defined in the aggregate parameter.
+
+
+ rd + +
+ string +
+
+ +
VPN Route Distinguisher (RD). Valid values are a string in one of the route-distinguisher formats (ASN2:NN, ASN4:NN, or IPV4:NN); the keyword 'auto', or the keyword 'default'.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manages desired state of the resource.
+
+
+ vni + +
+ string +
+
+ +
Specify virtual network identifier. Valid values are Integer or keyword 'default'.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - Cisco NX-OS creates the default VRF by itself. Therefore, you're not allowed to use default as *vrf* name in this module. + - ``vrf`` name must be shorter than 32 chars. + - VRF names are not case sensible in NX-OS. Anyway, the name is stored just like it's inserted by the user and it'll not be changed again unless the VRF is removed and re-created. i.e. ``vrf=NTC`` will create a VRF named NTC, but running it again with ``vrf=ntc`` will not cause a configuration change. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure ntc VRF exists on switch + cisco.nxos.nxos_vrf: + name: ntc + description: testing + state: present + + - name: Aggregate definition of VRFs + cisco.nxos.nxos_vrf: + aggregate: + - {name: test1, description: Testing, admin_state: down} + - {name: test2, interfaces: Ethernet1/2} + + - name: Aggregate definitions of VRFs with Purge + cisco.nxos.nxos_vrf: + aggregate: + - {name: ntc1, description: purge test1} + - {name: ntc2, description: purge test2} + state: present + purge: yes + + - name: Delete VRFs exist on switch + cisco.nxos.nxos_vrf: + aggregate: + - {name: ntc1} + - {name: ntc2} + state: absent + + - name: Assign interfaces to VRF declaratively + cisco.nxos.nxos_vrf: + name: test1 + interfaces: + - Ethernet2/3 + - Ethernet2/5 + + - name: Check interfaces assigned to VRF + cisco.nxos.nxos_vrf: + name: test1 + associated_interfaces: + - Ethernet2/3 + - Ethernet2/5 + + - name: Ensure VRF is tagged with interface Ethernet2/5 only (Removes from Ethernet2/3) + cisco.nxos.nxos_vrf: + name: test1 + interfaces: + - Ethernet2/5 + + - name: Delete VRF + cisco.nxos.nxos_vrf: + name: ntc + 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 +
commands sent to the device
+
+
Sample:
+
['vrf context ntc', 'no shutdown', 'interface Ethernet1/2', 'no switchport', 'vrf member test2']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +- Trishna Guha (@trishnaguha) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrrp_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrrp_module.rst new file mode 100644 index 00000000..0231b295 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vrrp_module.rst @@ -0,0 +1,510 @@ +.. _cisco.nxos.nxos_vrrp_module: + + +******************** +cisco.nxos.nxos_vrrp +******************** + +**Manages VRRP configuration on NX-OS switches.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages VRRP configuration on NX-OS switches. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ admin_state + +
+ string +
+
+
    Choices: +
  • shutdown ←
  • +
  • no shutdown
  • +
  • default
  • +
+
+
Used to enable or disable the VRRP process.
+
+
+ authentication + +
+ string +
+
+ +
Clear text authentication string or 'default' keyword
+
+
+ group + +
+ string + / required +
+
+ +
VRRP group number.
+
+
+ interface + +
+ string + / required +
+
+ +
Full name of interface that is being managed for VRRP.
+
+
+ interval + +
+ string +
+
+ +
Time interval between advertisement or 'default' keyword
+
+
+ preempt + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/Disable preempt.
+
+
+ priority + +
+ string +
+
+ +
VRRP priority or 'default' keyword
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specify desired state of the resource.
+
+
+ vip + +
+ string +
+
+ +
VRRP virtual IP address or 'default' keyword
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - VRRP feature needs to be enabled first on the system. + - SVIs must exist before using this module. + - Interface must be a L3 port before using this module. + - ``state=absent`` removes the VRRP group if it exists on the device. + - VRRP cannot be configured on loopback interfaces. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - name: Ensure vrrp group 100 and vip 10.1.100.1 is on vlan10 + cisco.nxos.nxos_vrrp: + interface: vlan10 + group: 100 + vip: 10.1.100.1 + + - name: Ensure removal of the vrrp group config + cisco.nxos.nxos_vrrp: + interface: vlan10 + group: 100 + vip: 10.1.100.1 + state: absent + + - name: Re-config with more params + cisco.nxos.nxos_vrrp: + interface: vlan10 + group: 100 + vip: 10.1.100.1 + preempt: false + priority: 130 + authentication: AUTHKEY + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['interface vlan10', 'vrrp 150', 'address 10.1.15.1', 'authentication text testing', 'no shutdown']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vsan_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vsan_module.rst new file mode 100644 index 00000000..f84ab0e3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vsan_module.rst @@ -0,0 +1,225 @@ +.. _cisco.nxos.nxos_vsan_module: + + +******************** +cisco.nxos.nxos_vsan +******************** + +**Configuration of vsan for Cisco NXOS MDS Switches.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Configuration of vsan for Cisco MDS NXOS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ vsan + +
+ list + / elements=dictionary +
+
+ +
List of vsan details to be added or removed
+
+
+ id + +
+ integer + / required +
+
+ +
Vsan id
+
+
+ interface + +
+ list + / elements=string +
+
+ +
List of vsan's interfaces to be added
+
+
+ name + +
+ string +
+
+ +
Name of the vsan
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Removes the vsan if True
+
+
+ suspend + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
suspend the vsan if True
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 8.4(1) + + + +Examples +-------- + +.. code-block:: yaml + + - name: Test that vsan module works + cisco.nxos.nxos_vsan: + vsan: + - id: 922 + interface: + - fc1/1 + - fc1/2 + - port-channel 1 + name: vsan-SAN-A + remove: false + suspend: false + - id: 923 + interface: + - fc1/11 + - fc1/21 + - port-channel 2 + name: vsan-SAN-B + remove: false + suspend: true + - id: 1923 + name: vsan-SAN-Old + remove: true + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['terminal dont-ask', 'vsan database', 'vsan 922 interface fc1/40', 'vsan 922 interface port-channel 155', 'no terminal dont-ask']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_domain_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_domain_module.rst new file mode 100644 index 00000000..f8ad85f3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_domain_module.rst @@ -0,0 +1,428 @@ +.. _cisco.nxos.nxos_vtp_domain_module: + + +************************** +cisco.nxos.nxos_vtp_domain +************************** + +**Manages VTP domain configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages VTP domain configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ domain + +
+ string + / required +
+
+ +
VTP domain name.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - VTP feature must be active on the device to use this module. + - This module is used to manage only VTP domain names. + - VTP domain names are case-sensible. + - If it's never been configured before, VTP version is set to 1 by default. Otherwise, it leaves the previous configured version untouched. Use :ref:`cisco.nxos.nxos_vtp_version ` to change it. + - Use this in combination with :ref:`cisco.nxos.nxos_vtp_password ` and :ref:`cisco.nxos.nxos_vtp_version ` to fully manage VTP operations. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ENSURE VTP DOMAIN IS CONFIGURED + - cisco.nxos.nxos_vtp_domain: + domain: ntc + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of vtp domain after module execution
+
+
Sample:
+
{'domain': 'ntc', 'version': '2', 'vtp_password': ''}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing vtp domain
+
+
Sample:
+
{'domain': 'testing', 'version': '2', 'vtp_password': ''}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'domain': 'ntc'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['vtp domain ntc']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_password_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_password_module.rst new file mode 100644 index 00000000..60f90d17 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_password_module.rst @@ -0,0 +1,454 @@ +.. _cisco.nxos.nxos_vtp_password_module: + + +**************************** +cisco.nxos.nxos_vtp_password +**************************** + +**Manages VTP password configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages VTP password configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Manage the state of the resource
+
+
+ vtp_password + +
+ string +
+
+ +
VTP password
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - VTP feature must be active on the device to use this module. + - This module is used to manage only VTP passwords. + - Use this in combination with :ref:`cisco.nxos.nxos_vtp_domain ` and :ref:`cisco.nxos.nxos_vtp_version ` to fully manage VTP operations. + - You can set/remove password only if a VTP domain already exist. + - If ``state=absent`` and no ``vtp_password`` is provided, it remove the current VTP password. + - If ``state=absent`` and ``vtp_password`` is provided, the proposed ``vtp_password`` has to match the existing one in order to remove it. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ENSURE VTP PASSWORD IS SET + - cisco.nxos.nxos_vtp_password: + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + # ENSURE VTP PASSWORD IS REMOVED + - cisco.nxos.nxos_vtp_password: + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of vtp after module execution
+
+
Sample:
+
{'domain': 'ntc', 'version': '1', 'vtp_password': 'new_ntc'}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing vtp
+
+
Sample:
+
{'domain': 'ntc', 'version': '1', 'vtp_password': 'ntc'}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'vtp_password': 'new_ntc'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['vtp password new_ntc']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_version_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_version_module.rst new file mode 100644 index 00000000..cdd8a6d3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vtp_version_module.rst @@ -0,0 +1,430 @@ +.. _cisco.nxos.nxos_vtp_version_module: + + +*************************** +cisco.nxos.nxos_vtp_version +*************************** + +**Manages VTP version configuration.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages VTP version configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ version + +
+ string + / required +
+
+
    Choices: +
  • 1
  • +
  • 2
  • +
+
+
VTP version number.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - VTP feature must be active on the device to use this module. + - This module is used to manage only VTP version. + - Use this in combination with :ref:`cisco.nxos.nxos_vtp_password ` and :ref:`cisco.nxos.nxos_vtp_version ` to fully manage VTP operations. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + # ENSURE VTP VERSION IS 2 + - cisco.nxos.nxos_vtp_version: + version: 2 + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ changed + +
+ boolean +
+
always +
check to see if a change was made on the device
+
+
Sample:
+
True
+
+
+ end_state + +
+ dictionary +
+
always +
k/v pairs of vtp after module execution
+
+
Sample:
+
{'domain': 'testing', 'version': '2', 'vtp_password': ''}
+
+
+ existing + +
+ dictionary +
+
always +
k/v pairs of existing vtp
+
+
Sample:
+
{'domain': 'testing', 'version': '1', 'vtp_password': ''}
+
+
+ proposed + +
+ dictionary +
+
always +
k/v pairs of parameters passed into module
+
+
Sample:
+
{'version': '2'}
+
+
+ updates + +
+ list +
+
always +
command sent to the device
+
+
Sample:
+
['vtp version 2']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_module.rst new file mode 100644 index 00000000..cea89d82 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_module.rst @@ -0,0 +1,546 @@ +.. _cisco.nxos.nxos_vxlan_vtep_module: + + +************************** +cisco.nxos.nxos_vxlan_vtep +************************** + +**Manages VXLAN Network Virtualization Endpoint (NVE).** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Manages VXLAN Network Virtualization Endpoint (NVE) overlay interface that terminates VXLAN tunnels. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ description + +
+ string +
+
+ +
Description of the NVE interface.
+
+
+ global_ingress_replication_bgp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configures ingress replication protocol as bgp for all VNIs. This is available on Nexus 9000 series switches running NX-OS software release 9.2(x) or higher.
+
+
+ global_mcast_group_L2 + +
+ string +
+
+ +
Global multicast IP prefix for L2 VNIs or the keyword 'default'. This is available on Nexus 9000 series switches running NX-OS software release 9.2(x) or higher.
+
+
+ global_mcast_group_L3 + +
+ string +
+
+ +
Global multicast IP prefix for L3 VNIs or the keyword 'default'. This is available on Nexus 9000 series switches running NX-OS software release 9.2(x) or higher.
+
+
+ global_suppress_arp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enables ARP suppression for all VNIs. This is available on NX-OS 9K series running 9.2.x or higher.
+
+
+ host_reachability + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Specify mechanism for host reachability advertisement. A Boolean value of 'true' indicates that BGP will be used for host reachability advertisement. A Boolean value of 'false' indicates that no protocol is used for host reachability advertisement. Other host reachability advertisement protocols (e.g. OpenFlow, controller, etc.) are not supported.
+
+
+ interface + +
+ string + / required +
+
+ +
Interface name for the VXLAN Network Virtualization Endpoint.
+
+
+ multisite_border_gateway_interface + +
+ string +
+
added in 1.1.0
+
+ +
Specify the loopback interface whose IP address should be used for the NVE Multisite Border-gateway Interface. This is available on specific Nexus 9000 series switches running NX-OS 7.0(3)I7(x) or higher. Specify "default" to remove an existing gateway config.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shutdown the NVE interface.
+
+
+ source_interface + +
+ string +
+
+ +
Specify the loopback interface whose IP address should be used for the NVE interface.
+
+
+ source_interface_hold_down_time + +
+ string +
+
+ +
Suppresses advertisement of the NVE loopback address until the overlay has converged.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - The module is used to manage NVE properties, not to create NVE interfaces. Use :ref:`cisco.nxos.nxos_interface ` if you wish to do so. + - ``state=absent`` removes the interface. + - Default, where supported, restores params default value. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + description: default + host_reachability: true + source_interface: Loopback0 + source_interface_hold_down_time: 30 + shutdown: default + multisite_border_gateway_interface: Loopback0 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['interface nve1', 'source-interface loopback0', 'source-interface hold-down-time 30', 'description simple description', 'shutdown', 'host-reachability protocol bgp', 'multisite border-gateway interface loopback0']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst new file mode 100644 index 00000000..2e5212a4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_vxlan_vtep_vni_module.rst @@ -0,0 +1,519 @@ +.. _cisco.nxos.nxos_vxlan_vtep_vni_module: + + +****************************** +cisco.nxos.nxos_vxlan_vtep_vni +****************************** + +**Creates a Virtual Network Identifier member (VNI)** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Creates a Virtual Network Identifier member (VNI) for an NVE overlay interface. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ assoc_vrf + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
This attribute is used to identify and separate processing VNIs that are associated with a VRF and used for routing. The VRF and VNI specified with this command must match the configuration of the VNI under the VRF.
+
+
+ ingress_replication + +
+ string +
+
+
    Choices: +
  • bgp
  • +
  • static
  • +
  • default
  • +
+
+
Specifies mechanism for host reachability advertisement.
+
+
+ interface + +
+ string + / required +
+
+ +
Interface name for the VXLAN Network Virtualization Endpoint.
+
+
+ multicast_group + +
+ string +
+
+ +
The multicast group (range) of the VNI. Valid values are string and keyword 'default'.
+
+
+ multisite_ingress_replication + +
+ string +
+
added in 1.1.0
+
+
    Choices: +
  • disable
  • +
  • enable
  • +
  • optimized
  • +
+
+
Enables multisite ingress replication.
+
+
+ peer_list + +
+ list + / elements=string +
+
+ +
Set the ingress-replication static peer list. Valid values are an array, a space-separated string of ip addresses, or the keyword 'default'.
+
+
+ provider + +
+ dictionary +
+
+ +
Deprecated
+
Starting with Ansible 2.5 we recommend using connection: network_cli.
+
Starting with Ansible 2.6 we recommend using connection: httpapi for NX-API.
+
This option will be removed in a release after 2022-06-01.
+
For more information please see the NXOS Platform Options guide.
+

+
A dict object containing connection details.
+
+
+ auth_pass + +
+ string +
+
+ +
Specifies the password to use if required to enter privileged mode on the remote device. If authorize is false, then this argument does nothing. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTH_PASS will be used instead.
+
+
+ authorize + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to enter privileged mode on the remote device before sending any commands. If not specified, the device will attempt to execute all commands in non-privileged mode. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_AUTHORIZE will be used instead.
+
+
+ host + +
+ string +
+
+ +
Specifies the DNS host name or address for connecting to the remote device over the specified transport. The value of host is used as the destination address for the transport.
+
+
+ password + +
+ string +
+
+ +
Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either cli or nxapi transports. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_PASSWORD will be used instead.
+
+
+ port + +
+ integer +
+
+ +
Specifies the port to use when building the connection to the remote device. This value applies to either cli or nxapi. The port value will default to the appropriate transport common port if none is provided in the task. (cli=22, http=80, https=443).
+
+
+ ssh_keyfile + +
+ string +
+
+ +
Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for the cli transport. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_SSH_KEYFILE will be used instead.
+
+
+ timeout + +
+ integer +
+
+ +
Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. If the timeout is exceeded before the operation is completed, the module will error. NX-API can be slow to return on long-running commands (sh mac, sh bgp, etc).
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • cli ←
  • +
  • nxapi
  • +
+
+
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.
+
+
+ use_proxy + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
If no, the environment variables http_proxy and https_proxy will be ignored.
+
+
+ use_ssl + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Configures the transport to use SSL if set to yes only when the transport=nxapi, otherwise this value is ignored.
+
+
+ username + +
+ string +
+
+ +
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.
+
+
+ validate_certs + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
If no, SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. If the transport argument is not nxapi, this value is ignored.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Determines whether the config should be present or not on the device.
+
+
+ suppress_arp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress arp under layer 2 VNI.
+
+
+ suppress_arp_disable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Overrides the global ARP suppression config. This is available on NX-OS 9K series running 9.2.x or higher.
+
+
+ vni + +
+ string + / required +
+
+ +
ID of the Virtual Network Identifier.
+
+
+ + +Notes +----- + +.. note:: + - Tested against NXOSv 7.3.(0)D1(1) on VIRL + - default, where supported, restores params default value. + - For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide ` + - For more information on using Ansible to manage network devices see the :ref:`Ansible Network Guide ` + - For more information on using Ansible to manage Cisco devices see the `Cisco integration page `_. + + + +Examples +-------- + +.. code-block:: yaml + + - cisco.nxos.nxos_vxlan_vtep_vni: + interface: nve1 + vni: 6000 + ingress_replication: default + multisite_ingress_replication: enable + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['interface nve1', 'member vni 6000', 'multisite ingress-replication']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gabriele Gerbino (@GGabriele) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_zone_zoneset_module.rst b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_zone_zoneset_module.rst new file mode 100644 index 00000000..33f61378 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/docs/cisco.nxos.nxos_zone_zoneset_module.rst @@ -0,0 +1,537 @@ +.. _cisco.nxos.nxos_zone_zoneset_module: + + +**************************** +cisco.nxos.nxos_zone_zoneset +**************************** + +**Configuration of zone/zoneset for Cisco NXOS MDS Switches.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Configuration of zone/zoneset for Cisco MDS NXOS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ zone_zoneset_details + +
+ list + / elements=dictionary +
+
+ +
List of zone/zoneset details to be added or removed
+
+
+ default_zone + +
+ string +
+
+
    Choices: +
  • permit
  • +
  • deny
  • +
+
+
default zone behaviour for the vsan
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • enhanced
  • +
  • basic
  • +
+
+
mode of the zone for the vsan
+
+
+ smart_zoning + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Removes the vsan if True
+
+
+ vsan + +
+ integer + / required +
+
+ +
vsan id
+
+
+ zone + +
+ list + / elements=dictionary +
+
+ +
List of zone options for that vsan
+
+
+ members + +
+ list + / elements=dictionary +
+
+ +
Members of the zone that needs to be removed or added
+
+
+ devtype + +
+ string +
+
+
    Choices: +
  • initiator
  • +
  • target
  • +
  • both
  • +
+
+
devtype of the zone member used along with Smart zoning config
+
+
+ pwwn + +
+ string + / required +
+
+ +
pwwn member of the zone, use alias 'device_alias' as option for device_alias member
+

aliases: device_alias
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Removes member from the zone if True
+
+
+ name + +
+ string + / required +
+
+ +
name of the zone
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Deletes the zone if True
+
+
+ zoneset + +
+ list + / elements=dictionary +
+
+ +
List of zoneset options for the vsan
+
+
+ action + +
+ string +
+
+
    Choices: +
  • activate
  • +
  • deactivate
  • +
+
+
activates/de-activates the zoneset
+
+
+ members + +
+ list + / elements=dictionary +
+
+ +
Members of the zoneset that needs to be removed or added
+
+
+ name + +
+ string + / required +
+
+ +
name of the zone that needs to be added to the zoneset or removed from the zoneset
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Removes zone member from the zoneset
+
+
+ name + +
+ string + / required +
+
+ +
name of the zoneset
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Removes zoneset if True
+
+
+ + +Notes +----- + +.. note:: + - Tested against NX-OS 8.4(1) + + + +Examples +-------- + +.. code-block:: yaml + + - name: Test that zone/zoneset module works + cisco.nxos.nxos_zone_zoneset: + zone_zoneset_details: + - mode: enhanced + vsan: 22 + zone: + - members: + - pwwn: 11:11:11:11:11:11:11:11 + - device_alias: test123 + - pwwn: 61:61:62:62:12:12:12:12 + remove: true + name: zoneA + - members: + - pwwn: 10:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:21:21:21:21 + name: zoneB + - name: zoneC + remove: true + zoneset: + - action: activate + members: + - name: zoneA + - name: zoneB + - name: zoneC + remove: true + name: zsetname1 + - action: deactivate + name: zsetTestExtra + remove: true + - mode: basic + smart_zoning: true + vsan: 21 + zone: + - members: + - devtype: both + pwwn: 11:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:12:12:12:12 + - devtype: both + pwwn: 92:62:62:62:12:12:1a:1a + remove: true + name: zone21A + - members: + - pwwn: 10:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:21:21:21:21 + name: zone21B + zoneset: + - action: activate + members: + - name: zone21A + - name: zone21B + name: zsetname212 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
commands sent to the device
+
+
Sample:
+
['terminal dont-ask', 'zone name zoneA vsan 923', 'member pwwn 11:11:11:11:11:11:11:11', 'no member device-alias test123', 'zone commit vsan 923', 'no terminal dont-ask']
+
+
+ messages + +
+ list +
+
always +
debug messages
+
+
Sample:
+
['zone mode is already enhanced ,no change in zone mode configuration for vsan 922', "zone member '11:11:11:11:11:11:11:11' is already present in zone 'zoneA' in vsan 922 hence nothing to add", "zone member 'test123' is already present in zone 'zoneA' in vsan 922 hence nothing to add", "zone member '61:61:62:62:12:12:12:12' is not present in zone 'zoneA' in vsan 922 hence nothing to remove", "zone member '10:11:11:11:11:11:11:11' is already present in zone 'zoneB' in vsan 922 hence nothing to add", "zone member '62:62:62:62:21:21:21:21' is already present in zone 'zoneB' in vsan 922 hence nothing to add", "zone 'zoneC' is not present in vsan 922 , so nothing to remove"]
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/meta/runtime.yml b/collections-debian-merged/ansible_collections/cisco/nxos/meta/runtime.yml new file mode 100644 index 00000000..e6883ea7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/meta/runtime.yml @@ -0,0 +1,658 @@ +--- +requires_ansible: '>=2.9.10,<2.11' +plugin_routing: + action: + nxos_aaa_server: + redirect: cisco.nxos.nxos + aaa_server: + redirect: cisco.nxos.nxos + nxos_aaa_server_host: + redirect: cisco.nxos.nxos + aaa_server_host: + redirect: cisco.nxos.nxos + nxos_acl: + redirect: cisco.nxos.nxos + acl: + redirect: cisco.nxos.nxos + nxos_acl_interface: + redirect: cisco.nxos.nxos + acl_interface: + redirect: cisco.nxos.nxos + nxos_acl_interfaces: + redirect: cisco.nxos.nxos + acl_interfaces: + redirect: cisco.nxos.nxos + nxos_acls: + redirect: cisco.nxos.nxos + acls: + redirect: cisco.nxos.nxos + nxos_banner: + redirect: cisco.nxos.nxos + banner: + redirect: cisco.nxos.nxos + nxos_bfd_global: + redirect: cisco.nxos.nxos + bfd_global: + redirect: cisco.nxos.nxos + nxos_bfd_interfaces: + redirect: cisco.nxos.nxos + bfd_interfaces: + redirect: cisco.nxos.nxos + nxos_bgp: + redirect: cisco.nxos.nxos + bgp: + redirect: cisco.nxos.nxos + nxos_bgp_af: + redirect: cisco.nxos.nxos + bgp_af: + redirect: cisco.nxos.nxos + nxos_bgp_neighbor: + redirect: cisco.nxos.nxos + bgp_neighbor: + redirect: cisco.nxos.nxos + nxos_bgp_neighbor_af: + redirect: cisco.nxos.nxos + bgp_neighbor_af: + redirect: cisco.nxos.nxos + nxos_command: + redirect: cisco.nxos.nxos + command: + redirect: cisco.nxos.nxos + nxos_config: + redirect: cisco.nxos.nxos + config: + redirect: cisco.nxos.nxos + nxos_devicealias: + redirect: cisco.nxos.nxos + devicealias: + redirect: cisco.nxos.nxos + nxos_evpn_global: + redirect: cisco.nxos.nxos + evpn_global: + redirect: cisco.nxos.nxos + nxos_evpn_vni: + redirect: cisco.nxos.nxos + evpn_vni: + redirect: cisco.nxos.nxos + nxos_facts: + redirect: cisco.nxos.nxos + facts: + redirect: cisco.nxos.nxos + nxos_feature: + redirect: cisco.nxos.nxos + feature: + redirect: cisco.nxos.nxos + nxos_gir: + redirect: cisco.nxos.nxos + gir: + redirect: cisco.nxos.nxos + nxos_gir_profile_management: + redirect: cisco.nxos.nxos + gir_profile_management: + redirect: cisco.nxos.nxos + nxos_hsrp: + redirect: cisco.nxos.nxos + hsrp: + redirect: cisco.nxos.nxos + nxos_hsrp_interfaces: + redirect: cisco.nxos.nxos + hsrp_interfaces: + redirect: cisco.nxos.nxos + nxos_igmp: + redirect: cisco.nxos.nxos + igmp: + redirect: cisco.nxos.nxos + nxos_igmp_interface: + redirect: cisco.nxos.nxos + igmp_interface: + redirect: cisco.nxos.nxos + nxos_igmp_snooping: + redirect: cisco.nxos.nxos + igmp_snooping: + redirect: cisco.nxos.nxos + nxos_install_os: + redirect: cisco.nxos.nxos + install_os: + redirect: cisco.nxos.nxos + nxos_interface: + redirect: cisco.nxos.nxos + interface: + redirect: cisco.nxos.nxos + nxos_interface_ospf: + redirect: cisco.nxos.nxos + interface_ospf: + redirect: cisco.nxos.nxos + nxos_interfaces: + redirect: cisco.nxos.nxos + interfaces: + redirect: cisco.nxos.nxos + nxos_l2_interface: + redirect: cisco.nxos.nxos + l2_interface: + redirect: cisco.nxos.nxos + nxos_l2_interfaces: + redirect: cisco.nxos.nxos + l2_interfaces: + redirect: cisco.nxos.nxos + nxos_l3_interface: + redirect: cisco.nxos.nxos + l3_interface: + redirect: cisco.nxos.nxos + nxos_l3_interfaces: + redirect: cisco.nxos.nxos + l3_interfaces: + redirect: cisco.nxos.nxos + nxos_lacp: + redirect: cisco.nxos.nxos + lacp: + redirect: cisco.nxos.nxos + nxos_lacp_interfaces: + redirect: cisco.nxos.nxos + lacp_interfaces: + redirect: cisco.nxos.nxos + nxos_lag_interfaces: + redirect: cisco.nxos.nxos + lag_interfaces: + redirect: cisco.nxos.nxos + nxos_linkagg: + redirect: cisco.nxos.nxos + linkagg: + redirect: cisco.nxos.nxos + nxos_lldp: + redirect: cisco.nxos.nxos + lldp: + redirect: cisco.nxos.nxos + nxos_lldp_global: + redirect: cisco.nxos.nxos + lldp_global: + redirect: cisco.nxos.nxos + nxos_lldp_interfaces: + redirect: cisco.nxos.nxos + lldp_interfaces: + redirect: cisco.nxos.nxos + nxos_logging: + redirect: cisco.nxos.nxos + logging: + redirect: cisco.nxos.nxos + nxos_ntp: + redirect: cisco.nxos.nxos + ntp: + redirect: cisco.nxos.nxos + nxos_ntp_auth: + redirect: cisco.nxos.nxos + ntp_auth: + redirect: cisco.nxos.nxos + nxos_ntp_options: + redirect: cisco.nxos.nxos + ntp_options: + redirect: cisco.nxos.nxos + nxos_nxapi: + redirect: cisco.nxos.nxos + nxapi: + redirect: cisco.nxos.nxos + nxos_ospf_interfaces: + redirect: cisco.nxos.nxos + ospf_interfaces: + redirect: cisco.nxos.nxos + nxos_ospf: + redirect: cisco.nxos.nxos + ospf: + redirect: cisco.nxos.nxos + nxos_ospf_vrf: + redirect: cisco.nxos.nxos + ospf_vrf: + redirect: cisco.nxos.nxos + nxos_bgp_global: + redirect: cisco.nxos.nxos + bgp_global: + redirect: cisco.nxos.nxos + nxos_ospfv2: + redirect: cisco.nxos.nxos + ospfv2: + redirect: cisco.nxos.nxos + nxos_ospfv3: + redirect: cisco.nxos.nxos + ospfv3: + redirect: cisco.nxos.nxos + nxos_overlay_global: + redirect: cisco.nxos.nxos + overlay_global: + redirect: cisco.nxos.nxos + nxos_pim: + redirect: cisco.nxos.nxos + pim: + redirect: cisco.nxos.nxos + nxos_pim_interface: + redirect: cisco.nxos.nxos + pim_interface: + redirect: cisco.nxos.nxos + nxos_pim_rp_address: + redirect: cisco.nxos.nxos + pim_rp_address: + redirect: cisco.nxos.nxos + nxos_ping: + redirect: cisco.nxos.nxos + ping: + redirect: cisco.nxos.nxos + nxos_reboot: + redirect: cisco.nxos.nxos + reboot: + redirect: cisco.nxos.nxos + nxos_rollback: + redirect: cisco.nxos.nxos + rollback: + redirect: cisco.nxos.nxos + nxos_rpm: + redirect: cisco.nxos.nxos + rpm: + redirect: cisco.nxos.nxos + nxos_smu: + redirect: cisco.nxos.nxos + smu: + redirect: cisco.nxos.nxos + nxos_snapshot: + redirect: cisco.nxos.nxos + snapshot: + redirect: cisco.nxos.nxos + nxos_snmp_community: + redirect: cisco.nxos.nxos + snmp_community: + redirect: cisco.nxos.nxos + nxos_snmp_contact: + redirect: cisco.nxos.nxos + snmp_contact: + redirect: cisco.nxos.nxos + nxos_snmp_host: + redirect: cisco.nxos.nxos + snmp_host: + redirect: cisco.nxos.nxos + nxos_snmp_location: + redirect: cisco.nxos.nxos + snmp_location: + redirect: cisco.nxos.nxos + nxos_snmp_traps: + redirect: cisco.nxos.nxos + snmp_traps: + redirect: cisco.nxos.nxos + nxos_snmp_user: + redirect: cisco.nxos.nxos + snmp_user: + redirect: cisco.nxos.nxos + nxos_static_route: + redirect: cisco.nxos.nxos + static_route: + redirect: cisco.nxos.nxos + nxos_static_routes: + redirect: cisco.nxos.nxos + static_routes: + redirect: cisco.nxos.nxos + nxos_system: + redirect: cisco.nxos.nxos + system: + redirect: cisco.nxos.nxos + nxos_telemetry: + redirect: cisco.nxos.nxos + telemetry: + redirect: cisco.nxos.nxos + nxos_udld: + redirect: cisco.nxos.nxos + udld: + redirect: cisco.nxos.nxos + nxos_udld_interface: + redirect: cisco.nxos.nxos + udld_interface: + redirect: cisco.nxos.nxos + nxos_user: + redirect: cisco.nxos.nxos + user: + redirect: cisco.nxos.nxos + nxos_vlan: + redirect: cisco.nxos.nxos + vlan: + redirect: cisco.nxos.nxos + nxos_vlans: + redirect: cisco.nxos.nxos + vlans: + redirect: cisco.nxos.nxos + nxos_vpc: + redirect: cisco.nxos.nxos + vpc: + redirect: cisco.nxos.nxos + nxos_vpc_interface: + redirect: cisco.nxos.nxos + vpc_interface: + redirect: cisco.nxos.nxos + nxos_vrf: + redirect: cisco.nxos.nxos + vrf: + redirect: cisco.nxos.nxos + nxos_vrf_af: + redirect: cisco.nxos.nxos + vrf_af: + redirect: cisco.nxos.nxos + nxos_vrf_interface: + redirect: cisco.nxos.nxos + vrf_interface: + redirect: cisco.nxos.nxos + nxos_vrrp: + redirect: cisco.nxos.nxos + vrrp: + redirect: cisco.nxos.nxos + nxos_vsan: + redirect: cisco.nxos.nxos + vsan: + redirect: cisco.nxos.nxos + nxos_vtp_domain: + redirect: cisco.nxos.nxos + vtp_domain: + redirect: cisco.nxos.nxos + nxos_vtp_password: + redirect: cisco.nxos.nxos + vtp_password: + redirect: cisco.nxos.nxos + nxos_vtp_version: + redirect: cisco.nxos.nxos + vtp_version: + redirect: cisco.nxos.nxos + nxos_vxlan_vtep: + redirect: cisco.nxos.nxos + vxlan_vtep: + redirect: cisco.nxos.nxos + nxos_vxlan_vtep_vni: + redirect: cisco.nxos.nxos + vxlan_vtep_vni: + redirect: cisco.nxos.nxos + nxos_zone_zoneset: + redirect: cisco.nxos.nxos + zone_zoneset: + redirect: cisco.nxos.nxos + modules: + aaa_server: + redirect: cisco.nxos.nxos_aaa_server + aaa_server_host: + redirect: cisco.nxos.nxos_aaa_server_host + acl: + redirect: cisco.nxos.nxos_acl + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_acl: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + acl_interface: + redirect: cisco.nxos.nxos_acl_interface + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_acl_interface: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + acl_interfaces: + redirect: cisco.nxos.nxos_acl_interfaces + acls: + redirect: cisco.nxos.nxos_acls + banner: + redirect: cisco.nxos.nxos_banner + bfd_global: + redirect: cisco.nxos.nxos_bfd_global + bfd_interfaces: + redirect: cisco.nxos.nxos_bfd_interfaces + bgp: + redirect: cisco.nxos.nxos_bgp + deprecation: + removal_date: '2023-01-27' + warning_text: See the plugin documentation for more details + nxos_bgp: + deprecation: + removal_date: '2023-01-27' + warning_text: See the plugin documentation for more details + bgp_af: + redirect: cisco.nxos.nxos_bgp_af + bgp_neighbor: + redirect: cisco.nxos.nxos_bgp_neighbor + deprecation: + removal_date: '2023-01-27' + warning_text: See the plugin documentation for more details + nxos_bgp_neighbor: + deprecation: + removal_date: '2023-01-27' + warning_text: See the plugin documentation for more details + bgp_neighbor_af: + redirect: cisco.nxos.nxos_bgp_neighbor_af + command: + redirect: cisco.nxos.nxos_command + config: + redirect: cisco.nxos.nxos_config + devicealias: + redirect: cisco.nxos.nxos_devicealias + evpn_global: + redirect: cisco.nxos.nxos_evpn_global + evpn_vni: + redirect: cisco.nxos.nxos_evpn_vni + facts: + redirect: cisco.nxos.nxos_facts + feature: + redirect: cisco.nxos.nxos_feature + file_copy: + redirect: cisco.nxos.nxos_file_copy + gir: + redirect: cisco.nxos.nxos_gir + gir_profile_management: + redirect: cisco.nxos.nxos_gir_profile_management + hsrp: + redirect: cisco.nxos.nxos_hsrp + hsrp_interfaces: + redirect: cisco.nxos.nxos_hsrp_interfaces + igmp: + redirect: cisco.nxos.nxos_igmp + igmp_interface: + redirect: cisco.nxos.nxos_igmp_interface + igmp_snooping: + redirect: cisco.nxos.nxos_igmp_snooping + install_os: + redirect: cisco.nxos.nxos_install_os + interface: + redirect: cisco.nxos.nxos_interface + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_interface: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + interface_ospf: + redirect: cisco.nxos.nxos_interface_ospf + deprecation: + removal_date: '2022-10-26' + warning_text: See the plugin documentation for more details + nxos_interface_ospf: + deprecation: + removal_date: '2022-10-26' + warning_text: See the plugin documentation for more details + interfaces: + redirect: cisco.nxos.nxos_interfaces + l2_interface: + redirect: cisco.nxos.nxos_l2_interface + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_l2_interface: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + l2_interfaces: + redirect: cisco.nxos.nxos_l2_interfaces + l3_interface: + redirect: cisco.nxos.nxos_l3_interface + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_l3_interface: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + l3_interfaces: + redirect: cisco.nxos.nxos_l3_interfaces + lacp: + redirect: cisco.nxos.nxos_lacp + lacp_interfaces: + redirect: cisco.nxos.nxos_lacp_interfaces + lag_interfaces: + redirect: cisco.nxos.nxos_lag_interfaces + linkagg: + redirect: cisco.nxos.nxos_linkagg + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_linkagg: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + lldp: + redirect: cisco.nxos.nxos_lldp + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_lldp: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + lldp_global: + redirect: cisco.nxos.nxos_lldp_global + lldp_interfaces: + redirect: cisco.nxos.nxos_lldp_interfaces + logging: + redirect: cisco.nxos.nxos_logging + ntp: + redirect: cisco.nxos.nxos_ntp + ntp_auth: + redirect: cisco.nxos.nxos_ntp_auth + ntp_options: + redirect: cisco.nxos.nxos_ntp_options + nxapi: + redirect: cisco.nxos.nxos_nxapi + ospf_interfaces: + redirect: cisco.nxos.nxos_ospf_interfaces + ospf: + redirect: cisco.nxos.nxos_ospf + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_ospf: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + ospf_vrf: + redirect: cisco.nxos.nxos_ospf_vrf + deprecation: + removal_date: '2022-10-01' + warning_text: See the plugin documentation for more details + nxos_ospf_vrf: + deprecation: + removal_date: '2022-10-01' + warning_text: See the plugin documentation for more details + bgp_global: + redirect: cisco.nxos.nxos_bgp_global + ospfv2: + redirect: cisco.nxos.nxos_ospfv2 + ospfv3: + redirect: cisco.nxos.nxos_ospfv3 + overlay_global: + redirect: cisco.nxos.nxos_overlay_global + pim: + redirect: cisco.nxos.nxos_pim + pim_interface: + redirect: cisco.nxos.nxos_pim_interface + pim_rp_address: + redirect: cisco.nxos.nxos_pim_rp_address + ping: + redirect: cisco.nxos.nxos_ping + reboot: + redirect: cisco.nxos.nxos_reboot + rollback: + redirect: cisco.nxos.nxos_rollback + rpm: + redirect: cisco.nxos.nxos_rpm + smu: + redirect: cisco.nxos.nxos_smu + deprecation: + removal_date: '2022-10-01' + warning_text: See the plugin documentation for more details + nxos_smu: + deprecation: + removal_date: '2022-10-01' + warning_text: See the plugin documentation for more details + snapshot: + redirect: cisco.nxos.nxos_snapshot + snmp_community: + redirect: cisco.nxos.nxos_snmp_community + snmp_contact: + redirect: cisco.nxos.nxos_snmp_contact + snmp_host: + redirect: cisco.nxos.nxos_snmp_host + snmp_location: + redirect: cisco.nxos.nxos_snmp_location + snmp_traps: + redirect: cisco.nxos.nxos_snmp_traps + snmp_user: + redirect: cisco.nxos.nxos_snmp_user + static_route: + redirect: cisco.nxos.nxos_static_route + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_static_route: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + static_routes: + redirect: cisco.nxos.nxos_static_routes + system: + redirect: cisco.nxos.nxos_system + telemetry: + redirect: cisco.nxos.nxos_telemetry + udld: + redirect: cisco.nxos.nxos_udld + udld_interface: + redirect: cisco.nxos.nxos_udld_interface + user: + redirect: cisco.nxos.nxos_user + vlan: + redirect: cisco.nxos.nxos_vlan + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + nxos_vlan: + deprecation: + removal_date: '2022-06-01' + warning_text: See the plugin documentation for more details + vlans: + redirect: cisco.nxos.nxos_vlans + vpc: + redirect: cisco.nxos.nxos_vpc + vpc_interface: + redirect: cisco.nxos.nxos_vpc_interface + vrf: + redirect: cisco.nxos.nxos_vrf + vrf_af: + redirect: cisco.nxos.nxos_vrf_af + vrf_interface: + redirect: cisco.nxos.nxos_vrf_interface + vrrp: + redirect: cisco.nxos.nxos_vrrp + vsan: + redirect: cisco.nxos.nxos_vsan + vtp_domain: + redirect: cisco.nxos.nxos_vtp_domain + vtp_password: + redirect: cisco.nxos.nxos_vtp_password + vtp_version: + redirect: cisco.nxos.nxos_vtp_version + vxlan_vtep: + redirect: cisco.nxos.nxos_vxlan_vtep + vxlan_vtep_vni: + redirect: cisco.nxos.nxos_vxlan_vtep_vni + zone_zoneset: + redirect: cisco.nxos.nxos_zone_zoneset diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos.py new file mode 100644 index 00000000..3f5f7176 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos.py @@ -0,0 +1,264 @@ +# +# (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 + +import copy +import re +import sys + +from ansible import constants as C +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) +from ansible.module_utils.connection import Connection +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + load_provider, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_provider_spec, +) +from ansible.utils.display import Display + +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 ["nxos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if ( + self._play_context.connection in ("httpapi", "local") + or self._task.args.get("provider", {}).get("transport") == "nxapi" + ) and module_name in ("nxos_file_copy", "nxos_nxapi"): + return { + "failed": True, + "msg": "Transport type 'nxapi' is not valid for '%s' module." + % (module_name), + } + + if module_name == "nxos_file_copy": + self._task.args["host"] = self._play_context.remote_addr + self._task.args["password"] = self._play_context.password + if self._play_context.connection == "network_cli": + self._task.args["username"] = self._play_context.remote_user + elif self._play_context.connection == "local": + self._task.args[ + "username" + ] = self._play_context.connection_user + + if module_name == "nxos_install_os": + connection = self._connection + if connection.transport == "local": + persistent_command_timeout = C.PERSISTENT_COMMAND_TIMEOUT + persistent_connect_timeout = C.PERSISTENT_CONNECT_TIMEOUT + else: + persistent_command_timeout = connection.get_option( + "persistent_command_timeout" + ) + persistent_connect_timeout = connection.get_option( + "persistent_connect_timeout" + ) + + display.vvvv( + "PERSISTENT_COMMAND_TIMEOUT is %s" + % str(persistent_command_timeout), + self._play_context.remote_addr, + ) + display.vvvv( + "PERSISTENT_CONNECT_TIMEOUT is %s" + % str(persistent_connect_timeout), + self._play_context.remote_addr, + ) + if ( + persistent_command_timeout < 600 + or persistent_connect_timeout < 600 + ): + msg = ( + "PERSISTENT_COMMAND_TIMEOUT and PERSISTENT_CONNECT_TIMEOUT" + ) + msg += " must be set to 600 seconds or higher when using nxos_install_os module." + msg += " Current persistent_command_timeout setting:" + str( + persistent_command_timeout + ) + msg += " Current persistent_connect_timeout setting:" + str( + persistent_connect_timeout + ) + return {"failed": True, "msg": msg} + + if persistent_connection in ("network_cli", "httpapi"): + provider = self._task.args.get("provider", {}) + if any(provider.values()): + display.warning( + "provider is unnecessary when using %s and will be ignored" + % self._play_context.connection + ) + del self._task.args["provider"] + + if module_name == "nxos_gir": + conn = Connection(self._connection.socket_path) + persistent_command_timeout = conn.get_option( + "persistent_command_timeout" + ) + gir_timeout = 200 + if persistent_command_timeout < gir_timeout: + conn.set_option("persistent_command_timeout", gir_timeout) + msg = ( + "timeout value extended to %ss for nxos_gir" + % gir_timeout + ) + display.warning(msg) + + elif self._play_context.connection == "local": + provider = load_provider(nxos_provider_spec, self._task.args) + transport = provider["transport"] or "cli" + + display.vvvv( + "connection transport is %s" % transport, + self._play_context.remote_addr, + ) + + if transport == "cli": + pc = copy.deepcopy(self._play_context) + pc.connection = "ansible.netcommon.network_cli" + pc.network_os = "cisco.nxos.nxos" + pc.remote_addr = ( + provider["host"] or self._play_context.remote_addr + ) + pc.port = int( + provider["port"] or self._play_context.port or 22 + ) + pc.remote_user = ( + provider["username"] or self._play_context.connection_user + ) + pc.password = ( + provider["password"] or self._play_context.password + ) + pc.private_key_file = ( + provider["ssh_keyfile"] + or self._play_context.private_key_file + ) + pc.become = provider["authorize"] or False + if pc.become: + pc.become_method = "enable" + pc.become_pass = provider["auth_pass"] + + connection = self._shared_loader_obj.connection_loader.get( + "ansible.netcommon.persistent", + pc, + sys.stdin, + task_uuid=self._task._uuid, + ) + + # TODO: Remove below code after ansible minimal is cut out + if connection is None: + pc.connection = "network_cli" + pc.network_os = "nxos" + connection = self._shared_loader_obj.connection_loader.get( + "persistent", pc, sys.stdin, task_uuid=self._task._uuid + ) + + display.vvv( + "using connection plugin %s (was local)" % pc.connection, + pc.remote_addr, + ) + + command_timeout = ( + int(provider["timeout"]) + if provider["timeout"] + else connection.get_option("persistent_command_timeout") + ) + connection.set_options( + direct={"persistent_command_timeout": command_timeout} + ) + + socket_path = connection.run() + display.vvvv("socket_path: %s" % socket_path, pc.remote_addr) + if not socket_path: + return { + "failed": True, + "msg": "unable to open shell. Please see: " + + "https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell", + } + + task_vars["ansible_socket"] = socket_path + + else: + self._task.args[ + "provider" + ] = ActionModule.nxapi_implementation( + provider, self._play_context + ) + warnings.append( + [ + "connection local support for this module is deprecated and will be removed in version 2.14," + " use connection either httpapi or ansible.netcommon.httpapi (whichever is applicable)" + ] + ) + else: + 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 + + @staticmethod + def nxapi_implementation(provider, play_context): + provider["transport"] = "nxapi" + if provider.get("host") is None: + provider["host"] = play_context.remote_addr + + if provider.get("port") is None: + if provider.get("use_ssl"): + provider["port"] = 443 + else: + provider["port"] = 80 + + if provider.get("timeout") is None: + provider["timeout"] = C.PERSISTENT_COMMAND_TIMEOUT + + if provider.get("username") is None: + provider["username"] = play_context.connection_user + + if provider.get("password") is None: + provider["password"] = play_context.password + + if provider.get("use_ssl") is None: + provider["use_ssl"] = False + + if provider.get("validate_certs") is None: + provider["validate_certs"] = True + + return provider diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos_file_copy.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos_file_copy.py new file mode 100644 index 00000000..1296f0ce --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/action/nxos_file_copy.py @@ -0,0 +1,632 @@ +# +# 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 + +import copy +import hashlib +import os +import re +import time + +from ansible.errors import AnsibleError +from ansible.module_utils._text import to_text, to_bytes, to_native +from ansible.module_utils.common import validation +from ansible.module_utils.connection import Connection +from ansible.plugins.action import ActionBase +from ansible.utils.display import Display +from ansible.module_utils.compat.paramiko import paramiko +from ansible.module_utils import six + +try: + from scp import SCPClient + + HAS_SCP = True +except ImportError: + HAS_SCP = False + +try: + import pexpect + + HAS_PEXPECT = True +except ImportError: + HAS_PEXPECT = False + +display = Display() + + +class ActionModule(ActionBase): + def process_playbook_values(self): + """ Get playbook values and perform input validation """ + argument_spec = dict( + vrf=dict(type="str", default="management"), + connect_ssh_port=dict(type="int", default=22), + file_system=dict(type="str", default="bootflash:"), + file_pull=dict(type="bool", default=False), + file_pull_timeout=dict(type="int", default=300), + file_pull_protocol=dict( + type="str", + default="scp", + choices=["scp", "sftp", "http", "https", "tftp", "ftp"], + ), + file_pull_compact=dict(type="bool", default=False), + file_pull_kstack=dict(type="bool", default=False), + local_file=dict(type="path"), + local_file_directory=dict(type="path"), + remote_file=dict(type="path"), + remote_scp_server=dict(type="str"), + remote_scp_server_user=dict(type="str"), + remote_scp_server_password=dict(no_log=True), + ) + + playvals = {} + # Process key value pairs from playbook task + for key in argument_spec.keys(): + playvals[key] = self._task.args.get( + key, argument_spec[key].get("default") + ) + if playvals[key] is None: + continue + + option_type = argument_spec[key].get("type", "str") + try: + if option_type == "str": + playvals[key] = validation.check_type_str(playvals[key]) + elif option_type == "int": + playvals[key] = validation.check_type_int(playvals[key]) + elif option_type == "bool": + playvals[key] = validation.check_type_bool(playvals[key]) + elif option_type == "path": + playvals[key] = validation.check_type_path(playvals[key]) + else: + raise AnsibleError( + "Unrecognized type <{0}> for playbook parameter <{1}>".format( + option_type, key + ) + ) + + except (TypeError, ValueError) as e: + raise AnsibleError( + "argument %s is of type %s and we were unable to convert to %s: %s" + % (key, type(playvals[key]), option_type, to_native(e)) + ) + + if "choices" in argument_spec[key] and playvals[ + key + ] not in argument_spec[key].get("choices"): + raise AnsibleError( + "argument {0} with value {1} is not valid. Allowed values are {2}".format( + key, + playvals[key], + ", ".join(argument_spec[key].get("choices")), + ) + ) + + # Validate playbook dependencies + if playvals["file_pull"]: + if playvals.get("remote_file") is None: + raise AnsibleError( + "Playbook parameter required when is True" + ) + if playvals.get("remote_scp_server") is None: + raise AnsibleError( + "Playbook parameter required when is True" + ) + + if playvals["remote_scp_server"] or playvals["remote_scp_server_user"]: + + if None in ( + playvals["remote_scp_server"], + playvals["remote_scp_server_user"], + ): + params = ", " + raise AnsibleError( + "Playbook parameters {0} must be set together".format( + params + ) + ) + + return playvals + + def check_library_dependencies(self, file_pull): + if file_pull: + if not HAS_PEXPECT: + msg = "library pexpect is required when file_pull is True but does not appear to be " + msg += "installed. It can be installed using `pip install pexpect`" + raise AnsibleError(msg) + else: + if paramiko is None: + msg = "library paramiko is required when file_pull is False but does not appear to be " + msg += "installed. It can be installed using `pip install paramiko`" + raise AnsibleError(msg) + + if not HAS_SCP: + msg = "library scp is required when file_pull is False but does not appear to be " + msg += "installed. It can be installed using `pip install scp`" + raise AnsibleError(msg) + + def md5sum_check(self, dst, file_system): + command = "show file {0}{1} md5sum".format(file_system, dst) + remote_filehash = self.conn.exec_command(command) + remote_filehash = to_bytes( + remote_filehash, errors="surrogate_or_strict" + ) + + local_file = self.playvals["local_file"] + try: + with open(local_file, "rb") as f: + filecontent = f.read() + except (OSError, IOError) as exc: + raise AnsibleError( + "Error reading the file: {0}".format(to_text(exc)) + ) + + filecontent = to_bytes(filecontent, errors="surrogate_or_strict") + local_filehash = hashlib.md5(filecontent).hexdigest() + + decoded_rhash = remote_filehash.decode("UTF-8") + + if local_filehash == decoded_rhash: + return True + else: + return False + + def remote_file_exists(self, remote_file, file_system): + command = "dir {0}/{1}".format(file_system, remote_file) + body = self.conn.exec_command(command) + + if "No such file" in body: + return False + else: + return self.md5sum_check(remote_file, file_system) + + def verify_remote_file_exists(self, dst, file_system): + command = "dir {0}/{1}".format(file_system, dst) + body = self.conn.exec_command(command) + if "No such file" in body: + return 0 + return body.split()[0].strip() + + def local_file_exists(self, file): + return os.path.isfile(file) + + def get_flash_size(self, file_system): + command = "dir {0}".format(file_system) + body = self.conn.exec_command(command) + + match = re.search(r"(\d+) bytes free", body) + if match: + bytes_free = match.group(1) + return int(bytes_free) + + match = re.search(r"No such file or directory", body) + if match: + raise AnsibleError( + "Invalid nxos filesystem {0}".format(file_system) + ) + else: + raise AnsibleError( + "Unable to determine size of filesystem {0}".format( + file_system + ) + ) + + def enough_space(self, file, file_system): + flash_size = self.get_flash_size(file_system) + file_size = os.path.getsize(file) + if file_size > flash_size: + return False + + return True + + def transfer_file_to_device(self, remote_file): + timeout = self.socket_timeout + local_file = self.playvals["local_file"] + file_system = self.playvals["file_system"] + + if not self.enough_space(local_file, file_system): + raise AnsibleError( + "Could not transfer file. Not enough space on device." + ) + + # frp = full_remote_path, flp = full_local_path + frp = "{0}{1}".format(file_system, remote_file) + flp = os.path.join(os.path.abspath(local_file)) + try: + self.conn.copy_file( + source=flp, destination=frp, proto="scp", timeout=timeout + ) + except Exception as exc: + self.results["failed"] = True + self.results["msg"] = "Exception received : %s" % exc + + def file_push(self): + local_file = self.playvals["local_file"] + remote_file = self.playvals["remote_file"] or os.path.basename( + local_file + ) + file_system = self.playvals["file_system"] + + if not self.local_file_exists(local_file): + raise AnsibleError("Local file {0} not found".format(local_file)) + + remote_file = remote_file or os.path.basename(local_file) + remote_exists = self.remote_file_exists(remote_file, file_system) + + if not remote_exists: + self.results["changed"] = True + file_exists = False + else: + self.results[ + "transfer_status" + ] = "No Transfer: File already copied to remote device." + file_exists = True + + if not self.play_context.check_mode and not file_exists: + self.transfer_file_to_device(remote_file) + self.results[ + "transfer_status" + ] = "Sent: File copied to remote device." + + self.results["local_file"] = local_file + if remote_file is None: + remote_file = os.path.basename(local_file) + self.results["remote_file"] = remote_file + + def copy_file_from_remote(self, local, local_file_directory, file_system): + self.results["failed"] = False + nxos_hostname = self.play_context.remote_addr + nxos_username = self.play_context.remote_user + nxos_password = self.play_context.password or "" + port = self.playvals["connect_ssh_port"] + + # Build copy command components that will be used to initiate copy from the nxos device. + cmdroot = "copy " + self.playvals["file_pull_protocol"] + "://" + ruser = self.playvals["remote_scp_server_user"] + "@" + rserver = self.playvals["remote_scp_server"] + rfile = self.playvals["remote_file"] + " " + vrf = " vrf " + self.playvals["vrf"] + local_dir_root = "/" + if self.playvals["file_pull_compact"]: + compact = " compact " + else: + compact = "" + if self.playvals["file_pull_kstack"]: + kstack = " use-kstack " + else: + kstack = "" + + def process_outcomes(session, timeout=None): + if timeout is None: + timeout = 10 + outcome = {} + outcome["user_response_required"] = False + outcome["password_prompt_detected"] = False + outcome["existing_file_with_same_name"] = False + outcome["final_prompt_detected"] = False + outcome["copy_complete"] = False + outcome["expect_timeout"] = False + outcome["error"] = False + outcome["error_data"] = None + + # Possible outcomes key: + # 0) - Are you sure you want to continue connecting (yes/no) + # 1) - Password: or @servers's password: + # 2) - Warning: There is already a file existing with this name. Do you want to overwrite (y/n)?[n] + # 3) - Timeout conditions + # 4) - No space on nxos device file_system + # 5) - Username/Password or file permission issues + # 6) - File does not exist on remote scp server + # 7) - invalid nxos command + # 8) - compact option not supported + # 9) - compaction attempt failed + # 10) - other failures like attempting to compact non image file + # 11) - failure to resolve hostname + # 12) - Too many authentication failures + # 13) - Copy to / from this server not permitted + # 14) - Copy completed without issues + # 15) - nxos_router_prompt# + # 16) - pexpect timeout + possible_outcomes = [ + r"sure you want to continue connecting \(yes/no\)\? ", + "(?i)Password: ", + "file existing with this name", + "timed out", + "(?i)No space.*#", + "(?i)Permission denied.*#", + "(?i)No such file.*#", + ".*Invalid command.*#", + "Compaction is not supported on this platform.*#", + "Compact of.*failed.*#", + "(?i)Failed.*#", + "(?i)Could not resolve hostname", + "(?i)Too many authentication failures", + r"(?i)Copying to\/from this server name is not permitted", + "(?i)Copy complete", + r"#\s", + pexpect.TIMEOUT, + ] + index = session.expect(possible_outcomes, timeout=timeout) + # Each index maps to items in possible_outcomes + if index == 0: + outcome["user_response_required"] = True + return outcome + elif index == 1: + outcome["password_prompt_detected"] = True + return outcome + elif index == 2: + outcome["existing_file_with_same_name"] = True + return outcome + elif index in [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]: + decoded_before = session.before.decode("UTF-8") + decoded_after = session.after.decode("UTF-8") + before = decoded_before.strip().replace(" \x08", "") + after = decoded_after.strip().replace(" \x08", "") + outcome["error"] = True + outcome["error_data"] = "COMMAND {0} ERROR {1}".format( + before, after + ) + return outcome + elif index == 14: + outcome["copy_complete"] = True + return outcome + elif index == 15: + outcome["final_prompt_detected"] = True + return outcome + elif index == 16: + # The before property will contain all text up to the expected string pattern. + # The after string will contain the text that was matched by the expected pattern. + outcome["expect_timeout"] = True + outcome[ + "error_data" + ] = "Expect Timeout error occurred: BEFORE {0} AFTER {1}".format( + session.before, session.after + ) + return outcome + else: + outcome["error"] = True + outcome[ + "error_data" + ] = "Unrecognized error occurred: BEFORE {0} AFTER {1}".format( + session.before, session.after + ) + return outcome + + return outcome + + # Spawn pexpect connection to NX-OS device. + nxos_session = pexpect.spawn( + "ssh " + nxos_username + "@" + nxos_hostname + " -p" + str(port) + ) + # There might be multiple user_response_required prompts or intermittent timeouts + # spawning the expect session so loop up to 24 times during the spawn process. + max_attempts = 24 + for connect_attempt in range(max_attempts): + outcome = process_outcomes(nxos_session) + if outcome["user_response_required"]: + nxos_session.sendline("yes") + continue + if outcome["password_prompt_detected"]: + time.sleep(3) + nxos_session.sendline(nxos_password) + continue + if outcome["final_prompt_detected"]: + break + if outcome["error"] or outcome["expect_timeout"]: + # Error encountered, try to spawn expect session n more times up to max_attempts - 1 + if connect_attempt < max_attempts: + outcome["error"] = False + outcome["expect_timeout"] = False + nxos_session.close() + nxos_session = pexpect.spawn( + "ssh " + + nxos_username + + "@" + + nxos_hostname + + " -p" + + str(port) + ) + continue + self.results["failed"] = True + outcome["error_data"] = re.sub( + nxos_password, "", outcome["error_data"] + ) + self.results["error_data"] = ( + "Failed to spawn expect session! " + outcome["error_data"] + ) + nxos_session.close() + return + else: + # The before property will contain all text up to the expected string pattern. + # The after string will contain the text that was matched by the expected pattern. + msg = "After {0} attempts, failed to spawn pexpect session to {1}" + msg += "BEFORE: {2}, AFTER: {3}" + error_msg = msg.format( + connect_attempt, + nxos_hostname, + nxos_session.before, + nxos_session.after, + ) + re.sub(nxos_password, "", error_msg) + nxos_session.close() + raise AnsibleError(error_msg) + + # Create local file directory under NX-OS filesystem if + # local_file_directory playbook parameter is set. + if local_file_directory: + dir_array = local_file_directory.split("/") + for each in dir_array: + if each: + mkdir_cmd = "mkdir " + local_dir_root + each + nxos_session.sendline(mkdir_cmd) + outcome = process_outcomes(nxos_session) + if outcome["error"] or outcome["expect_timeout"]: + self.results["mkdir_cmd"] = mkdir_cmd + self.results["failed"] = True + outcome["error_data"] = re.sub( + nxos_password, "", outcome["error_data"] + ) + self.results["error_data"] = outcome["error_data"] + return + local_dir_root += each + "/" + + # Initiate file copy + copy_cmd = ( + cmdroot + + ruser + + rserver + + rfile + + file_system + + local_dir_root + + local + + compact + + vrf + + kstack + ) + self.results["copy_cmd"] = copy_cmd + nxos_session.sendline(copy_cmd) + for copy_attempt in range(6): + outcome = process_outcomes( + nxos_session, self.playvals["file_pull_timeout"] + ) + if outcome["user_response_required"]: + nxos_session.sendline("yes") + continue + if outcome["password_prompt_detected"]: + if self.playvals.get("remote_scp_server_password"): + nxos_session.sendline( + self.playvals["remote_scp_server_password"] + ) + else: + err_msg = "Remote scp server {0} requires a password.".format( + rserver + ) + err_msg += " Set the playbook parameter or configure nxos device for passwordless scp" + raise AnsibleError(err_msg) + continue + if outcome["existing_file_with_same_name"]: + nxos_session.sendline("y") + continue + if outcome["copy_complete"]: + self.results[ + "transfer_status" + ] = "Received: File copied/pulled to nxos device from remote scp server." + break + if outcome["error"] or outcome["expect_timeout"]: + self.results["failed"] = True + outcome["error_data"] = re.sub( + nxos_password, "", outcome["error_data"] + ) + if self.playvals.get("remote_scp_server_password"): + outcome["error_data"] = re.sub( + self.playvals["remote_scp_server_password"], + "", + outcome["error_data"], + ) + self.results["error_data"] = outcome["error_data"] + nxos_session.close() + return + else: + # The before property will contain all text up to the expected string pattern. + # The after string will contain the text that was matched by the expected pattern. + msg = "After {0} attempts, failed to copy file to {1}" + msg += "BEFORE: {2}, AFTER: {3}, CMD: {4}" + error_msg = msg.format( + copy_attempt, + nxos_hostname, + nxos_session.before, + nxos_session.before, + copy_cmd, + ) + re.sub(nxos_password, "", error_msg) + if self.playvals.get("remote_scp_server_password"): + re.sub( + self.playvals["remote_scp_server_password"], "", error_msg + ) + nxos_session.close() + raise AnsibleError(error_msg) + + nxos_session.close() + + def file_pull(self): + local_file = self.playvals["local_file"] + remote_file = self.playvals["remote_file"] + file_system = self.playvals["file_system"] + # Note: This is the local file directory on the remote nxos device. + local_file_dir = self.playvals["local_file_directory"] + + local_file = local_file or self.playvals["remote_file"].split("/")[-1] + + if not self.play_context.check_mode: + self.copy_file_from_remote(local_file, local_file_dir, file_system) + + if not self.results["failed"]: + self.results["changed"] = True + self.results["remote_file"] = remote_file + if local_file_dir: + dir = local_file_dir + else: + dir = "" + self.results["local_file"] = file_system + dir + "/" + local_file + self.results["remote_scp_server"] = self.playvals[ + "remote_scp_server" + ] + + # This is the main run method for the action plugin to copy files + def run(self, tmp=None, task_vars=None): + socket_path = None + self.play_context = copy.deepcopy(self._play_context) + self.results = super(ActionModule, self).run(task_vars=task_vars) + + if self.play_context.connection.split(".")[-1] != "network_cli": + # Plugin is supported only with network_cli + self.results["failed"] = True + self.results["msg"] = ( + "Connection type must be fully qualified name for network_cli connection type, got %s" + % self.play_context.connection + ) + return self.results + + # Get playbook values + self.playvals = self.process_playbook_values() + + file_pull = self.playvals["file_pull"] + self.check_library_dependencies(file_pull) + + if socket_path is None: + socket_path = self._connection.socket_path + self.conn = Connection(socket_path) + + # Call get_capabilities() to start the connection to the device. + self.conn.get_capabilities() + + self.socket_timeout = self.conn.get_option( + "persistent_command_timeout" + ) + + # This action plugin support two modes of operation. + # - file_pull is False - Push files from the ansible controller to nxos switch. + # - file_pull is True - Initiate copy from the device to pull files to the nxos switch. + self.results["transfer_status"] = "No Transfer" + self.results["file_system"] = self.playvals["file_system"] + if file_pull: + self.file_pull() + else: + self.file_push() + + return self.results diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/nxos.py new file mode 100644 index 00000000..6b4fb6b4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/cliconf/nxos.py @@ -0,0 +1,391 @@ +# +# (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 +cliconf: nxos +short_description: Use NX-OS cliconf to run commands on Cisco NX-OS platform +description: +- This nxos plugin provides low level abstraction apis for sending and receiving CLI + commands from Cisco NX-OS network devices. +version_added: 1.0.0 +""" + +import json +import re + +from ansible.errors import AnsibleConnectionFailure +from ansible.module_utils._text import to_bytes, to_text +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.connection import 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 ( + to_list, +) +from ansible.plugins.cliconf import CliconfBase, enable_mode + + +class Cliconf(CliconfBase): + def __init__(self, *args, **kwargs): + self._module_context = {} + self._device_info = {} + super(Cliconf, self).__init__(*args, **kwargs) + + def read_module_context(self, module_key): + if self._module_context.get(module_key): + return self._module_context[module_key] + + return None + + def save_module_context(self, module_key, module_context): + self._module_context[module_key] = module_context + + return None + + def get_device_info(self): + if not self._device_info: + device_info = {} + + device_info["network_os"] = "nxos" + reply = self.get("show version") + platform_reply = self.get("show inventory") + + match_sys_ver = re.search( + r"\s+system:\s+version\s*(\S+)", reply, re.M + ) + if match_sys_ver: + device_info["network_os_version"] = match_sys_ver.group(1) + else: + match_kick_ver = re.search( + r"\s+kickstart:\s+version\s*(\S+)", reply, re.M + ) + if match_kick_ver: + device_info["network_os_version"] = match_kick_ver.group(1) + + if "network_os_version" not in device_info: + match_sys_ver = re.search( + r"\s+NXOS:\s+version\s*(\S+)", reply, re.M + ) + if match_sys_ver: + device_info["network_os_version"] = match_sys_ver.group(1) + + match_chassis_id = re.search( + r"Hardware\n\s+cisco(.+)$", reply, re.M + ) + if match_chassis_id: + device_info["network_os_model"] = match_chassis_id.group( + 1 + ).strip() + + match_host_name = re.search( + r"\s+Device name:\s*(\S+)", reply, re.M + ) + if match_host_name: + device_info["network_os_hostname"] = match_host_name.group(1) + + match_isan_file_name = re.search( + r"\s+system image file is:\s*(\S+)", reply, re.M + ) + if match_isan_file_name: + device_info["network_os_image"] = match_isan_file_name.group(1) + else: + match_kick_file_name = re.search( + r"\s+kickstart image file is:\s*(\S+)", reply, re.M + ) + if match_kick_file_name: + device_info[ + "network_os_image" + ] = match_kick_file_name.group(1) + + if "network_os_image" not in device_info: + match_isan_file_name = re.search( + r"\s+NXOS image file is:\s*(\S+)", reply, re.M + ) + if match_isan_file_name: + device_info[ + "network_os_image" + ] = match_isan_file_name.group(1) + + match_os_platform = re.search( + r'NAME: "Chassis",\s*DESCR:.*\n' r"PID:\s*(\S+)", + platform_reply, + re.M, + ) + if match_os_platform: + device_info["network_os_platform"] = match_os_platform.group(1) + + self._device_info = device_info + + return self._device_info + + 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=2) + candidate_obj.load(candidate) + + if running and diff_match != "none" and diff_replace != "config": + # running configuration + running_obj = NetworkConfig( + indent=2, 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 get_config(self, source="running", format="text", flags=None): + 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 {0} ".format(lookup[source]) + if format and format != "text": + cmd += "| %s " % format + + if flags: + cmd += " ".join(to_list(flags)) + cmd = cmd.strip() + + return self.send_command(cmd) + + def edit_config( + self, candidate=None, commit=True, replace=None, comment=None + ): + resp = {} + operations = self.get_device_operations() + self.check_edit_config_capability( + operations, candidate, commit, replace, comment + ) + results = [] + requests = [] + + if replace: + device_info = self.get_device_info() + # not all NX-OS versions support `config replace` + # we let the device throw the invalid command error + candidate = "config replace {0}".format(replace) + + if commit: + self.send_command("configure terminal") + + for line in to_list(candidate): + if not isinstance(line, Mapping): + line = {"command": line} + + cmd = line["command"] + if cmd != "end": + results.append(self.send_command(**line)) + requests.append(cmd) + + self.send_command("end") + else: + raise ValueError("check mode is not supported") + + resp["request"] = requests + resp["response"] = results + return resp + + def get( + self, + command, + prompt=None, + answer=None, + sendonly=False, + output=None, + newline=True, + check_all=False, + ): + if output: + command = self._get_command_with_output(command, output) + return self.send_command( + command=command, + prompt=prompt, + answer=answer, + sendonly=sendonly, + newline=newline, + check_all=check_all, + ) + + 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) + if output: + cmd["command"] = self._get_command_with_output( + cmd["command"], output + ) + + try: + out = self.send_command(**cmd) + except AnsibleConnectionFailure as e: + if check_rc is True: + raise + out = getattr(e, "err", e) + + if out is not None: + try: + out = to_text(out, errors="surrogate_or_strict").strip() + except UnicodeError: + raise ConnectionError( + message=u"Failed to decode output from %s: %s" + % (cmd, to_text(out)) + ) + + try: + out = json.loads(out) + except ValueError: + pass + + responses.append(out) + return responses + + def get_device_operations(self): + return { + "supports_diff_replace": True, + "supports_commit": False, + "supports_rollback": False, + "supports_defaults": True, + "supports_onbox_diff": False, + "supports_commit_comment": False, + "supports_multiline_delimiter": False, + "supports_diff_match": True, + "supports_diff_ignore_lines": True, + "supports_generate_diff": True, + "supports_replace": True, + } + + 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["rpc"] += ["get_diff", "run_commands"] + 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 context + :return: None + """ + if self._connection.connected: + out = self._connection.get_prompt() + if out is None: + raise AnsibleConnectionFailure( + message=u"cli prompt is not identified from the last received" + u" response window: %s" + % self._connection._last_recv_window + ) + # Match prompts ending in )# except those with (maint-mode)# + config_prompt = re.compile(r"^.*\((?!maint-mode).*\)#$") + + while config_prompt.match( + to_text(out, errors="surrogate_then_replace").strip() + ): + self._connection.queue_message( + "vvvv", "wrong context, sending exit to device" + ) + self._connection.send_command("exit") + out = self._connection.get_prompt() + + def _get_command_with_output(self, command, output): + 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"): + device_info = self.get_device_info() + model = device_info.get("network_os_model", "") + platform = device_info.get("network_os_platform", "") + if platform.startswith("DS-") and "MDS" in model: + cmd = "%s | json native" % command + else: + cmd = "%s | json" % command + elif output == "text" and command.endswith("| json"): + cmd = command.rsplit("|", 1)[0] + else: + cmd = command + return cmd diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/nxos.py new file mode 100644 index 00000000..e76dd7ba --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/doc_fragments/nxos.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# Copyright: (c) 2015, Peter Sprygada +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +class ModuleDocFragment(object): + + # Standard files documentation fragment + DOCUMENTATION = r"""options: + provider: + description: + - B(Deprecated) + - 'Starting with Ansible 2.5 we recommend using C(connection: network_cli).' + - 'Starting with Ansible 2.6 we recommend using C(connection: httpapi) for NX-API.' + - This option will be removed in a release after 2022-06-01. + - For more information please see the L(NXOS Platform Options guide, ../network/user_guide/platform_nxos.html). + - HORIZONTALLINE + - A dict object containing connection details. + type: dict + suboptions: + host: + description: + - Specifies the DNS host name or address for connecting to the remote device + over the specified transport. The value of host is used as the destination + address for the transport. + type: str + port: + description: + - Specifies the port to use when building the connection to the remote device. This + value applies to either I(cli) or I(nxapi). The port value will default + to the appropriate transport common port if none is provided in the task. (cli=22, + http=80, https=443). + type: int + username: + description: + - Configures the username to use to authenticate the connection to the remote + device. This value is used to authenticate either the CLI login or the + nxapi authentication depending on which transport is used. If the value + is not specified in the task, the value of environment variable C(ANSIBLE_NET_USERNAME) + will be used instead. + type: str + password: + description: + - Specifies the password to use to authenticate the connection to the remote + device. This is a common argument used for either I(cli) or I(nxapi) transports. + If the value is not specified in the task, the value of environment variable + C(ANSIBLE_NET_PASSWORD) will be used instead. + type: str + authorize: + description: + - Instructs the module to enter privileged mode on the remote device before + sending any commands. If not specified, the device will attempt to execute + all commands in non-privileged mode. If the value is not specified in the + task, the value of environment variable C(ANSIBLE_NET_AUTHORIZE) will be + used instead. + type: bool + default: false + auth_pass: + description: + - Specifies the password to use if required to enter privileged mode on the + remote device. If I(authorize) is false, then this argument does nothing. + If the value is not specified in the task, the value of environment variable + C(ANSIBLE_NET_AUTH_PASS) will be used instead. + type: str + timeout: + description: + - Specifies the timeout in seconds for communicating with the network device + for either connecting or sending commands. If the timeout is exceeded before + the operation is completed, the module will error. NX-API can be slow to + return on long-running commands (sh mac, sh bgp, etc). + type: int + ssh_keyfile: + description: + - Specifies the SSH key to use to authenticate the connection to the remote + device. This argument is only used for the I(cli) transport. If the value + is not specified in the task, the value of environment variable C(ANSIBLE_NET_SSH_KEYFILE) + will be used instead. + type: str + transport: + description: + - Configures the transport connection to use when connecting to the remote + device. The transport argument supports connectivity to the device over + cli (ssh) or nxapi. + type: str + choices: + - cli + - nxapi + default: cli + use_ssl: + description: + - Configures the I(transport) to use SSL if set to C(yes) only when the C(transport=nxapi), + otherwise this value is ignored. + type: bool + default: false + validate_certs: + description: + - If C(no), SSL certificates will not be validated. This should only be used + on personally controlled sites using self-signed certificates. If the transport + argument is not nxapi, this value is ignored. + type: bool + default: False + use_proxy: + description: + - If C(no), the environment variables C(http_proxy) and C(https_proxy) will + be ignored. + type: bool + default: true +notes: +- For information on using CLI and NX-API see the :ref:`NXOS Platform Options guide + ` +- For more information on using Ansible to manage network devices see the :ref:`Ansible + Network Guide ` +- For more information on using Ansible to manage Cisco devices see the `Cisco integration + page `_. +""" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/filter/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/filter/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/nxos.py new file mode 100644 index 00000000..d6d911ba --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/httpapi/nxos.py @@ -0,0 +1,271 @@ +# (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 +httpapi: nxos +short_description: Use NX-API to run commands on Cisco NX-OS platform +description: +- This plugin provides low level abstraction APIs for sending and receiving + commands using NX-API with devices running Cisco NX-OS. +version_added: 1.0.0 +""" + +import json +import re +import collections + +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.plugins.httpapi import HttpApiBase + + +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._module_context = {} + + def read_module_context(self, module_key): + if self._module_context.get(module_key): + return self._module_context[module_key] + + return None + + def save_module_context(self, module_key, module_context): + self._module_context[module_key] = module_context + + return None + + def send_request(self, data, **message_kwargs): + output = None + queue = list() + responses = list() + + for item in to_list(data): + cmd_output = message_kwargs.get("output") or "text" + if isinstance(item, dict): + command = item["command"] + if "output" in item: + cmd_output = item["output"] + else: + command = item + + # Emulate '| json' from CLI + if command.endswith("| json"): + command = command.rsplit("|", 1)[0] + cmd_output = "json" + + if output and output != cmd_output: + responses.extend(self._run_queue(queue, output)) + queue = list() + + output = cmd_output + queue.append(command) + + if queue: + responses.extend(self._run_queue(queue, output)) + + if len(responses) == 1: + return responses[0] + return responses + + def _run_queue(self, queue, output): + if self._become: + self.connection.queue_message( + "warning", + "become has no effect over httpapi. Use network_cli if privilege escalation is required", + ) + + request = request_builder(queue, output) + headers = {"Content-Type": "application/json"} + + response, response_data = self.connection.send( + "/ins", 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) + return results + + def get_device_info(self): + if self._device_info: + return self._device_info + + device_info = {} + + device_info["network_os"] = "nxos" + reply, platform_reply = self.send_request( + ["show version", "show inventory"] + ) + + find_os_version = [ + r"\s+system:\s+version\s*(\S+)", + r"\s+kickstart:\s+version\s*(\S+)", + r"\s+NXOS:\s+version\s*(\S+)", + ] + for regex in find_os_version: + match_ver = re.search(regex, reply, re.M) + if match_ver: + device_info["network_os_version"] = match_ver.group(1) + break + + match_chassis_id = re.search( + r"Hardware\n\s+cisco\s*(\S+\s+\S+)", reply, re.M + ) + if match_chassis_id: + device_info["network_os_model"] = match_chassis_id.group(1) + + match_host_name = re.search(r"\s+Device name:\s*(\S+)", reply, re.M) + if match_host_name: + device_info["network_os_hostname"] = match_host_name.group(1) + + find_os_image = [ + r"\s+system image file is:\s*(\S+)", + r"\s+kickstart image file is:\s*(\S+)", + r"\s+NXOS image file is:\s*(\S+)", + ] + for regex in find_os_image: + match_file_name = re.search(regex, reply, re.M) + if match_file_name: + device_info["network_os_image"] = match_file_name.group(1) + break + + match_os_platform = re.search( + r'NAME: (?:"Chassis"| Chassis ),\s*DESCR:.*\nPID:\s*(\S+)', + platform_reply, + re.M, + ) + if match_os_platform: + device_info["network_os_platform"] = match_os_platform.group(1) + + self._device_info = device_info + return self._device_info + + def get_device_operations(self): + platform = self.get_device_info().get("network_os_platform", "") + return { + "supports_diff_replace": True, + "supports_commit": False, + "supports_rollback": False, + "supports_defaults": True, + "supports_onbox_diff": False, + "supports_commit_comment": False, + "supports_multiline_delimiter": False, + "supports_diff_match": True, + "supports_diff_ignore_lines": True, + "supports_generate_diff": True, + "supports_replace": True if "9K" in platform else False, + } + + 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"] = "nxapi" + + 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. + + responses = self.send_request(candidate, output="config") + return [resp for resp in to_list(responses) if resp != "{}"] + + +def handle_response(response): + results = [] + + if response["ins_api"].get("outputs"): + for output in to_list(response["ins_api"]["outputs"]["output"]): + if output["code"] != "200": + # Best effort messages: some API output keys may not exist on some platforms + input_data = output.get("input", "") + msg = output.get("msg", "") + clierror = output.get("clierror", "") + raise ConnectionError( + "%s: %s: %s" % (input_data, msg, clierror), + code=output["code"], + ) + elif "body" in output: + result = output["body"] + if isinstance(result, dict): + result = json.dumps(result) + + results.append(result.strip()) + + return results + + +def request_builder(commands, output, version="1.0", chunk="0", sid=None): + """Encodes a NXAPI JSON request message + """ + output_to_command_type = { + "text": "cli_show_ascii", + "json": "cli_show", + "bash": "bash", + "config": "cli_conf", + } + + maybe_output = commands[0].split("|")[-1].strip() + if maybe_output in output_to_command_type: + command_type = output_to_command_type[maybe_output] + commands = [command.split("|")[0].strip() for command in commands] + else: + try: + command_type = output_to_command_type[output] + except KeyError: + msg = "invalid format, received %s, expected one of %s" % ( + output, + ",".join(output_to_command_type.keys()), + ) + raise ConnectionError(msg) + + if isinstance(commands, (list, set, tuple)): + commands = " ;".join(commands) + + # Order should not matter but some versions of NX-OS software fail + # to process the payload properly if 'input' gets serialized before + # 'type' and the payload of 'input' contains the word 'type'. + msg = collections.OrderedDict() + msg["version"] = version + msg["type"] = command_type + msg["chunk"] = chunk + msg["sid"] = sid + msg["input"] = commands + msg["output_format"] = "json" + + return json.dumps(dict(ins_api=msg)) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/inventory/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/inventory/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acl_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acl_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acl_interfaces/acl_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acl_interfaces/acl_interfaces.py new file mode 100644 index 00000000..1d384043 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/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 nxos_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 nxos_acl_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "access_groups": { + "elements": "dict", + "options": { + "acls": { + "elements": "dict", + "options": { + "direction": { + "choices": ["in", "out"], + "required": True, + "type": "str", + }, + "name": {"required": True, "type": "str"}, + "port": {"type": "bool"}, + }, + "type": "list", + }, + "afi": { + "choices": ["ipv4", "ipv6"], + "required": True, + "type": "str", + }, + }, + "type": "list", + }, + "name": {"required": True, "type": "str"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "deleted", + "gathered", + "merged", + "overridden", + "rendered", + "replaced", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/acls.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/acls.py new file mode 100644 index 00000000..78afdf0e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/acls/acls.py @@ -0,0 +1,361 @@ +# +# -*- 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 nxos_acls module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class AclsArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_acls module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "acls": { + "elements": "dict", + "options": { + "aces": { + "elements": "dict", + "mutually_exclusive": [["grant", "remark"]], + "options": { + "destination": { + "mutually_exclusive": [ + ["address", "any", "host", "prefix"], + [ + "wildcard_bits", + "any", + "host", + "prefix", + ], + ], + "options": { + "address": {"type": "str"}, + "any": {"type": "bool"}, + "host": {"type": "str"}, + "port_protocol": { + "mutually_exclusive": [ + [ + "eq", + "lt", + "neq", + "gt", + "range", + ] + ], + "options": { + "eq": {"type": "str"}, + "gt": {"type": "str"}, + "lt": {"type": "str"}, + "neq": {"type": "str"}, + "range": { + "options": { + "end": {"type": "str"}, + "start": { + "type": "str" + }, + }, + "required_together": [ + ["start", "end"] + ], + "type": "dict", + }, + }, + "type": "dict", + }, + "prefix": {"type": "str"}, + "wildcard_bits": {"type": "str"}, + }, + "required_together": [ + ["address", "wildcard_bits"] + ], + "type": "dict", + }, + "dscp": {"type": "str"}, + "fragments": {"type": "bool"}, + "grant": { + "choices": ["permit", "deny"], + "type": "str", + }, + "log": {"type": "bool"}, + "precedence": {"type": "str"}, + "protocol": {"type": "str"}, + "protocol_options": { + "mutually_exclusive": [ + ["icmp", "igmp", "tcp"] + ], + "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"}, + "echo_request": { + "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_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", + }, + "igmp": { + "mutually_exclusive": [ + [ + "dvmrp", + "host_query", + "host_report", + ] + ], + "options": { + "dvmrp": {"type": "bool"}, + "host_query": {"type": "bool"}, + "host_report": { + "type": "bool" + }, + }, + "type": "dict", + }, + "tcp": { + "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", + }, + "remark": {"type": "str"}, + "sequence": {"type": "int"}, + "source": { + "mutually_exclusive": [ + ["address", "any", "host", "prefix"], + [ + "wildcard_bits", + "host", + "any", + "prefix", + ], + ], + "options": { + "address": {"type": "str"}, + "any": {"type": "bool"}, + "host": {"type": "str"}, + "port_protocol": { + "mutually_exclusive": [ + ["eq", "lt", "neq", "range"], + ["eq", "gt", "neq", "range"], + ], + "options": { + "eq": {"type": "str"}, + "gt": {"type": "str"}, + "lt": {"type": "str"}, + "neq": {"type": "str"}, + "range": { + "options": { + "end": {"type": "str"}, + "start": { + "type": "str" + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "prefix": {"type": "str"}, + "wildcard_bits": {"type": "str"}, + }, + "required_together": [ + ["address", "wildcard_bits"] + ], + "type": "dict", + }, + }, + "type": "list", + }, + "name": {"required": True, "type": "str"}, + }, + "type": "list", + }, + "afi": { + "choices": ["ipv4", "ipv6"], + "required": True, + "type": "str", + }, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "deleted", + "gathered", + "merged", + "overridden", + "rendered", + "replaced", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/bfd_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/bfd_interfaces.py new file mode 100644 index 00000000..8319b8b5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bfd_interfaces/bfd_interfaces.py @@ -0,0 +1,64 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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. +# +############################################# +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +""" +The arg spec for the nxos_bfd_interfaces module +""" + + +class Bfd_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_bfd_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "name": {"type": "str"}, + "bfd": {"choices": ["enable", "disable"], "type": "str"}, + "echo": {"choices": ["enable", "disable"], "type": "str"}, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/bgp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/bgp_global.py new file mode 100644 index 00000000..2142aa26 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/bgp_global/bgp_global.py @@ -0,0 +1,516 @@ +# -*- 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 nxos_bgp_global module +""" + + +class Bgp_globalArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_bgp_global module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "type": "dict", + "options": { + "as_number": {"type": "str"}, + "affinity_group": { + "type": "dict", + "options": {"group_id": {"type": "int"}}, + }, + "bestpath": { + "type": "dict", + "options": { + "always_compare_med": {"type": "bool"}, + "as_path": { + "type": "dict", + "options": { + "ignore": {"type": "bool"}, + "multipath_relax": {"type": "bool"}, + }, + }, + "compare_neighborid": {"type": "bool"}, + "compare_routerid": {"type": "bool"}, + "cost_community_ignore": {"type": "bool"}, + "igp_metric_ignore": {"type": "bool"}, + "med": { + "type": "dict", + "options": { + "confed": {"type": "bool"}, + "missing_as_worst": {"type": "bool"}, + "non_deterministic": {"type": "bool"}, + }, + }, + }, + }, + "cluster_id": {"type": "str"}, + "confederation": { + "type": "dict", + "options": { + "identifier": {"type": "str"}, + "peers": {"type": "list", "elements": "str"}, + }, + }, + "disable_policy_batching": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "ipv4": { + "type": "dict", + "options": {"prefix_list": {"type": "str"}}, + }, + "ipv6": { + "type": "dict", + "options": {"prefix_list": {"type": "str"}}, + }, + "nexthop": {"type": "bool"}, + }, + }, + "dynamic_med_interval": {"type": "int"}, + "enforce_first_as": {"type": "bool"}, + "enhanced_error": {"type": "bool"}, + "fabric_soo": {"type": "str"}, + "fast_external_fallover": {"type": "bool"}, + "flush_routes": {"type": "bool"}, + "graceful_restart": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "restart_time": {"type": "int"}, + "stalepath_time": {"type": "int"}, + "helper": {"type": "bool"}, + }, + }, + "graceful_shutdown": { + "type": "dict", + "options": { + "activate": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + }, + "aware": {"type": "bool"}, + }, + }, + "isolate": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "include_local": {"type": "bool"}, + }, + }, + "log_neighbor_changes": {"type": "bool"}, + "maxas_limit": {"type": "int"}, + "neighbors": { + "type": "list", + "elements": "dict", + "options": { + "neighbor_address": {"type": "str", "required": True}, + "neighbor_affinity_group": { + "type": "dict", + "options": {"group_id": {"type": "int"}}, + }, + "bmp_activate_server": {"type": "int"}, + "capability": { + "type": "dict", + "options": { + "suppress_4_byte_as": {"type": "bool"} + }, + }, + "description": {"type": "str"}, + "disable_connected_check": {"type": "bool"}, + "dont_capability_negotiate": {"type": "bool"}, + "dscp": {"type": "str"}, + "dynamic_capability": {"type": "bool"}, + "ebgp_multihop": {"type": "int"}, + "graceful_shutdown": { + "type": "dict", + "options": { + "activate": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + } + }, + }, + "inherit": { + "type": "dict", + "options": { + "peer": {"type": "str"}, + "peer_session": {"type": "str"}, + }, + }, + "local_as": {"type": "str"}, + "log_neighbor_changes": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "disable": {"type": "bool"}, + }, + }, + "low_memory": { + "type": "dict", + "options": {"exempt": {"type": "bool"}}, + }, + "password": { + "type": "dict", + "options": { + "encryption": {"type": "int"}, + "key": {"type": "str"}, + }, + }, + "path_attribute": { + "type": "list", + "elements": "dict", + "options": { + "action": { + "type": "str", + "choices": [ + "discard", + "treat-as-withdraw", + ], + }, + "type": {"type": "int"}, + "range": { + "type": "dict", + "options": { + "start": {"type": "int"}, + "end": {"type": "int"}, + }, + }, + }, + }, + "peer_type": { + "type": "str", + "choices": [ + "fabric-border-leaf", + "fabric-external", + ], + }, + "remote_as": {"type": "str"}, + "remove_private_as": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "replace_as": {"type": "bool"}, + "all": {"type": "bool"}, + }, + }, + "shutdown": {"type": "bool"}, + "timers": { + "type": "dict", + "options": { + "keepalive": {"type": "int"}, + "holdtime": {"type": "int"}, + }, + }, + "transport": { + "type": "dict", + "options": { + "connection_mode": { + "type": "dict", + "options": {"passive": {"type": "bool"}}, + } + }, + }, + "ttl_security": { + "type": "dict", + "options": {"hops": {"type": "int"}}, + }, + "update_source": {"type": "str"}, + }, + }, + "neighbor_down": { + "type": "dict", + "options": {"fib_accelerate": {"type": "bool"}}, + }, + "nexthop": { + "type": "dict", + "options": { + "suppress_default_resolution": {"type": "bool"} + }, + }, + "rd": { + "type": "dict", + "options": { + "dual": {"type": "bool"}, + "id": {"type": "int"}, + }, + }, + "reconnect_interval": {"type": "int"}, + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "suppress_fib_pending": {"type": "bool"}, + "timers": { + "type": "dict", + "options": { + "bestpath_limit": { + "type": "dict", + "options": { + "timeout": {"type": "int"}, + "always": {"type": "bool"}, + }, + }, + "bgp": { + "type": "dict", + "options": { + "keepalive": {"type": "int"}, + "holdtime": {"type": "int"}, + }, + }, + "prefix_peer_timeout": {"type": "int"}, + "prefix_peer_wait": {"type": "int"}, + }, + }, + "vrfs": { + "type": "list", + "elements": "dict", + "options": { + "vrf": {"type": "str"}, + "allocate_index": {"type": "int"}, + "bestpath": { + "type": "dict", + "options": { + "always_compare_med": {"type": "bool"}, + "as_path": { + "type": "dict", + "options": { + "ignore": {"type": "bool"}, + "multipath_relax": {"type": "bool"}, + }, + }, + "compare_neighborid": {"type": "bool"}, + "compare_routerid": {"type": "bool"}, + "cost_community_ignore": {"type": "bool"}, + "igp_metric_ignore": {"type": "bool"}, + "med": { + "type": "dict", + "options": { + "confed": {"type": "bool"}, + "missing_as_worst": {"type": "bool"}, + "non_deterministic": {"type": "bool"}, + }, + }, + }, + }, + "cluster_id": {"type": "str"}, + "confederation": { + "type": "dict", + "options": { + "identifier": {"type": "str"}, + "peers": {"type": "list", "elements": "str"}, + }, + }, + "graceful_restart": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "restart_time": {"type": "int"}, + "stalepath_time": {"type": "int"}, + "helper": {"type": "bool"}, + }, + }, + "local_as": {"type": "str"}, + "log_neighbor_changes": {"type": "bool"}, + "maxas_limit": {"type": "int"}, + "neighbors": { + "type": "list", + "elements": "dict", + "options": { + "neighbor_address": { + "type": "str", + "required": True, + }, + "neighbor_affinity_group": { + "type": "dict", + "options": {"group_id": {"type": "int"}}, + }, + "bmp_activate_server": {"type": "int"}, + "capability": { + "type": "dict", + "options": { + "suppress_4_byte_as": {"type": "bool"} + }, + }, + "description": {"type": "str"}, + "disable_connected_check": {"type": "bool"}, + "dont_capability_negotiate": {"type": "bool"}, + "dscp": {"type": "str"}, + "dynamic_capability": {"type": "bool"}, + "ebgp_multihop": {"type": "int"}, + "graceful_shutdown": { + "type": "dict", + "options": { + "activate": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + } + }, + }, + "inherit": { + "type": "dict", + "options": { + "peer": {"type": "str"}, + "peer_session": {"type": "str"}, + }, + }, + "local_as": {"type": "str"}, + "log_neighbor_changes": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "disable": {"type": "bool"}, + }, + }, + "low_memory": { + "type": "dict", + "options": {"exempt": {"type": "bool"}}, + }, + "password": { + "type": "dict", + "options": { + "encryption": {"type": "int"}, + "key": {"type": "str"}, + }, + }, + "path_attribute": { + "type": "list", + "elements": "dict", + "options": { + "action": { + "type": "str", + "choices": [ + "discard", + "treat-as-withdraw", + ], + }, + "type": {"type": "int"}, + "range": { + "type": "dict", + "options": { + "start": {"type": "int"}, + "end": {"type": "int"}, + }, + }, + }, + }, + "peer_type": { + "type": "str", + "choices": [ + "fabric-border-leaf", + "fabric-external", + ], + }, + "remote_as": {"type": "str"}, + "remove_private_as": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "replace_as": {"type": "bool"}, + "all": {"type": "bool"}, + }, + }, + "shutdown": {"type": "bool"}, + "timers": { + "type": "dict", + "options": { + "keepalive": {"type": "int"}, + "holdtime": {"type": "int"}, + }, + }, + "transport": { + "type": "dict", + "options": { + "connection_mode": { + "type": "dict", + "options": { + "passive": {"type": "bool"} + }, + } + }, + }, + "ttl_security": { + "type": "dict", + "options": {"hops": {"type": "int"}}, + }, + "update_source": {"type": "str"}, + }, + }, + "neighbor_down": { + "type": "dict", + "options": {"fib_accelerate": {"type": "bool"}}, + }, + "reconnect_interval": {"type": "int"}, + "router_id": {"type": "str"}, + "timers": { + "type": "dict", + "options": { + "bestpath_limit": { + "type": "dict", + "options": { + "timeout": {"type": "int"}, + "always": {"type": "bool"}, + }, + }, + "bgp": { + "type": "dict", + "options": { + "keepalive": {"type": "int"}, + "holdtime": {"type": "int"}, + }, + }, + "prefix_peer_timeout": {"type": "int"}, + "prefix_peer_wait": {"type": "int"}, + }, + }, + }, + }, + }, + }, + "state": { + "type": "str", + "choices": [ + "merged", + "replaced", + "deleted", + "purged", + "parsed", + "gathered", + "rendered", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/facts.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/facts.py new file mode 100644 index 00000000..cada4b86 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/facts/facts.py @@ -0,0 +1,26 @@ +# +# -*- 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 arg spec for the nxos facts module. +""" + + +class FactsArgs(object): + """ The arg spec for the nxos facts module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "gather_subset": dict( + default=["!config"], type="list", elements="str" + ), + "gather_network_resources": dict(type="list", elements="str"), + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/hsrp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/hsrp_interfaces.py new file mode 100644 index 00000000..6145dabb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/hsrp_interfaces/hsrp_interfaces.py @@ -0,0 +1,63 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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. +# +############################################# +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +""" +The arg spec for the nxos_hsrp_interfaces module +""" + + +class Hsrp_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_hsrp_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str"}, + "bfd": {"choices": ["enable", "disable"], "type": "str"}, + }, + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "rendered", + "gathered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/interfaces.py new file mode 100644 index 00000000..fd2ae36c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/interfaces/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 nxos_interfaces module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class InterfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "description": {"type": "str"}, + "duplex": {"choices": ["full", "half", "auto"], "type": "str"}, + "enabled": {"type": "bool"}, + "fabric_forwarding_anycast_gateway": {"type": "bool"}, + "ip_forward": {"type": "bool"}, + "mode": {"choices": ["layer2", "layer3"], "type": "str"}, + "mtu": {"type": "str"}, + "name": {"required": True, "type": "str"}, + "speed": {"type": "str"}, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/l2_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/l2_interfaces.py new file mode 100644 index 00000000..0559555c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l2_interfaces/l2_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 nxos_l2_interfaces module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class L2_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_l2_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "access": { + "options": {"vlan": {"type": "int"}}, + "type": "dict", + }, + "mode": { + "type": "str", + "choices": ["access", "trunk", "fex-fabric", "fabricpath"], + }, + "name": {"required": True, "type": "str"}, + "trunk": { + "options": { + "allowed_vlans": {"type": "str"}, + "native_vlan": {"type": "int"}, + }, + "type": "dict", + }, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "rendered", + "parsed", + "gathered", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/l3_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/l3_interfaces.py new file mode 100644 index 00000000..299c5133 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/l3_interfaces/l3_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 nxos_l3_interfaces module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class L3_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_l3_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "dot1q": {"type": "int"}, + "ipv4": { + "elements": "dict", + "options": { + "address": {"type": "str"}, + "secondary": {"type": "bool"}, + "tag": {"type": "int"}, + }, + "type": "list", + }, + "ipv6": { + "elements": "dict", + "options": { + "address": {"type": "str"}, + "tag": {"type": "int"}, + }, + "type": "list", + }, + "name": {"required": True, "type": "str"}, + "redirects": {"type": "bool"}, + "unreachables": {"type": "bool"}, + "evpn_multisite_tracking": { + "type": "str", + "choices": ["fabric-tracking", "dci-tracking"], + }, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/lacp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/lacp.py new file mode 100644 index 00000000..dd371005 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp/lacp.py @@ -0,0 +1,74 @@ +# +# -*- 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 nxos_lacp module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class LacpArgs(object): + """The arg spec for the nxos_lacp module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "options": { + "system": { + "options": { + "mac": { + "options": { + "address": {"type": "str"}, + "role": { + "choices": ["primary", "secondary"], + "type": "str", + }, + }, + "type": "dict", + }, + "priority": {"type": "int"}, + }, + "type": "dict", + } + }, + "type": "dict", + }, + "state": { + "choices": [ + "merged", + "replaced", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/lacp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/lacp_interfaces.py new file mode 100644 index 00000000..1e080a98 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lacp_interfaces/lacp_interfaces.py @@ -0,0 +1,79 @@ +# +# -*- 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 nxos_lacp_interfaces module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class Lacp_interfacesArgs(object): + """The arg spec for the nxos_lacp_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "convergence": { + "options": { + "graceful": {"type": "bool"}, + "vpc": {"type": "bool"}, + }, + "type": "dict", + }, + "links": { + "options": { + "max": {"type": "int"}, + "min": {"type": "int"}, + }, + "type": "dict", + }, + "mode": {"choices": ["delay"], "type": "str"}, + "name": {"required": True, "type": "str"}, + "port_priority": {"type": "int"}, + "rate": {"choices": ["fast", "normal"], "type": "str"}, + "suspend_individual": {"type": "bool"}, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "rendered", + "gathered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lag_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lag_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lag_interfaces/lag_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lag_interfaces/lag_interfaces.py new file mode 100644 index 00000000..415f41b6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/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 nxos_lag_interfaces module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class Lag_interfacesArgs(object): + """The arg spec for the nxos_lag_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "members": { + "elements": "dict", + "options": { + "member": {"type": "str"}, + "mode": { + "type": "str", + "choices": ["active", "on", "passive"], + }, + "force": {"type": "bool"}, + }, + "type": "list", + }, + "name": {"required": True, "type": "str"}, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "rendered", + "parsed", + "gathered", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/lldp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/lldp_global.py new file mode 100644 index 00000000..92ccc9b5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_global/lldp_global.py @@ -0,0 +1,91 @@ +# +# -*- 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 nxos_lldp_global module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class Lldp_globalArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_lldp_global module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "options": { + "holdtime": {"type": "int"}, + "port_id": {"choices": [0, 1], "type": "int"}, + "reinit": {"type": "int"}, + "timer": {"type": "int"}, + "tlv_select": { + "options": { + "dcbxp": {"type": "bool"}, + "management_address": { + "options": { + "v4": {"type": "bool"}, + "v6": {"type": "bool"}, + }, + "type": "dict", + }, + "port": { + "options": { + "description": {"type": "bool"}, + "vlan": {"type": "bool"}, + }, + "type": "dict", + }, + "power_management": {"type": "bool"}, + "system": { + "options": { + "capabilities": {"type": "bool"}, + "description": {"type": "bool"}, + "name": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "state": { + "choices": [ + "merged", + "replaced", + "deleted", + "gathered", + "parsed", + "rendered", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/lldp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/lldp_interfaces.py new file mode 100644 index 00000000..4ea29a71 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/lldp_interfaces/lldp_interfaces.py @@ -0,0 +1,70 @@ +# +# -*- 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 nxos_lldp_interfaces module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class Lldp_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_lldp_interfaces module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "name": {"required": True, "type": "str"}, + "receive": {"type": "bool"}, + "tlv_set": { + "options": { + "management_address": {"type": "str"}, + "vlan": {"type": "int"}, + }, + "type": "dict", + }, + "transmit": {"type": "bool"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "deleted", + "gathered", + "merged", + "overridden", + "rendered", + "replaced", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/ospf_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/ospf_interfaces.py new file mode 100644 index 00000000..c23a3238 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospf_interfaces/ospf_interfaces.py @@ -0,0 +1,130 @@ +# -*- 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 +# 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 nxos_ospf_interfaces module +""" + + +class Ospf_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_ospf_interfaces module + """ + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str", "required": True}, + "address_family": { + "type": "list", + "elements": "dict", + "options": { + "afi": { + "type": "str", + "choices": ["ipv4", "ipv6"], + "required": True, + }, + "processes": { + "type": "list", + "elements": "dict", + "options": { + "process_id": { + "type": "str", + "required": True, + }, + "area": { + "type": "dict", + "options": { + "area_id": { + "type": "str", + "required": True, + }, + "secondaries": {"type": "bool"}, + }, + }, + "multi_areas": { + "type": "list", + "elements": "str", + }, + }, + }, + "multi_areas": {"type": "list", "elements": "str"}, + "authentication": { + "type": "dict", + "options": { + "key_chain": {"type": "str"}, + "message_digest": {"type": "bool"}, + "enable": {"type": "bool"}, + "null_auth": {"type": "bool"}, + }, + }, + "authentication_key": { + "type": "dict", + "options": { + "encryption": {"type": "int"}, + "key": {"type": "str", "required": True}, + }, + }, + "message_digest_key": { + "type": "dict", + "options": { + "key_id": {"type": "int", "required": True}, + "encryption": {"type": "int"}, + "key": {"type": "str", "required": True}, + }, + }, + "cost": {"type": "int"}, + "dead_interval": {"type": "int"}, + "hello_interval": {"type": "int"}, + "instance": {"type": "int"}, + "mtu_ignore": {"type": "bool"}, + "network": { + "type": "str", + "choices": ["broadcast", "point-to-point"], + }, + "passive_interface": {"type": "bool"}, + "priority": {"type": "int"}, + "retransmit_interval": {"type": "int"}, + "shutdown": {"type": "bool"}, + "transmit_delay": {"type": "int"}, + }, + }, + }, + }, + "state": { + "type": "str", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "parsed", + "rendered", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/ospfv2.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/ospfv2.py new file mode 100644 index 00000000..09c61fc0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv2/ospfv2.py @@ -0,0 +1,697 @@ +# +# -*- 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) + +############################################# +# 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. +# +############################################# + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +""" +The arg spec for the nxos_ospfv2 module +""" + + +class Ospfv2Args(object): # pylint: disable=R0903 + """The arg spec for the nxos_ospfv2 module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "options": { + "processes": { + "elements": "dict", + "options": { + "areas": { + "required_one_of": [ + [ + "authentication", + "default_cost", + "filter_list", + "nssa", + "ranges", + "stub", + ] + ], + "elements": "dict", + "options": { + "area_id": {"type": "str", "required": True}, + "authentication": { + "options": { + "set": {"type": "bool"}, + "message_digest": {"type": "bool"}, + }, + "type": "dict", + }, + "default_cost": {"type": "int"}, + "filter_list": { + "options": { + "direction": { + "choices": ["in", "out"], + "type": "str", + "required": True, + }, + "route_map": { + "type": "str", + "required": True, + }, + }, + "type": "list", + "elements": "dict", + }, + "nssa": { + "options": { + "default_information_originate": { + "type": "bool" + }, + "no_redistribution": {"type": "bool"}, + "no_summary": {"type": "bool"}, + "set": {"type": "bool"}, + "translate": { + "options": { + "type7": { + "mutually_exclusive": [ + ["always", "never"] + ], + "options": { + "always": { + "type": "bool" + }, + "never": { + "type": "bool" + }, + "supress_fa": { + "type": "bool" + }, + }, + "type": "dict", + } + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "ranges": { + "elements": "dict", + "options": { + "cost": {"type": "int"}, + "not_advertise": {"type": "bool"}, + "prefix": { + "type": "str", + "required": True, + }, + }, + "type": "list", + }, + "stub": { + "options": { + "no_summary": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "list", + }, + "auto_cost": { + "options": { + "reference_bandwidth": { + "type": "int", + "required": True, + }, + "unit": { + "choices": ["Gbps", "Mbps"], + "type": "str", + "required": True, + }, + }, + "type": "dict", + }, + "bfd": {"type": "bool"}, + "default_information": { + "options": { + "originate": { + "options": { + "always": {"type": "bool"}, + "route_map": {"type": "str"}, + "set": {"type": "bool"}, + }, + "type": "dict", + } + }, + "type": "dict", + }, + "default_metric": {"type": "int"}, + "distance": {"type": "int"}, + "flush_routes": {"type": "bool"}, + "graceful_restart": { + "options": { + "grace_period": {"type": "int"}, + "helper_disable": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "isolate": {"type": "bool"}, + "log_adjacency_changes": { + "options": { + "detail": {"type": "bool"}, + "log": {"type": "bool"}, + }, + "type": "dict", + }, + "max_lsa": { + "options": { + "ignore_count": {"type": "int"}, + "ignore_time": {"type": "int"}, + "max_non_self_generated_lsa": { + "type": "int", + "required": True, + }, + "reset_time": {"type": "int"}, + "threshold": {"type": "int"}, + "warning_only": {"type": "bool"}, + }, + "type": "dict", + }, + "max_metric": { + "options": { + "router_lsa": { + "options": { + "external_lsa": { + "options": { + "max_metric_value": { + "type": "int" + }, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "include_stub": {"type": "bool"}, + "on_startup": { + "options": { + "set": {"type": "bool"}, + "wait_for_bgp_asn": { + "type": "int" + }, + "wait_period": {"type": "int"}, + }, + "type": "dict", + }, + "set": {"type": "bool"}, + "summary_lsa": { + "options": { + "max_metric_value": { + "type": "int" + }, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "dict", + } + }, + "type": "dict", + }, + "maximum_paths": {"type": "int"}, + "mpls": { + "options": { + "traffic_eng": { + "options": { + "areas": { + "type": "list", + "elements": "dict", + "options": { + "area_id": {"type": "str"} + }, + }, + "multicast_intact": {"type": "bool"}, + "router_id": {"type": "str"}, + }, + "type": "dict", + } + }, + "type": "dict", + }, + "name_lookup": {"type": "bool"}, + "passive_interface": { + "options": {"default": {"type": "bool"}}, + "type": "dict", + }, + "process_id": {"required": True, "type": "str"}, + "redistribute": { + "elements": "dict", + "options": { + "id": {"type": "str"}, + "protocol": { + "choices": [ + "bgp", + "direct", + "eigrp", + "isis", + "lisp", + "ospf", + "rip", + "static", + ], + "required": True, + "type": "str", + }, + "route_map": {"type": "str", "required": True}, + }, + "type": "list", + }, + "rfc1583compatibility": {"type": "bool"}, + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "summary_address": { + "elements": "dict", + "mutually_exclusive": [["not_advertise", "tag"]], + "options": { + "not_advertise": {"type": "bool"}, + "prefix": {"type": "str", "required": True}, + "tag": {"type": "int"}, + }, + "type": "list", + }, + "table_map": { + "options": { + "filter": {"type": "bool"}, + "name": {"type": "str", "required": True}, + }, + "type": "dict", + }, + "timers": { + "options": { + "lsa_arrival": {"type": "int"}, + "lsa_group_pacing": {"type": "int"}, + "throttle": { + "options": { + "lsa": { + "options": { + "hold_interval": { + "type": "int" + }, + "max_interval": { + "type": "int" + }, + "start_interval": { + "type": "int" + }, + }, + "type": "dict", + }, + "spf": { + "options": { + "initial_spf_delay": { + "type": "int" + }, + "max_wait_time": { + "type": "int" + }, + "min_hold_time": { + "type": "int" + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "vrfs": { + "elements": "dict", + "options": { + "areas": { + "required_one_of": [ + [ + "authentication", + "default_cost", + "filter_list", + "nssa", + "ranges", + "stub", + ] + ], + "elements": "dict", + "options": { + "area_id": { + "type": "str", + "required": True, + }, + "authentication": { + "options": { + "set": {"type": "bool"}, + "message_digest": { + "type": "bool" + }, + }, + "type": "dict", + }, + "default_cost": {"type": "int"}, + "filter_list": { + "options": { + "direction": { + "choices": ["in", "out"], + "type": "str", + "required": True, + }, + "route_map": { + "type": "str", + "required": True, + }, + }, + "type": "list", + "elements": "dict", + }, + "nssa": { + "options": { + "default_information_originate": { + "type": "bool" + }, + "no_redistribution": { + "type": "bool" + }, + "no_summary": {"type": "bool"}, + "set": {"type": "bool"}, + "translate": { + "options": { + "type7": { + "mutually_exclusive": [ + [ + "always", + "never", + ] + ], + "options": { + "always": { + "type": "bool" + }, + "never": { + "type": "bool" + }, + "supress_fa": { + "type": "bool" + }, + }, + "type": "dict", + } + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "ranges": { + "elements": "dict", + "options": { + "cost": {"type": "int"}, + "not_advertise": { + "type": "bool" + }, + "prefix": { + "type": "str", + "required": True, + }, + }, + "type": "list", + }, + "stub": { + "options": { + "no_summary": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "list", + }, + "auto_cost": { + "options": { + "reference_bandwidth": { + "type": "int", + "required": True, + }, + "unit": { + "choices": ["Gbps", "Mbps"], + "type": "str", + "required": True, + }, + }, + "type": "dict", + }, + "bfd": {"type": "bool"}, + "capability": { + "type": "dict", + "options": { + "vrf_lite": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "evpn": {"type": "bool"}, + }, + } + }, + }, + "default_information": { + "options": { + "originate": { + "options": { + "always": {"type": "bool"}, + "route_map": {"type": "str"}, + "set": {"type": "bool"}, + }, + "type": "dict", + } + }, + "type": "dict", + }, + "default_metric": {"type": "int"}, + "distance": {"type": "int"}, + "down_bit_ignore": {"type": "bool"}, + "graceful_restart": { + "options": { + "grace_period": {"type": "int"}, + "helper_disable": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "log_adjacency_changes": { + "options": { + "detail": {"type": "bool"}, + "log": {"type": "bool"}, + }, + "type": "dict", + }, + "max_lsa": { + "options": { + "ignore_count": {"type": "int"}, + "ignore_time": {"type": "int"}, + "max_non_self_generated_lsa": { + "type": "int", + "required": True, + }, + "reset_time": {"type": "int"}, + "threshold": {"type": "int"}, + "warning_only": {"type": "bool"}, + }, + "type": "dict", + }, + "max_metric": { + "options": { + "router_lsa": { + "options": { + "external_lsa": { + "options": { + "max_metric_value": { + "type": "int" + }, + "set": { + "type": "bool" + }, + }, + "type": "dict", + }, + "include_stub": { + "type": "bool" + }, + "on_startup": { + "options": { + "set": { + "type": "bool" + }, + "wait_for_bgp_asn": { + "type": "int" + }, + "wait_period": { + "type": "int" + }, + }, + "type": "dict", + }, + "set": {"type": "bool"}, + "summary_lsa": { + "options": { + "max_metric_value": { + "type": "int" + }, + "set": { + "type": "bool" + }, + }, + "type": "dict", + }, + }, + "type": "dict", + } + }, + "type": "dict", + }, + "maximum_paths": {"type": "int"}, + "name_lookup": {"type": "bool"}, + "passive_interface": { + "options": {"default": {"type": "bool"}}, + "type": "dict", + }, + "redistribute": { + "elements": "dict", + "options": { + "id": {"type": "str"}, + "protocol": { + "choices": [ + "bgp", + "direct", + "eigrp", + "isis", + "lisp", + "ospf", + "rip", + "static", + ], + "required": True, + "type": "str", + }, + "route_map": { + "type": "str", + "required": True, + }, + }, + "type": "list", + }, + "rfc1583compatibility": {"type": "bool"}, + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "summary_address": { + "elements": "dict", + "options": { + "not_advertise": {"type": "bool"}, + "prefix": { + "type": "str", + "required": True, + }, + "tag": {"type": "int"}, + }, + "type": "list", + }, + "table_map": { + "options": { + "filter": {"type": "bool"}, + "name": { + "type": "str", + "required": True, + }, + }, + "type": "dict", + }, + "timers": { + "options": { + "lsa_arrival": {"type": "int"}, + "lsa_group_pacing": {"type": "int"}, + "throttle": { + "options": { + "lsa": { + "options": { + "hold_interval": { + "type": "int" + }, + "max_interval": { + "type": "int" + }, + "start_interval": { + "type": "int" + }, + }, + "type": "dict", + }, + "spf": { + "options": { + "initial_spf_delay": { + "type": "int" + }, + "max_wait_time": { + "type": "int" + }, + "min_hold_time": { + "type": "int" + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "vrf": {"required": True, "type": "str"}, + }, + "type": "list", + }, + }, + "type": "list", + } + }, + "type": "dict", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/ospfv3.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/ospfv3.py new file mode 100644 index 00000000..e4aadfb3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/ospfv3/ospfv3.py @@ -0,0 +1,551 @@ +# -*- 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 nxos_ospfv3 module +""" + + +class Ospfv3Args(object): # pylint: disable=R0903 + """The arg spec for the nxos_ospfv3 module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "type": "dict", + "options": { + "processes": { + "type": "list", + "elements": "dict", + "options": { + "address_family": { + "type": "dict", + "options": { + "afi": {"type": "str", "choices": ["ipv6"]}, + "safi": { + "type": "str", + "choices": ["unicast"], + }, + "areas": { + "type": "list", + "elements": "dict", + "options": { + "area_id": { + "type": "str", + "required": True, + }, + "default_cost": {"type": "int"}, + "filter_list": { + "type": "list", + "elements": "dict", + "options": { + "route_map": { + "type": "str", + "required": True, + }, + "direction": { + "type": "str", + "choices": ["in", "out"], + "required": True, + }, + }, + }, + "ranges": { + "type": "list", + "elements": "dict", + "options": { + "prefix": { + "type": "str", + "required": True, + }, + "cost": {"type": "int"}, + "not_advertise": { + "type": "bool" + }, + }, + }, + }, + }, + "default_information": { + "type": "dict", + "options": { + "originate": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "always": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + } + }, + }, + "distance": {"type": "int"}, + "maximum_paths": {"type": "int"}, + "redistribute": { + "type": "list", + "elements": "dict", + "options": { + "protocol": { + "type": "str", + "choices": [ + "bgp", + "direct", + "eigrp", + "isis", + "lisp", + "ospfv3", + "rip", + "static", + ], + "required": True, + }, + "id": {"type": "str"}, + "route_map": { + "type": "str", + "required": True, + }, + }, + }, + "summary_address": { + "type": "list", + "elements": "dict", + "options": { + "prefix": { + "type": "str", + "required": True, + }, + "not_advertise": {"type": "bool"}, + "tag": {"type": "int"}, + }, + }, + "table_map": { + "type": "dict", + "options": { + "name": { + "type": "str", + "required": True, + }, + "filter": {"type": "bool"}, + }, + }, + "timers": { + "type": "dict", + "options": { + "throttle": { + "type": "dict", + "options": { + "spf": { + "type": "dict", + "options": { + "initial_spf_delay": { + "type": "int" + }, + "min_hold_time": { + "type": "int" + }, + "max_wait_time": { + "type": "int" + }, + }, + } + }, + } + }, + }, + }, + }, + "areas": { + "type": "list", + "elements": "dict", + "options": { + "area_id": {"type": "str", "required": True}, + "nssa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "default_information_originate": { + "type": "bool" + }, + "no_redistribution": {"type": "bool"}, + "no_summary": {"type": "bool"}, + "route_map": {"type": "str"}, + "translate": { + "type": "dict", + "options": { + "type7": { + "type": "dict", + "options": { + "always": { + "type": "bool" + }, + "never": { + "type": "bool" + }, + "supress_fa": { + "type": "bool" + }, + }, + } + }, + }, + }, + }, + "stub": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "no_summary": {"type": "bool"}, + }, + }, + }, + }, + "auto_cost": { + "type": "dict", + "options": { + "reference_bandwidth": { + "type": "int", + "required": True, + }, + "unit": { + "type": "str", + "required": True, + "choices": ["Gbps", "Mbps"], + }, + }, + }, + "flush_routes": {"type": "bool"}, + "graceful_restart": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "grace_period": {"type": "int"}, + "helper_disable": {"type": "bool"}, + "planned_only": {"type": "bool"}, + }, + }, + "isolate": {"type": "bool"}, + "log_adjacency_changes": { + "type": "dict", + "options": { + "log": {"type": "bool"}, + "detail": {"type": "bool"}, + }, + }, + "max_lsa": { + "type": "dict", + "options": { + "max_non_self_generated_lsa": { + "type": "int", + "required": True, + }, + "threshold": {"type": "int"}, + "ignore_count": {"type": "int"}, + "ignore_time": {"type": "int"}, + "reset_time": {"type": "int"}, + "warning_only": {"type": "bool"}, + }, + }, + "max_metric": { + "type": "dict", + "options": { + "router_lsa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "external_lsa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "max_metric_value": { + "type": "int" + }, + }, + }, + "stub_prefix_lsa": {"type": "bool"}, + "on_startup": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "wait_period": {"type": "int"}, + "wait_for_bgp_asn": { + "type": "int" + }, + }, + }, + "inter_area_prefix_lsa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "max_metric_value": { + "type": "int" + }, + }, + }, + }, + } + }, + }, + "name_lookup": {"type": "bool"}, + "passive_interface": { + "type": "dict", + "options": {"default": {"type": "bool"}}, + }, + "process_id": {"type": "str", "required": True}, + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "timers": { + "type": "dict", + "options": { + "lsa_arrival": {"type": "int"}, + "lsa_group_pacing": {"type": "int"}, + "throttle": { + "type": "dict", + "options": { + "lsa": { + "type": "dict", + "options": { + "start_interval": { + "type": "int" + }, + "hold_interval": { + "type": "int" + }, + "max_interval": { + "type": "int" + }, + }, + } + }, + }, + }, + }, + "vrfs": { + "type": "list", + "elements": "dict", + "options": { + "areas": { + "type": "list", + "elements": "dict", + "options": { + "area_id": { + "type": "str", + "required": True, + }, + "nssa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "default_information_originate": { + "type": "bool" + }, + "no_redistribution": { + "type": "bool" + }, + "no_summary": {"type": "bool"}, + "route_map": {"type": "str"}, + "translate": { + "type": "dict", + "options": { + "type7": { + "type": "dict", + "options": { + "always": { + "type": "bool" + }, + "never": { + "type": "bool" + }, + "supress_fa": { + "type": "bool" + }, + }, + } + }, + }, + }, + }, + "stub": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "no_summary": {"type": "bool"}, + }, + }, + }, + }, + "auto_cost": { + "type": "dict", + "options": { + "reference_bandwidth": { + "type": "int", + "required": True, + }, + "unit": { + "type": "str", + "required": True, + "choices": ["Gbps", "Mbps"], + }, + }, + }, + "graceful_restart": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "grace_period": {"type": "int"}, + "helper_disable": {"type": "bool"}, + "planned_only": {"type": "bool"}, + }, + }, + "log_adjacency_changes": { + "type": "dict", + "options": { + "log": {"type": "bool"}, + "detail": {"type": "bool"}, + }, + }, + "max_lsa": { + "type": "dict", + "options": { + "max_non_self_generated_lsa": { + "type": "int", + "required": True, + }, + "threshold": {"type": "int"}, + "ignore_count": {"type": "int"}, + "ignore_time": {"type": "int"}, + "reset_time": {"type": "int"}, + "warning_only": {"type": "bool"}, + }, + }, + "max_metric": { + "type": "dict", + "options": { + "router_lsa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "external_lsa": { + "type": "dict", + "options": { + "set": { + "type": "bool" + }, + "max_metric_value": { + "type": "int" + }, + }, + }, + "stub_prefix_lsa": { + "type": "bool" + }, + "on_startup": { + "type": "dict", + "options": { + "set": { + "type": "bool" + }, + "wait_period": { + "type": "int" + }, + "wait_for_bgp_asn": { + "type": "int" + }, + }, + }, + "inter_area_prefix_lsa": { + "type": "dict", + "options": { + "set": { + "type": "bool" + }, + "max_metric_value": { + "type": "int" + }, + }, + }, + }, + } + }, + }, + "name_lookup": {"type": "bool"}, + "passive_interface": { + "type": "dict", + "options": {"default": {"type": "bool"}}, + }, + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "timers": { + "type": "dict", + "options": { + "lsa_arrival": {"type": "int"}, + "lsa_group_pacing": {"type": "int"}, + "throttle": { + "type": "dict", + "options": { + "lsa": { + "type": "dict", + "options": { + "start_interval": { + "type": "int" + }, + "hold_interval": { + "type": "int" + }, + "max_interval": { + "type": "int" + }, + }, + } + }, + }, + }, + }, + "vrf": {"type": "str", "required": True}, + }, + }, + }, + } + }, + }, + "state": { + "type": "str", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "parsed", + "rendered", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/static_routes.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/static_routes.py new file mode 100644 index 00000000..95e548f3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/static_routes/static_routes.py @@ -0,0 +1,94 @@ +# +# -*- 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 nxos_static_routes module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class Static_routesArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_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"}, + "dest_vrf": {"type": "str"}, + "forward_router_address": { + "type": "str" + }, + "interface": {"type": "str"}, + "route_name": {"type": "str"}, + "tag": {"type": "int"}, + "track": {"type": "int"}, + }, + "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/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/telemetry.py new file mode 100644 index 00000000..1787f3ae --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/telemetry/telemetry.py @@ -0,0 +1,118 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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 nxos_telemetry module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class TelemetryArgs(object): # pylint: disable=R0903 + """The arg spec for the nxos_telemetry module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "options": { + "certificate": { + "options": { + "hostname": {"type": "str"}, + "key": {"type": "str"}, + }, + "type": "dict", + }, + "compression": {"choices": ["gzip"], "type": "str"}, + "source_interface": {"type": "str"}, + "vrf": {"type": "str"}, + "destination_groups": { + "options": { + "destination": { + "options": { + "encoding": { + "choices": ["GPB", "JSON"], + "type": "str", + }, + "ip": {"type": "str"}, + "port": {"type": "int"}, + "protocol": { + "choices": ["HTTP", "TCP", "UDP", "gRPC"], + "type": "str", + }, + }, + "type": "dict", + }, + "id": {"type": "int"}, + }, + "type": "list", + "elements": "raw", + }, + "sensor_groups": { + "options": { + "data_source": { + "choices": ["NX-API", "DME", "YANG"], + "type": "str", + }, + "id": {"type": "int"}, + "path": { + "options": { + "depth": {"type": "str"}, + "filter_condition": {"type": "str"}, + "name": {"type": "str"}, + "query_condition": {"type": "str"}, + }, + "type": "dict", + }, + }, + "type": "list", + "elements": "raw", + }, + "subscriptions": { + "options": { + "destination_group": {"type": "int"}, + "id": {"type": "int"}, + "sensor_group": { + "options": { + "id": {"type": "int"}, + "sample_interval": {"type": "int"}, + }, + "type": "dict", + }, + }, + "type": "list", + "elements": "raw", + }, + }, + "type": "dict", + }, + "state": { + "choices": ["merged", "replaced", "deleted"], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/vlans.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/vlans.py new file mode 100644 index 00000000..539d9e2e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/argspec/vlans/vlans.py @@ -0,0 +1,67 @@ +# +# -*- 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 nxos_vlans module +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +class VlansArgs(object): + """The arg spec for the nxos_vlans module + """ + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "options": { + "enabled": {"type": "bool"}, + "mapped_vni": {"type": "int"}, + "mode": {"choices": ["ce", "fabricpath"], "type": "str"}, + "name": {"type": "str"}, + "vlan_id": {"required": True, "type": "int"}, + "state": {"choices": ["active", "suspend"], "type": "str"}, + }, + "type": "list", + }, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "rendered", + "gathered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/telemetry.py new file mode 100644 index 00000000..187a2c42 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/cmdref/telemetry/telemetry.py @@ -0,0 +1,146 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# +# Telemetry Command Reference File + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +TMS_GLOBAL = """ +# The cmd_ref is a yaml formatted list of module commands. +# A leading underscore denotes a non-command variable; e.g. _template. +# TMS does not have convenient global json data so this cmd_ref uses raw cli configs. +--- +_template: # _template holds common settings for all commands + # Enable feature telemetry if disabled + feature: telemetry + # Common get syntax for TMS commands + get_command: show run telemetry all + # Parent configuration for TMS commands + context: + - telemetry +certificate: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + kind: dict + getval: certificate (?P\\S+) (?P\\S+)$ + setval: certificate {key} {hostname} + default: + key: ~ + hostname: ~ +compression: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + kind: str + getval: use-compression (\\S+)$ + setval: 'use-compression {0}' + default: ~ + context: &dpcontext + - telemetry + - destination-profile +source_interface: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + kind: str + getval: source-interface (\\S+)$ + setval: 'source-interface {0}' + default: ~ + context: *dpcontext +vrf: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + kind: str + getval: use-vrf (\\S+)$ + setval: 'use-vrf {0}' + default: ~ + context: *dpcontext +""" + +TMS_DESTGROUP = """ +# The cmd_ref is a yaml formatted list of module commands. +# A leading underscore denotes a non-command variable; e.g. _template. +# TBD: Use Structured Where Possible +--- +_template: # _template holds common settings for all commands + # Enable feature telemetry if disabled + feature: telemetry + # Common get syntax for TMS commands + get_command: show run telemetry all + # Parent configuration for TMS commands + context: + - telemetry +destination: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + multiple: true + kind: dict + getval: ip address (?P\\S+) port (?P\\S+) protocol (?P\\S+) encoding (?P\\S+) + setval: ip address {ip} port {port} protocol {protocol} encoding {encoding} + default: + ip: ~ + port: ~ + protocol: ~ + encoding: ~ +""" + +TMS_SENSORGROUP = """ +# The cmd_ref is a yaml formatted list of module commands. +# A leading underscore denotes a non-command variable; e.g. _template. +# TBD: Use Structured Where Possible +--- +_template: # _template holds common settings for all commands + # Enable feature telemetry if disabled + feature: telemetry + # Common get syntax for TMS commands + get_command: show run telemetry all + # Parent configuration for TMS commands + context: + - telemetry +data_source: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + kind: str + getval: data-source (\\S+)$ + setval: 'data-source {0}' + default: ~ +path: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + multiple: true + kind: dict + getval: path (?P(\\S+|".*"))( depth (?P\\S+))?( query-condition (?P\\S+))?( filter-condition (?P\\S+))?$ + setval: path {name} depth {depth} query-condition {query_condition} filter-condition {filter_condition} + default: + name: ~ + depth: ~ + query_condition: ~ + filter_condition: ~ +""" + +TMS_SUBSCRIPTION = """ +# The cmd_ref is a yaml formatted list of module commands. +# A leading underscore denotes a non-command variable; e.g. _template. +# TBD: Use Structured Where Possible +--- +_template: # _template holds common settings for all commands + # Enable feature telemetry if disabled + feature: telemetry + # Common get syntax for TMS commands + get_command: show run telemetry all + # Parent configuration for TMS commands + context: + - telemetry +destination_group: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + multiple: true + kind: int + getval: dst-grp (\\S+)$ + setval: 'dst-grp {0}' + default: ~ +sensor_group: + _exclude: ['N3K', 'N5K', 'N6k', 'N7k'] + multiple: true + kind: dict + getval: snsr-grp (?P\\S+) sample-interval (?P\\S+)$ + setval: snsr-grp {id} sample-interval {sample_interval} + default: + id: ~ + sample_interval: ~ +""" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/acl_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/acl_interfaces.py new file mode 100644 index 00000000..b6b208ad --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acl_interfaces/acl_interfaces.py @@ -0,0 +1,350 @@ +# +# -*- 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 nxos_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 + +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 ( + to_list, + remove_empties, + dict_diff, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + search_obj_in_list, + get_interface_type, + normalize_interface, +) + + +class Acl_interfaces(ConfigBase): + """ + The nxos_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 edit_config(self, commands): + """Wrapper method for `_connection.edit_config()` + This exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + self.state = self._module.params["state"] + action_states = ["merged", "replaced", "deleted", "overridden"] + + if self.state == "gathered": + result["gathered"] = self.get_acl_interfaces_facts() + elif self.state == "rendered": + result["rendered"] = self.set_config({}) + # no need to fetch facts for rendered + 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.set_config({}) + # no need to fetch facts for parsed + else: + existing_acl_interfaces_facts = self.get_acl_interfaces_facts() + commands.extend(self.set_config(existing_acl_interfaces_facts)) + if commands and self.state in action_states: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + result["before"] = existing_acl_interfaces_facts + result["commands"] = commands + + changed_acl_interfaces_facts = self.get_acl_interfaces_facts() + if result["changed"]: + result["after"] = 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 + """ + config = self._module.params["config"] + want = [] + if config: + for w in config: + if get_interface_type(w["name"]) == "loopback": + self._module.fail_json( + msg="This module works with ethernet, management or port-channe" + ) + w.update({"name": normalize_interface(w["name"])}) + want.append(remove_empties(w)) + 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 + """ + if ( + self.state in ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + self.state + ) + ) + + commands = [] + if self.state == "overridden": + commands = self._state_overridden(want, have) + elif self.state == "deleted": + commands = self._state_deleted(want, have) + elif self.state == "rendered": + commands = self._state_rendered(want) + elif self.state == "parsed": + want = self._module.params["running_config"] + commands = self._state_parsed(want) + else: + for w in want: + if self.state == "merged": + commands.extend(self._state_merged(w, have)) + elif self.state == "replaced": + commands.extend(self._state_replaced(w, have)) + return commands + + def _state_parsed(self, want): + return self.get_acl_interfaces_facts(want) + + def _state_rendered(self, want): + commands = [] + for w in want: + commands.extend(self.set_commands(w, {})) + 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 + """ + new_commands = [] + del_dict = {"name": want["name"], "access_groups": []} + obj_in_have = search_obj_in_list(want["name"], have, "name") + if obj_in_have != want: + commands = [] + if obj_in_have and "access_groups" in obj_in_have.keys(): + for ag in obj_in_have["access_groups"]: + want_afi = [] + if want.get("access_groups"): + want_afi = search_obj_in_list( + ag["afi"], want["access_groups"], "afi" + ) + if not want_afi: + # whatever in have is not in want + del_dict["access_groups"].append(ag) + else: + del_acl = [] + for acl in ag["acls"]: + if want_afi.get("acls"): + if acl not in want_afi["acls"]: + del_acl.append(acl) + else: + del_acl.append(acl) + afi = want_afi["afi"] + del_dict["access_groups"].append( + {"afi": afi, "acls": del_acl} + ) + + commands.extend(self._state_deleted([del_dict], have)) + commands.extend(self._state_merged(want, have)) + new_commands.append(commands[0]) + commands = [ + commands[i] + for i in range(1, len(commands)) + if commands[i] != commands[0] + ] + new_commands.extend(commands) + return new_commands + + 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 = [] + want_intf = [w["name"] for w in want] + for h in have: + if h["name"] not in want_intf: + commands.extend(self._state_deleted([h], have)) + for w in want: + commands.extend(self._state_replaced(w, have)) + 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 set_commands(self, want, have, deleted=False): + commands = [] + have_name = search_obj_in_list(want["name"], have, "name") + if have_name and have_name.get("access_groups"): + if want.get("access_groups"): + for w_afi in want["access_groups"]: + ip = "ipv6" + if w_afi["afi"] == "ipv4": + ip = "ip" + have_afi = search_obj_in_list( + w_afi["afi"], have_name["access_groups"], "afi" + ) + if have_afi: + new_acls = [] + if deleted: + if w_afi.get("acls") and have_afi.get("acls"): + new_acls = [ + acl + for acl in w_afi.get("acls") + if acl in have_afi.get("acls") + ] + elif "acls" not in w_afi.keys(): + new_acls = have_afi.get("acls") + else: + if w_afi.get("acls"): + new_acls = [ + acl + for acl in w_afi["acls"] + if acl not in have_afi["acls"] + ] + commands.extend( + self.process_acl(new_acls, ip, deleted) + ) + else: + if not deleted: + if w_afi.get("acls"): + commands.extend( + self.process_acl(w_afi["acls"], ip) + ) + else: + # only name is given to delete + if deleted and "access_groups" in have_name.keys(): + commands.extend(self.process_access_group(have_name, True)) + else: + if not deleted: # and 'access_groups' in have_name.keys(): + commands.extend(self.process_access_group(want)) + + if len(commands) > 0: + commands.insert(0, "interface " + want["name"]) + return commands + + def process_access_group(self, item, deleted=False): + commands = [] + for ag in item["access_groups"]: + ip = "ipv6" + if ag["afi"] == "ipv4": + ip = "ip" + if ag.get("acls"): + commands.extend(self.process_acl(ag["acls"], ip, deleted)) + return commands + + def process_acl(self, acls, ip, deleted=False): + commands = [] + no = "" + if deleted: + no = "no " + for acl in acls: + port = "" + if acl.get("port"): + port = " port" + ag = " access-group " + if ip == "ipv6": + ag = " traffic-filter " + commands.append( + no + ip + port + ag + acl["name"] + " " + acl["direction"] + ) + return commands + + def _state_deleted(self, main_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 main_want: + if self.state == "deleted": + for w in main_want: + h = search_obj_in_list(w["name"], have, "name") or {} + commands.extend(self.set_commands(h, have, deleted=True)) + else: + for want in main_want: + commands.extend( + self.set_commands(want, have, deleted=True) + ) + else: + for h in have: + commands.extend(self.set_commands(h, have, deleted=True)) + + return commands diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/acls.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/acls.py new file mode 100644 index 00000000..64372df6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/acls/acls.py @@ -0,0 +1,765 @@ +# +# -*- 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 nxos_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 socket +import re +from copy import deepcopy +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 ( + to_list, + remove_empties, + dict_diff, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.acls.acls import ( + AclsArgs, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + search_obj_in_list, + get_interface_type, + normalize_interface, +) + + +class Acls(ConfigBase): + """ + The nxos_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 edit_config(self, commands): + """Wrapper method for `_connection.edit_config()` + This exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + state = self._module.params["state"] + action_states = ["merged", "replaced", "deleted", "overridden"] + + if state == "gathered": + result["gathered"] = self.get_acls_facts() + elif state == "rendered": + result["rendered"] = self.set_config({}) + elif state == "parsed": + result["parsed"] = self.set_config({}) + else: + existing_acls_facts = self.get_acls_facts() + commands.extend(self.set_config(existing_acls_facts)) + if commands and state in action_states: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + result["before"] = existing_acls_facts + result["commands"] = commands + + changed_acls_facts = self.get_acls_facts() + if result["changed"]: + result["after"] = 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["config"] + want = [] + if config: + for w in config: + want.append(remove_empties(w)) + have = existing_acls_facts + if want: + want = self.convert_values(want) + resp = self.set_state(want, have) + return to_list(resp) + + def convert_values(self, want): + """ + This method is used to map and convert the user given values with what will actually be present in the device configuation + """ + port_protocol = { + 515: "lpd", + 517: "talk", + 7: "echo", + 9: "discard", + 12: "exec", + 13: "login", + 14: "cmd", + 109: "pop2", + 19: "chargen", + 20: "ftp-data", + 21: "ftp", + 23: "telnet", + 25: "smtp", + 540: "uucp", + 543: "klogin", + 544: "kshell", + 37: "time", + 43: "whois", + 49: "tacacs", + 179: "bgp", + 53: "domain", + 194: "irc", + 70: "gopher", + 79: "finger", + 80: "www", + 101: "hostname", + 3949: "drip", + 110: "pop3", + 111: "sunrpc", + 496: "pim-auto-rp", + 113: "ident", + 119: "nntp", + } + protocol = { + 1: "icmp", + 2: "igmp", + 4: "ip", + 6: "tcp", + 103: "pim", + 108: "pcp", + 47: "gre", + 17: "udp", + 50: "esp", + 51: "ahp", + 88: "eigrp", + 89: "ospf", + 94: "nos", + } + precedence = { + 0: "routine", + 1: "priority", + 2: "immediate", + 3: "flash", + 4: "flash-override", + 5: "critical", + 6: "internet", + 7: "network", + } + dscp = { + 10: "AF11", + 12: "AF12", + 14: "AF13", + 18: "AF21", + 20: "AF22", + 22: "AF23", + 26: "AF31", + 28: "AF32", + 30: "AF33", + 34: "AF41", + 36: "AF42", + 38: "AF43", + 8: "CS1", + 16: "CS2", + 24: "CS3", + 32: "CS4", + 40: "CS5", + 48: "CS6", + 56: "CS7", + 0: "Default", + 46: "EF", + } + # port_pro_num = list(protocol.keys()) + for afi in want: + if "acls" in afi.keys(): + for acl in afi["acls"]: + if "aces" in acl.keys(): + for ace in acl["aces"]: + if "dscp" in ace.keys(): + if ace["dscp"].isdigit(): + ace["dscp"] = dscp[int(ace["dscp"])] + ace["dscp"] = ace["dscp"].lower() + if "precedence" in ace.keys(): + if ace["precedence"].isdigit(): + ace["precedence"] = precedence[ + int(ace["precedence"]) + ] + if ( + "protocol" in ace.keys() + and ace["protocol"].isdigit() + and int(ace["protocol"]) in protocol.keys() + ): + ace["protocol"] = protocol[ + int(ace["protocol"]) + ] + # convert number to name + if "protocol" in ace.keys() and ace[ + "protocol" + ] in ["tcp", "udp"]: + for end in ["source", "destination"]: + if "port_protocol" in ace[end].keys(): + key = list( + ace[end]["port_protocol"].keys() + )[0] + # key could be eq,gt,lt,neq or range + if key != "range": + val = ace[end]["port_protocol"][ + key + ] + if ( + val.isdigit() + and int(val) + in port_protocol.keys() + ): + ace[end]["port_protocol"][ + key + ] = port_protocol[int(val)] + else: + st = int( + ace[end]["port_protocol"][ + "range" + ]["start"] + ) + + end = int( + ace[end]["port_protocol"][ + "range" + ]["end"] + ) + + if st in port_protocol.keys(): + ace[end]["port_protocol"][ + "range" + ]["start"] = port_protocol[st] + if end in port_protocol.keys(): + ace[end]["port_protocol"][ + "range" + ]["end"] = port_protocol[end] + return want + + 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"] + commands = [] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "rendered": + commands = self._state_rendered(want) + elif state == "parsed": + want = self._module.params["running_config"] + commands = self._state_parsed(want) + else: + for w in want: + if state == "merged": + commands.extend(self._state_merged(w, have)) + elif state == "replaced": + commands.extend(self._state_replaced(w, have)) + if state != "parsed": + commands = [c.strip() for c in commands] + return commands + + def _state_parsed(self, want): + return self.get_acls_facts(want) + + def _state_rendered(self, want): + commands = [] + for w in want: + commands.extend(self.set_commands(w, {})) + 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 = [] + have_afi = search_obj_in_list(want["afi"], have, "afi") + del_dict = {"acls": []} + want_names = [] + if have_afi != want: + if have_afi: + del_dict.update({"afi": have_afi["afi"], "acls": []}) + if want.get("acls"): + want_names = [w["name"] for w in want["acls"]] + have_names = [h["name"] for h in have_afi["acls"]] + want_acls = want.get("acls") + for w in want_acls: + acl_commands = [] + if w["name"] not in have_names: + # creates new ACL in replaced state + merge_dict = {"afi": want["afi"], "acls": [w]} + commands.extend( + self._state_merged(merge_dict, have) + ) + else: + # acl in want exists in have + have_name = search_obj_in_list( + w["name"], have_afi["acls"], "name" + ) + have_aces = ( + have_name.get("aces") + if have_name.get("aces") + else [] + ) + merge_aces = [] + del_aces = [] + w_aces = w.get("aces") if w.get("aces") else [] + + for ace in have_aces: + if ace not in w_aces: + del_aces.append(ace) + for ace in w_aces: + if ace not in have_aces: + merge_aces.append(ace) + merge_dict = { + "afi": want["afi"], + "acls": [ + {"name": w["name"], "aces": merge_aces} + ], + } + del_dict = { + "afi": want["afi"], + "acls": [ + {"name": w["name"], "aces": del_aces} + ], + } + if del_dict["acls"]: + acl_commands.extend( + self._state_deleted([del_dict], have) + ) + acl_commands.extend( + self._state_merged(merge_dict, have) + ) + + for i in range(1, len(acl_commands)): + if acl_commands[i] == acl_commands[0]: + acl_commands[i] = "" + commands.extend(acl_commands) + else: + acls = [] + # no acls given in want, so delete all have acls + for acl in have_afi["acls"]: + acls.append({"name": acl["name"]}) + del_dict["acls"] = acls + if del_dict["acls"]: + commands.extend(self._state_deleted([del_dict], have)) + + else: + # want_afi is not present in have + commands.extend(self._state_merged(want, have)) + + commands = list(filter(None, commands)) + return commands + + 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 = [] + want_afi = [w["afi"] for w in want] + for h in have: + if h["afi"] in want_afi: + w = search_obj_in_list(h["afi"], want, "afi") + for h_acl in h["acls"]: + w_acl = search_obj_in_list( + h_acl["name"], w["acls"], "name" + ) + if not w_acl: + del_dict = { + "afi": h["afi"], + "acls": [{"name": h_acl["name"]}], + } + commands.extend(self._state_deleted([del_dict], have)) + else: + # if afi is not in want + commands.extend(self._state_deleted([{"afi": h["afi"]}], have)) + for w in want: + commands.extend(self._state_replaced(w, have)) + 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 = [] + if want: # and have != want: + for w in want: + ip = "ipv6" if w["afi"] == "ipv6" else "ip" + acl_names = [] + have_afi = search_obj_in_list(w["afi"], have, "afi") + # if want['afi] not in have, ignore + if have_afi: + if w.get("acls"): + for acl in w["acls"]: + if ( + "aces" in acl.keys() + and self._module.params["state"] != "deleted" + ): + have_name = search_obj_in_list( + acl["name"], have_afi["acls"], "name" + ) + if have_name: + ace_commands = [] + flag = 0 + for ace in acl["aces"]: + if list(ace.keys()) == ["sequence"]: + # only sequence number is specified to be deleted + if "aces" in have_name.keys(): + for h_ace in have_name["aces"]: + if ( + h_ace["sequence"] + == ace["sequence"] + ): + ace_commands.append( + "no " + + str( + ace["sequence"] + ) + ) + flag = 1 + else: + if "aces" in have_name.keys(): + for h_ace in have_name["aces"]: + # when want['ace'] does not have seq number + if ( + "sequence" + not in ace.keys() + ): + del h_ace["sequence"] + if ace == h_ace: + ace_commands.append( + "no " + + self.process_ace( + ace + ) + ) + flag = 1 + if flag: + ace_commands.insert( + 0, + ip + " access-list " + acl["name"], + ) + commands.extend(ace_commands) + else: + # only name given + for h in have_afi["acls"]: + if h["name"] == acl["name"]: + acl_names.append(acl["name"]) + for name in acl_names: + commands.append( + "no " + ip + " access-list " + name + ) + + else: + # 'only afi is given' + if have_afi.get("acls"): + for h in have_afi["acls"]: + acl_names.append(h["name"]) + for name in acl_names: + commands.append( + "no " + ip + " access-list " + name + ) + else: + v6 = [] + v4 = [] + v6_local = v4_local = None + for h in have: + if h["afi"] == "ipv6": + v6 = (acl["name"] for acl in h["acls"]) + if "match_local_traffic" in h.keys(): + v6_local = True + else: + v4 = (acl["name"] for acl in h["acls"]) + if "match_local_traffic" in h.keys(): + v4_local = True + + self.no_commands(v4, commands, v4_local, "ip") + self.no_commands(v6, commands, v6_local, "ipv6") + + for name in v6: + commands.append("no ipv6 access-list " + name) + if v4_local: + commands.append("no ipv6 access-list match-local-traffic") + + return commands + + def no_commands(self, v_list, commands, match_local, ip): + for name in v_list: + commands.append("no " + ip + " access-list " + name) + if match_local: + commands.append("no " + ip + " access-list match-local-traffic") + + def set_commands(self, want, have): + commands = [] + have_afi = search_obj_in_list(want["afi"], have, "afi") + ip = "" + if "v6" in want["afi"]: + ip = "ipv6 " + else: + ip = "ip " + + if have_afi: + if want.get("acls"): + for w_acl in want["acls"]: + have_acl = search_obj_in_list( + w_acl["name"], have_afi["acls"], "name" + ) + name = w_acl["name"] + flag = 0 + ace_commands = [] + if have_acl != w_acl: + if have_acl: + ace_list = [] + if w_acl.get("aces") and have_acl.get("aces"): + # case 1 --> sequence number not given in want --> new ace + # case 2 --> new sequence number in want --> new ace + # case 3 --> existing sequence number given --> update rule (only for merged state. + # For replaced and overridden, rule is deleted in the state's config) + + ace_list = [ + item + for item in w_acl["aces"] + if "sequence" not in item.keys() + ] # case 1 + + want_seq = [ + item["sequence"] + for item in w_acl["aces"] + if "sequence" in item.keys() + ] + + have_seq = [ + item["sequence"] + for item in have_acl["aces"] + ] + + new_seq = list(set(want_seq) - set(have_seq)) + common_seq = list( + set(want_seq).intersection(set(have_seq)) + ) + + temp_list = [ + item + for item in w_acl["aces"] + if "sequence" in item.keys() + and item["sequence"] in new_seq + ] # case 2 + ace_list.extend(temp_list) + for w in w_acl["aces"]: + self.argument_spec = AclsArgs.argument_spec + params = utils.validate_config( + self.argument_spec, + { + "config": [ + { + "afi": want["afi"], + "acls": [ + { + "name": name, + "aces": ace_list, + } + ], + } + ] + }, + ) + if ( + "sequence" in w.keys() + and w["sequence"] in common_seq + ): + temp_obj = search_obj_in_list( + w["sequence"], + have_acl["aces"], + "sequence", + ) # case 3 + if temp_obj != w: + for key, val in w.items(): + temp_obj[key] = val + ace_list.append(temp_obj) + if ( + self._module.params["state"] + == "merged" + ): + ace_commands.append( + "no " + str(w["sequence"]) + ) + # remove existing rule to update it + elif w_acl.get("aces"): + # 'have' has ACL defined without any ACE + ace_list = [item for item in w_acl["aces"]] + for w_ace in ace_list: + ace_commands.append( + self.process_ace(w_ace).strip() + ) + flag = 1 + + if flag: + ace_commands.insert( + 0, ip + "access-list " + name + ) + + else: + commands.append(ip + "access-list " + name) + if "aces" in w_acl.keys(): + for w_ace in w_acl["aces"]: + commands.append( + self.process_ace(w_ace).strip() + ) + commands.extend(ace_commands) + else: + if want.get("acls"): + for w_acl in want["acls"]: + name = w_acl["name"] + commands.append(ip + "access-list " + name) + if "aces" in w_acl.keys(): + for w_ace in w_acl["aces"]: + commands.append(self.process_ace(w_ace).strip()) + + return commands + + def process_ace(self, w_ace): + command = "" + ace_keys = w_ace.keys() + if "remark" in ace_keys: + command += "remark " + w_ace["remark"] + " " + else: + command += w_ace["grant"] + " " + if "protocol" in ace_keys: + command += w_ace["protocol"] + " " + src = self.get_address(w_ace["source"], w_ace["protocol"]) + dest = self.get_address( + w_ace["destination"], w_ace["protocol"] + ) + command += src + dest + if "protocol_options" in ace_keys: + pro = list(w_ace["protocol_options"].keys())[0] + if pro != w_ace["protocol"]: + self._module.fail_json( + msg="protocol and protocol_options mismatch" + ) + flags = "" + for k in w_ace["protocol_options"][pro].keys(): + k = re.sub("_", "-", k) + flags += k + " " + command += flags + if "dscp" in ace_keys: + command += "dscp " + w_ace["dscp"] + " " + if "fragments" in ace_keys: + command += "fragments " + if "precedence" in ace_keys: + command += "precedence " + w_ace["precedence"] + " " + if "log" in ace_keys: + command += "log " + if "sequence" in ace_keys: + command = str(w_ace["sequence"]) + " " + command + return command + + def get_address(self, endpoint, pro=""): + ret_addr = "" + keys = list(endpoint.keys()) + if "address" in keys: + if "wildcard_bits" not in keys: + self._module.fail_json( + msg="wildcard bits not specified for address" + ) + else: + ret_addr = ( + endpoint["address"] + " " + endpoint["wildcard_bits"] + " " + ) + elif "any" in keys: + ret_addr = "any " + elif "host" in keys: + ret_addr = "host " + endpoint["host"] + " " + elif "prefix" in keys: + ret_addr = endpoint["prefix"] + " " + + if pro in ["tcp", "udp"]: + if "port_protocol" in keys: + options = self.get_options(endpoint["port_protocol"]) + ret_addr += options + return ret_addr + + def get_options(self, item): + com = "" + subkey = list(item.keys()) + if "range" in subkey: + com = ( + "range " + + item["range"]["start"] + + " " + + item["range"]["end"] + + " " + ) + else: + com = subkey[0] + " " + item[subkey[0]] + " " + return com diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/bfd_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/bfd_interfaces.py new file mode 100644 index 00000000..b115ce49 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bfd_interfaces/bfd_interfaces.py @@ -0,0 +1,323 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +nxos_bfd_interfaces class +This class creates a command set to bring the current device configuration +to a desired end-state. The command set is based on a comparison of the +current configuration (as dict) and the provided configuration (as dict). +""" +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, + to_list, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + search_obj_in_list, +) + + +class Bfd_interfaces(ConfigBase): + """ + The nxos_bfd_interfaces class + """ + + gather_subset = ["min"] + gather_network_resources = ["bfd_interfaces"] + # exclude_params = [] + + def __init__(self, module): + super(Bfd_interfaces, self).__init__(module) + + def get_bfd_interfaces_facts(self, data=None): + """ Get the 'facts' (the current configuration) + + :returns: A list of interface configs and a platform string + """ + if self.state not in self.ACTION_STATES: + self.gather_subset = ["!all", "!min"] + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, self.gather_network_resources, data=data + ) + bfd_interfaces_facts = facts["ansible_network_resources"].get( + "bfd_interfaces", [] + ) + + platform = facts.get("ansible_net_platform", "") + return bfd_interfaces_facts, platform + + def edit_config(self, commands): + return self._connection.edit_config(commands) + + 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_bfd_interfaces_facts, platform = ( + self.get_bfd_interfaces_facts() + ) + else: + existing_bfd_interfaces_facts, platform = [], "" + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend( + self.set_config(existing_bfd_interfaces_facts, platform) + ) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self.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_bfd_interfaces_facts, platform = ( + self.get_bfd_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"], platform = self.get_bfd_interfaces_facts( + data=running_config + ) + + if self.state in self.ACTION_STATES: + result["before"] = existing_bfd_interfaces_facts + if result["changed"]: + result["after"] = changed_bfd_interfaces_facts + + elif self.state == "gathered": + result["gathered"] = changed_bfd_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_bfd_interfaces_facts, platform): + """ 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 + """ + if re.search("N[56]K", platform): + # Some platforms do not support the 'bfd' interface keyword; + # remove the 'bfd' key from each want/have interface. + orig_want = self._module.params["config"] + want = [] + for w in orig_want: + del w["bfd"] + want.append(w) + orig_have = existing_bfd_interfaces_facts + have = [] + for h in orig_have: + del h["bfd"] + have.append(h) + else: + want = self._module.params["config"] + have = existing_bfd_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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + + cmds = list() + if state == "overridden": + cmds.extend(self._state_overridden(want, have)) + elif state == "deleted": + cmds.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + cmds.extend(self._state_merged(flatten_dict(w), have)) + elif state == "replaced": + cmds.extend(self._state_replaced(flatten_dict(w), have)) + return cmds + + 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 + """ + cmds = [] + obj_in_have = search_obj_in_list(want["name"], have, "name") + if obj_in_have: + diff = dict_diff(want, obj_in_have) + else: + diff = want + merged_cmds = self.set_commands(want, have) + if "name" not in diff: + diff["name"] = want["name"] + + replaced_cmds = [] + if obj_in_have: + replaced_cmds = self.del_attribs(diff) + if replaced_cmds or merged_cmds: + for cmd in set(replaced_cmds).intersection(set(merged_cmds)): + merged_cmds.remove(cmd) + cmds.extend(replaced_cmds) + cmds.extend(merged_cmds) + return cmds + + 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 + """ + cmds = [] + for h in have: + # Clean up bfd attrs for any interfaces not listed in the play + h = flatten_dict(h) + obj_in_want = flatten_dict( + search_obj_in_list(h["name"], want, "name") + ) + if obj_in_want: + # Let the 'want' loop handle all vals for this interface + continue + cmds.extend(self.del_attribs(h)) + for w in want: + # Update any want attrs if needed. The overridden state considers + # the play as the source of truth for the entire device, therefore + # set any unspecified attrs to their default state. + w = self.set_none_vals_to_defaults(flatten_dict(w)) + cmds.extend(self.set_commands(w, have)) + return cmds + + 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 + """ + if not (want or have): + return [] + cmds = [] + if want: + for w in want: + obj_in_have = flatten_dict( + search_obj_in_list(w["name"], have, "name") + ) + cmds.extend(self.del_attribs(obj_in_have)) + else: + for h in have: + cmds.extend(self.del_attribs(flatten_dict(h))) + return cmds + + def del_attribs(self, obj): + if not obj or len(obj.keys()) == 1: + return [] + cmds = [] + # 'bfd' and 'bfd echo' are enabled by default so the handling is + # counter-intuitive; we are enabling them to remove them. The end result + # is that they are removed from the interface config on the device. + if "bfd" in obj and "disable" in obj["bfd"]: + cmds.append("bfd") + if "echo" in obj and "disable" in obj["echo"]: + cmds.append("bfd echo") + if cmds: + cmds.insert(0, "interface " + obj["name"]) + return cmds + + def set_none_vals_to_defaults(self, want): + # Set dict None values to default states + if "bfd" in want and want["bfd"] is None: + want["bfd"] = "enable" + if "echo" in want and want["echo"] is None: + want["echo"] = "enable" + return want + + def diff_of_dicts(self, want, obj_in_have): + diff = set(want.items()) - set(obj_in_have.items()) + diff = dict(diff) + if diff and want["name"] == obj_in_have["name"]: + diff.update({"name": want["name"]}) + return diff + + def add_commands(self, want): + if not want: + return [] + cmds = [] + if "bfd" in want and want["bfd"] is not None: + cmd = "bfd" if want["bfd"] == "enable" else "no bfd" + cmds.append(cmd) + if "echo" in want and want["echo"] is not None: + cmd = "bfd echo" if want["echo"] == "enable" else "no bfd echo" + cmds.append(cmd) + + if cmds: + cmds.insert(0, "interface " + want["name"]) + return cmds + + def set_commands(self, want, have): + cmds = [] + obj_in_have = flatten_dict( + search_obj_in_list(want["name"], have, "name") + ) + if not obj_in_have: + cmds = self.add_commands(want) + else: + diff = self.diff_of_dicts(want, obj_in_have) + cmds = self.add_commands(diff) + return cmds diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/bgp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/bgp_global.py new file mode 100644 index 00000000..6481c9b6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/bgp_global/bgp_global.py @@ -0,0 +1,412 @@ +# +# -*- 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 nxos_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 copy import deepcopy + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module import ( + ResourceModule, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.bgp_global import ( + Bgp_globalTemplate, +) + + +class Bgp_global(ResourceModule): + """ + The nxos_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(), + ) + # VRF parsers = 29 + self.parsers = [ + "allocate_index", + "affinity_group.group_id", + "bestpath.always_compare_med", + "bestpath.as_path.ignore", + "bestpath.as_path.multipath_relax", + "bestpath.compare_neighborid", + "bestpath.compare_routerid", + "bestpath.cost_community_ignore", + "bestpath.igp_metric_ignore", + "bestpath.med.confed", + "bestpath.med.missing_as_worst", + "bestpath.med.non_deterministic", + "cluster_id", + "local_as", + "confederation.identifier", + "graceful_restart", + "graceful_restart.restart_time", + "graceful_restart.stalepath_time", + "graceful_restart.helper", + "log_neighbor_changes", + "maxas_limit", + "neighbor_down.fib_accelerate", + "reconnect_interval", + "router_id", + "timers.bestpath_limit", + "timers.bgp", + "timers.prefix_peer_timeout", + "timers.prefix_peer_wait", + # end VRF parsers + "disable_policy_batching", + "disable_policy_batching.ipv4.prefix_list", + "disable_policy_batching.ipv6.prefix_list", + "disable_policy_batching.nexthop", + "dynamic_med_interval", + "enforce_first_as", + "enhanced_error", + "fast_external_fallover", + "flush_routes", + "graceful_shutdown.activate", + "graceful_shutdown.aware", + "isolate", + "nexthop.suppress_default_resolution", + "shutdown", + "suppress_fib_pending", + "fabric_soo", + "rd", + ] + self._af_data = {} + + 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. + """ + if self.state in ["deleted", "replaced"]: + self._build_af_data() + + for entry in self.want, self.have: + self._bgp_list_to_dict(entry) + + # if state is deleted, clean up global params + if self.state == "deleted": + if not self.want or ( + self.have.get("as_number") == self.want.get("as_number") + ): + self._compare(want={}, have=self.have) + + elif self.state == "purged": + if not self.want or ( + self.have.get("as_number") == self.want.get("as_number") + ): + self.addcmd(self.have or {}, "as_number", True) + + else: + wantd = self.want + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(self.have, self.want) + + self._compare(want=wantd, have=self.have) + + def _compare(self, want, have, vrf=None): + """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. + """ + begin = len(self.commands) + self.compare(parsers=self.parsers, want=want, have=have) + self._compare_confederation_peers(want, have) + self._compare_neighbors(want, have, vrf=vrf) + self._vrfs_compare(want=want, have=have) + + if len(self.commands) != begin: + self.commands.insert( + begin, + self._tmplt.render( + want or have, + "vrf" + if "vrf" in (want.keys() or have.keys()) + else "as_number", + False, + ), + ) + + def _compare_confederation_peers(self, want, have): + """Custom handling of confederation.peers option + + :params want: the want BGP dictionary + :params have: the have BGP dictionary + """ + w_cpeers = want.get("confederation", {}).get("peers", []) + h_cpeers = have.get("confederation", {}).get("peers", []) + + if set(w_cpeers) != set(h_cpeers): + if self.state in ["replaced", "deleted"]: + # if there are peers already configured + # we need to remove those before we pass + # the new ones otherwise the device appends + # them to the existing ones + if h_cpeers: + self.addcmd(have, "confederation.peers", True) + if w_cpeers: + self.addcmd(want, "confederation.peers", False) + + def _compare_neighbors(self, want, have, vrf=None): + """Custom handling of neighbors option + + :params want: the want BGP dictionary + :params have: the have BGP dictionary + """ + nbr_parsers = [ + "remote_as", + "neighbor_affinity_group.group_id", + "bmp_activate_server", + "capability", + "description", + "disable_connected_check", + "dont_capability_negotiate", + "dscp", + "dynamic_capability", + "ebgp_multihop", + "graceful_shutdown", + "inherit.peer", + "inherit.peer_session", + "local_as", + "log_neighbor_changes", + "low_memory", + "password", + "peer_type", + "remove_private_as", + "shutdown", + "timers", + "transport", + "ttl_security", + "update_source", + ] + wnbrs = want.get("neighbors", {}) + hnbrs = have.get("neighbors", {}) + + # neighbors have separate contexts in NX-OS + for name, entry in iteritems(wnbrs): + begin = len(self.commands) + have_nbr = hnbrs.pop(name, {}) + + self.compare(parsers=nbr_parsers, want=entry, have=have_nbr) + self._compare_path_attribute(entry, have_nbr) + + if len(self.commands) != begin: + self.commands.insert( + begin, self._tmplt.render(entry, "neighbor_address", False) + ) + + # cleanup remaining neighbors + # but do not negate it entirely + # instead remove only those attributes + # that this module manages + for name, entry in iteritems(hnbrs): + if self._has_af(vrf=vrf, neighbor=name): + self._module.fail_json( + msg="Neighbor {0} has address-family configurations. " + "Please use the nxos_bgp_neighbor_af module to remove those first.".format( + name + ) + ) + else: + self.addcmd(entry, "neighbor_address", True) + + def _compare_path_attribute(self, want, have): + """Custom handling of neighbor path_attribute + option. + + :params want: the want neighbor dictionary + :params have: the have neighbor dictionary + """ + w_p_attr = want.get("path_attribute", {}) + h_p_attr = have.get("path_attribute", {}) + + for wkey, wentry in iteritems(w_p_attr): + if wentry != h_p_attr.pop(wkey, {}): + self.addcmd(wentry, "path_attribute", False) + + # remove remaining items in have for replaced + for hkey, hentry in iteritems(h_p_attr): + self.addcmd(hentry, "path_attribute", True) + + def _vrfs_compare(self, want, have): + """Custom handling of VRFs option + + :params want: the want BGP dictionary + :params have: the have BGP dictionary + """ + wvrfs = want.get("vrfs", {}) + hvrfs = have.get("vrfs", {}) + for name, entry in iteritems(wvrfs): + self._compare(want=entry, have=hvrfs.pop(name, {}), vrf=name) + # cleanup remaining VRFs + # but do not negate it entirely + # instead remove only those attributes + # that this module manages + for name, entry in iteritems(hvrfs): + if self._has_af(vrf=name): + self._module.fail_json( + msg="VRF {0} has address-family configurations. " + "Please use the nxos_bgp_af module to remove those first.".format( + name + ) + ) + else: + self.addcmd(entry, "vrf", True) + + def _bgp_list_to_dict(self, entry): + """Convert list of items to dict of items + for efficient diff calculation. + + :params entry: data dictionary + """ + + def _build_key(x): + """Build primary key for path_attribute + option. + :params x: path_attribute dictionary + :returns: primary key as tuple + """ + key_1 = "start_{0}".format(x.get("range", {}).get("start", "")) + key_2 = "end_{0}".format(x.get("range", {}).get("end", "")) + key_3 = "type_{0}".format(x.get("type", "")) + key_4 = x["action"] + + return (key_1, key_2, key_3, key_4) + + if "neighbors" in entry: + for x in entry["neighbors"]: + if "path_attribute" in x: + x["path_attribute"] = { + _build_key(item): item + for item in x.get("path_attribute", []) + } + + entry["neighbors"] = { + x["neighbor_address"]: x for x in entry.get("neighbors", []) + } + + if "vrfs" in entry: + entry["vrfs"] = {x["vrf"]: x for x in entry.get("vrfs", [])} + for _k, vrf in iteritems(entry["vrfs"]): + self._bgp_list_to_dict(vrf) + + def _get_config(self): + return self._connection.get( + "show running-config | section '^router bgp'" + ) + + def _build_af_data(self): + """Build a dictionary with AF related information + from fetched BGP config. + _af_data = { + gbl_data = {'192.168.1.100', '192.168.1.101'}, + vrf_data = { + 'vrf_1': { + 'has_af': True, + 'nbrs': {'192.0.1.1', '192.8.1.1'} + }, + 'vrf_2': { + 'has_af': False, + 'nbrs': set() + } + } + } + """ + data = self._get_config().split("\n") + cur_nbr = None + cur_vrf = None + gbl_data = set() + vrf_data = {} + + for x in data: + if x.strip().startswith("vrf"): + cur_nbr = None + cur_vrf = x.split(" ")[-1] + vrf_data[cur_vrf] = {"nbrs": set(), "has_af": False} + + elif x.strip().startswith("neighbor"): + cur_nbr = x.split(" ")[-1] + + elif x.strip().startswith("address-family"): + if cur_nbr: + if cur_vrf: + vrf_data[cur_vrf]["nbrs"].add(cur_nbr) + else: + gbl_data.add(cur_nbr) + else: + if cur_vrf: + vrf_data[cur_vrf]["has_af"] = True + + self._af_data["global"] = gbl_data + self._af_data["vrf"] = vrf_data + + def _has_af(self, vrf=None, neighbor=None): + """Determine if the given vrf + neighbor + combination has AF configurations. + + :params vrf: vrf name + :params neighbor: neighbor name + :returns: bool + """ + has_af = False + + if self._af_data: + vrf_af_data = self._af_data.get("vrf", {}) + global_af_data = self._af_data.get("global", set()) + if vrf: + vrf_nbr_has_af = vrf_af_data.get(vrf, {}).get("nbrs", set()) + vrf_has_af = vrf_af_data.get(vrf, {}).get("has_af", False) + if neighbor and neighbor in vrf_nbr_has_af: + # we are inspecting neighbor within a VRF + # if the given neighbor has AF we return True + has_af = True + else: + # we are inspecting VRF as a whole + # if there is at least one neighbor + # with AF or VRF has AF itself return True + if vrf_nbr_has_af or vrf_has_af: + has_af = True + else: + # we are inspecting top level neighbors + # if the given neighbor has AF we return True + if neighbor and neighbor in global_af_data: + has_af = True + + return has_af diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/hsrp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/hsrp_interfaces.py new file mode 100644 index 00000000..04df23f3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/hsrp_interfaces/hsrp_interfaces.py @@ -0,0 +1,302 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The nxos hsrp_interfaces class +This class creates a command set to bring the current device configuration +to a desired end-state. The command set is based on a comparison of the +current configuration (as dict) and the provided configuration (as dict). +""" +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, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + get_interface_type, + normalize_interface, + search_obj_in_list, + vlan_range_to_list, +) + + +class Hsrp_interfaces(ConfigBase): + """ + The nxos_hsrp_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["hsrp_interfaces"] + + def __init__(self, module): + super(Hsrp_interfaces, self).__init__(module) + + def get_hsrp_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 + ) + hsrp_interfaces_facts = facts["ansible_network_resources"].get( + "hsrp_interfaces", [] + ) + return hsrp_interfaces_facts + + def edit_config(self, commands): + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = [] + commands = [] + + if self.state in self.ACTION_STATES: + existing_hsrp_interfaces_facts = self.get_hsrp_interfaces_facts() + else: + existing_hsrp_interfaces_facts = [] + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_hsrp_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self.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_hsrp_interfaces_facts = self.get_hsrp_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_hsrp_interfaces_facts( + data=running_config + ) + + if self.state in self.ACTION_STATES: + result["before"] = existing_hsrp_interfaces_facts + if result["changed"]: + result["after"] = changed_hsrp_interfaces_facts + + elif self.state == "gathered": + result["gathered"] = changed_hsrp_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_hsrp_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 + """ + config = self._module.params["config"] + want = [] + if config: + for w in config: + w.update({"name": normalize_interface(w["name"])}) + want.append(w) + have = existing_hsrp_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"] + # check for 'config' keyword in play + if ( + state in ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + + cmds = list() + if state == "overridden": + cmds.extend(self._state_overridden(want, have)) + elif state == "deleted": + cmds.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + cmds.extend(self._state_merged(flatten_dict(w), have)) + elif state == "replaced": + cmds.extend(self._state_replaced(flatten_dict(w), have)) + return cmds + + 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 + """ + cmds = [] + obj_in_have = search_obj_in_list(want["name"], have, "name") + if obj_in_have: + diff = dict_diff(want, obj_in_have) + else: + diff = want + merged_cmds = self.set_commands(want, have) + if "name" not in diff: + diff["name"] = want["name"] + + replaced_cmds = [] + if obj_in_have: + replaced_cmds = self.del_attribs(diff) + if replaced_cmds or merged_cmds: + for cmd in set(replaced_cmds).intersection(set(merged_cmds)): + merged_cmds.remove(cmd) + cmds.extend(replaced_cmds) + cmds.extend(merged_cmds) + return cmds + + 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 + """ + cmds = [] + for h in have: + # Check existing states, set to default if not in want or different than want + h = flatten_dict(h) + obj_in_want = search_obj_in_list(h["name"], want, "name") + if obj_in_want: + # Let the 'want' loop handle all vals for this interface + continue + cmds.extend(self.del_attribs(h)) + for w in want: + # Update any want attrs if needed. The overridden state considers + # the play as the source of truth for the entire device, therefore + # set any unspecified attrs to their default state. + w = self.set_none_vals_to_defaults(flatten_dict(w)) + cmds.extend(self.set_commands(w, have)) + return cmds + + 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 + """ + if not (want or have): + return [] + cmds = [] + if want: + for w in want: + obj_in_have = flatten_dict( + search_obj_in_list(w["name"], have, "name") + ) + cmds.extend(self.del_attribs(obj_in_have)) + else: + for h in have: + cmds.extend(self.del_attribs(flatten_dict(h))) + return cmds + + def del_attribs(self, obj): + if not obj or len(obj.keys()) == 1: + return [] + cmds = [] + if "bfd" in obj: + cmds.append("no hsrp bfd") + if cmds: + cmds.insert(0, "interface " + obj["name"]) + return cmds + + def set_none_vals_to_defaults(self, want): + # Set dict None values to default states + if "bfd" in want and want["bfd"] is None: + want["bfd"] = "disable" + return want + + def diff_of_dicts(self, want, obj_in_have): + diff = set(want.items()) - set(obj_in_have.items()) + diff = dict(diff) + if diff and want["name"] == obj_in_have["name"]: + diff.update({"name": want["name"]}) + return diff + + def add_commands(self, want, obj_in_have): + if not want: + return [] + cmds = [] + if "bfd" in want and want["bfd"] is not None: + if want["bfd"] == "enable": + cmd = "hsrp bfd" + cmds.append(cmd) + elif ( + want["bfd"] == "disable" + and obj_in_have + and obj_in_have.get("bfd") == "enable" + ): + cmd = "no hsrp bfd" + cmds.append(cmd) + + if cmds: + cmds.insert(0, "interface " + want["name"]) + return cmds + + def set_commands(self, want, have): + cmds = [] + obj_in_have = search_obj_in_list(want["name"], have, "name") + if not obj_in_have: + cmds = self.add_commands(want, obj_in_have) + else: + diff = self.diff_of_dicts(want, obj_in_have) + cmds = self.add_commands(diff, obj_in_have) + return cmds diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/interfaces.py new file mode 100644 index 00000000..6d17421a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/interfaces/interfaces.py @@ -0,0 +1,495 @@ +# +# -*- 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 nxos_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 copy import deepcopy +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, + to_list, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + normalize_interface, + search_obj_in_list, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + remove_rsvd_interfaces, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + default_intf_enabled, +) + + +class Interfaces(ConfigBase): + """ + The nxos_interfaces class + """ + + gather_subset = ["min"] + + gather_network_resources = ["interfaces"] + + exclude_params = ["description", "mtu", "speed", "duplex"] + + def __init__(self, module): + super(Interfaces, self).__init__(module) + + def get_interfaces_facts(self, data=None): + """ Get the 'facts' (the current configuration) + + :data: Mocked running-config data for state `parsed` + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + self.facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, self.gather_network_resources, data=data + ) + interfaces_facts = self.facts["ansible_network_resources"].get( + "interfaces" + ) + + return interfaces_facts + + def get_platform(self): + """Wrapper method for getting platform info + This method exists solely to allow the unit test framework to mock calls. + """ + return self.facts.get("ansible_net_platform", "") + + def get_system_defaults(self): + """Wrapper method for `_connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.get( + "show running-config all | incl 'system default switchport'" + ) + + def edit_config(self, commands): + """Wrapper method for `_connection.edit_config()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = [] + warnings = [] + + 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: + self.intf_defs = self.render_interface_defaults( + self.get_system_defaults(), existing_interfaces_facts + ) + commands.extend(self.set_config(existing_interfaces_facts)) + + if self.state == "rendered": + # Hardcode the system defaults for "rendered" + # This can be made a configurable option in the future + self.intf_defs = { + "sysdefs": { + "L2_enabled": False, + "L3_enabled": False, + "mode": "layer3", + } + } + commands.extend(self.set_config(existing_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self.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 + """ + config = self._module.params.get("config") + want = [] + if config: + for w in config: + w.update({"name": normalize_interface(w["name"])}) + want.append(remove_empties(w)) + have = deepcopy(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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + + commands = list() + if state == "overridden": + commands.extend(self._state_overridden(want, have)) + elif state == "deleted": + commands.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + commands.extend(self._state_merged(w, have)) + elif state == "replaced": + commands.extend(self._state_replaced(w, have)) + return commands + + def _state_replaced(self, w, 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 = [] + name = w["name"] + obj_in_have = search_obj_in_list(name, have, "name") + if obj_in_have: + # If 'w' does not specify mode then intf may need to change to its + # default mode, however default mode may depend on sysdef. + if not w.get("mode") and re.search("Ethernet|port-channel", name): + sysdefs = self.intf_defs["sysdefs"] + sysdef_mode = sysdefs["mode"] + if obj_in_have.get("mode") != sysdef_mode: + w["mode"] = sysdef_mode + diff = dict_diff(w, obj_in_have) + else: + diff = w + + merged_commands = self.set_commands(w, have) + # merged_commands: + # - These commands are changes specified by the playbook. + # - merged_commands apply to both existing and new objects + # replaced_commands: + # - These are the unspecified commands, used to reset any params + # that are not already set to default states + # - replaced_commands should only be used on 'have' objects + # (interfaces that already exist) + if obj_in_have: + if "name" not in diff: + diff["name"] = name + wkeys = w.keys() + dkeys = diff.keys() + for k in wkeys: + if k in self.exclude_params and k in dkeys: + del diff[k] + replaced_commands = self.del_attribs(diff) + cmds = set(replaced_commands).intersection(set(merged_commands)) + for cmd in cmds: + merged_commands.remove(cmd) + commands.extend(replaced_commands) + + commands.extend(merged_commands) + return commands + + 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 + """ + # overridden is the same as replaced behavior except for the scope. + cmds = [] + existing_interfaces = [] + for h in have: + existing_interfaces.append(h["name"]) + obj_in_want = search_obj_in_list(h["name"], want, "name") + if obj_in_want: + if h != obj_in_want: + replaced_cmds = self._state_replaced(obj_in_want, [h]) + if replaced_cmds: + cmds.extend(replaced_cmds) + else: + cmds.extend(self.del_attribs(h)) + + for w in want: + if w["name"] not in existing_interfaces: + # This is an object that was excluded from the 'have' list + # because all of its params are currently set to default states + # -OR- it's a new object that does not exist on the device yet. + cmds.extend(self.add_commands(w)) + return cmds + + def _state_merged(self, w, 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(w, 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 want: + for w in want: + obj_in_have = search_obj_in_list(w["name"], have, "name") + commands.extend(self.del_attribs(obj_in_have)) + else: + if not have: + return commands + for h in have: + commands.extend(self.del_attribs(h)) + return commands + + def default_enabled(self, want=None, have=None, action=""): + # 'enabled' default state depends on the interface type and L2 state. + # Note that the current default could change when changing L2/L3 modes. + if self.state == "rendered": + # For "rendered", we always assume that + # the default enabled state is False + return False + if want is None: + want = {} + if have is None: + have = {} + name = have.get("name") + if name is None: + return None + + sysdefs = self.intf_defs["sysdefs"] + sysdef_mode = sysdefs["mode"] + + # Get the default enabled state for this interface. This was collected + # during Facts gathering. + intf_def_enabled = self.intf_defs.get(name) + + have_mode = have.get("mode", sysdef_mode) + if action == "delete" and not want: + want_mode = sysdef_mode + else: + want_mode = want.get("mode", have_mode) + if ( + (want_mode and have_mode) is None + or (want_mode != have_mode) + or intf_def_enabled is None + ): + # L2-L3 is changing or this is a new virtual intf. Get new default. + intf_def_enabled = default_intf_enabled( + name=name, sysdefs=sysdefs, mode=want_mode + ) + return intf_def_enabled + + def del_attribs(self, obj): + commands = [] + if not obj or len(obj.keys()) == 1: + return commands + # mode/switchport changes should occur before other changes + sysdef_mode = self.intf_defs["sysdefs"]["mode"] + if "mode" in obj and obj["mode"] != sysdef_mode: + no_cmd = "no " if sysdef_mode == "layer3" else "" + commands.append(no_cmd + "switchport") + if "description" in obj: + commands.append("no description") + if "speed" in obj: + commands.append("no speed") + if "duplex" in obj: + commands.append("no duplex") + if "enabled" in obj: + sysdef_enabled = self.default_enabled(have=obj, action="delete") + if obj["enabled"] is False and sysdef_enabled is True: + commands.append("no shutdown") + elif obj["enabled"] is True and sysdef_enabled is False: + commands.append("shutdown") + if "mtu" in obj: + commands.append("no mtu") + if "ip_forward" in obj and obj["ip_forward"] is True: + commands.append("no ip forward") + if ( + "fabric_forwarding_anycast_gateway" in obj + and obj["fabric_forwarding_anycast_gateway"] is True + ): + commands.append("no fabric forwarding mode anycast-gateway") + if commands: + commands.insert(0, "interface " + obj["name"]) + + return commands + + def diff_of_dicts(self, w, obj): + diff = set(w.items()) - set(obj.items()) + diff = dict(diff) + if diff and w["name"] == obj["name"]: + diff.update({"name": w["name"]}) + return diff + + def add_commands(self, d, obj_in_have=None): + commands = [] + if not d: + return commands + if obj_in_have is None: + obj_in_have = {} + # mode/switchport changes should occur before other changes + if "mode" in d: + sysdef_mode = self.intf_defs["sysdefs"]["mode"] + have_mode = obj_in_have.get("mode", sysdef_mode) + want_mode = d["mode"] + if have_mode == "layer2": + if want_mode == "layer3": + commands.append("no switchport") + elif want_mode == "layer2": + commands.append("switchport") + if "description" in d: + commands.append("description " + d["description"]) + if "speed" in d: + commands.append("speed " + str(d["speed"])) + if "duplex" in d: + commands.append("duplex " + d["duplex"]) + if "enabled" in d: + have_enabled = obj_in_have.get( + "enabled", self.default_enabled(d, obj_in_have) + ) + if d["enabled"] is False and have_enabled is True: + commands.append("shutdown") + elif d["enabled"] is True and have_enabled is False: + commands.append("no shutdown") + if "mtu" in d: + commands.append("mtu " + str(d["mtu"])) + if "ip_forward" in d: + if d["ip_forward"] is True: + commands.append("ip forward") + else: + commands.append("no ip forward") + if "fabric_forwarding_anycast_gateway" in d: + if d["fabric_forwarding_anycast_gateway"] is True: + commands.append("fabric forwarding mode anycast-gateway") + else: + commands.append("no fabric forwarding mode anycast-gateway") + if commands or not obj_in_have: + commands.insert(0, "interface" + " " + d["name"]) + return commands + + def set_commands(self, w, have): + commands = [] + obj_in_have = search_obj_in_list(w["name"], have, "name") + if not obj_in_have: + commands = self.add_commands(w) + else: + diff = self.diff_of_dicts(w, obj_in_have) + commands = self.add_commands(diff, obj_in_have) + return commands + + def render_interface_defaults(self, config, intfs): + """Collect user-defined-default states for 'system default switchport' + configurations. These configurations determine default L2/L3 modes + and enabled/shutdown states. The default values for user-defined-default + configurations may be different for legacy platforms. + Notes: + - L3 enabled default state is False on N9K,N7K but True for N3K,N6K + - Changing L2-L3 modes may change the default enabled value. + - '(no) system default switchport shutdown' only applies to L2 interfaces. + Run through the gathered interfaces and tag their default enabled state. + """ + intf_defs = {} + L3_enabled = ( + True if re.search("N[356]K", self.get_platform()) else False + ) + intf_defs = { + "sysdefs": { + "mode": None, + "L2_enabled": None, + "L3_enabled": L3_enabled, + } + } + pat = "(no )*system default switchport$" + m = re.search(pat, config, re.MULTILINE) + if m: + intf_defs["sysdefs"]["mode"] = ( + "layer3" if "no " in m.groups() else "layer2" + ) + + pat = "(no )*system default switchport shutdown$" + m = re.search(pat, config, re.MULTILINE) + if m: + intf_defs["sysdefs"]["L2_enabled"] = ( + True if "no " in m.groups() else False + ) + + for item in intfs: + intf_defs[item["name"]] = default_intf_enabled( + name=item["name"], + sysdefs=intf_defs["sysdefs"], + mode=item.get("mode"), + ) + + return intf_defs diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/l2_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/l2_interfaces.py new file mode 100644 index 00000000..9c947ba1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l2_interfaces/l2_interfaces.py @@ -0,0 +1,355 @@ +# +# -*- 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 nxos_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 ( + dict_diff, + to_list, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + normalize_interface, + search_obj_in_list, + vlan_range_to_list, +) + + +class L2_interfaces(ConfigBase): + """ + The nxos_l2_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["l2_interfaces"] + + exclude_params = ["vlan", "allowed_vlans", "native_vlans"] + + def __init__(self, module): + super(L2_interfaces, self).__init__(module) + + 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 + """ + config = self._module.params.get("config") + want = [] + if config: + for w in config: + w.update({"name": normalize_interface(w["name"])}) + self.expand_trunk_allowed_vlans(w) + want.append(remove_empties(w)) + have = existing_l2_interfaces_facts + for h in have: + self.expand_trunk_allowed_vlans(h) + resp = self.set_state(want, have) + return to_list(resp) + + def expand_trunk_allowed_vlans(self, d): + if not d: + return None + if "trunk" in d and d["trunk"]: + if "allowed_vlans" in d["trunk"]: + allowed_vlans = vlan_range_to_list(d["trunk"]["allowed_vlans"]) + vlans_list = [str(l) for l in sorted(allowed_vlans)] + d["trunk"]["allowed_vlans"] = ",".join(vlans_list) + + 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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + + commands = list() + if state == "overridden": + commands.extend(self._state_overridden(want, have)) + elif state == "deleted": + commands.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + commands.extend(self._state_merged(flatten_dict(w), have)) + elif state == "replaced": + commands.extend( + self._state_replaced(flatten_dict(w), have) + ) + return commands + + def _state_replaced(self, w, 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 = [] + obj_in_have = flatten_dict(search_obj_in_list(w["name"], have, "name")) + if obj_in_have: + diff = dict_diff(w, obj_in_have) + else: + diff = w + merged_commands = self.set_commands(w, have, True) + if "name" not in diff: + diff["name"] = w["name"] + + dkeys = diff.keys() + for k in w.copy(): + if k in self.exclude_params and k in dkeys: + del diff[k] + replaced_commands = self.del_attribs(diff) + + if merged_commands or replaced_commands: + cmds = set(replaced_commands).intersection(set(merged_commands)) + for cmd in cmds: + merged_commands.remove(cmd) + commands.extend(replaced_commands) + commands.extend(merged_commands) + return commands + + 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: + h = flatten_dict(h) + obj_in_want = flatten_dict( + search_obj_in_list(h["name"], want, "name") + ) + if h == obj_in_want: + continue + for w in want: + w = flatten_dict(w) + if h["name"] == w["name"]: + wkeys = w.keys() + hkeys = h.keys() + for k in wkeys: + if k in self.exclude_params and k in hkeys: + del h[k] + commands.extend(self.del_attribs(h)) + for w in want: + commands.extend(self.set_commands(flatten_dict(w), have, True)) + return commands + + def _state_merged(self, w, 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(w, 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 want: + for w in want: + obj_in_have = flatten_dict( + search_obj_in_list(w["name"], have, "name") + ) + commands.extend(self.del_attribs(obj_in_have)) + else: + if not have: + return commands + for h in have: + commands.extend(self.del_attribs(flatten_dict(h))) + return commands + + def del_attribs(self, obj): + commands = [] + if not obj or len(obj.keys()) == 1: + return commands + + cmd = "no switchport " + if "vlan" in obj: + commands.append(cmd + "access vlan") + if "mode" in obj: + commands.append(cmd + "mode") + if "allowed_vlans" in obj: + commands.append(cmd + "trunk allowed vlan") + if "native_vlan" in obj: + commands.append(cmd + "trunk native vlan") + if commands: + commands.insert(0, "interface " + obj["name"]) + return commands + + def diff_of_dicts(self, w, obj): + diff = set(w.items()) - set(obj.items()) + diff = dict(diff) + if diff and w["name"] == obj["name"]: + diff.update({"name": w["name"]}) + return diff + + def add_commands(self, d, vlan_exists=False): + commands = [] + if not d: + return commands + + cmd = "switchport " + if "mode" in d: + commands.append(cmd + "mode {0}".format(d["mode"])) + if "vlan" in d: + commands.append(cmd + "access vlan " + str(d["vlan"])) + if "allowed_vlans" in d: + if vlan_exists: + commands.append( + cmd + "trunk allowed vlan add " + str(d["allowed_vlans"]) + ) + else: + commands.append( + cmd + "trunk allowed vlan " + str(d["allowed_vlans"]) + ) + if "native_vlan" in d: + commands.append(cmd + "trunk native vlan " + str(d["native_vlan"])) + if commands: + commands.insert(0, "interface " + d["name"]) + return commands + + def set_commands(self, w, have, replace=False): + commands = [] + + obj_in_have = flatten_dict(search_obj_in_list(w["name"], have, "name")) + if not obj_in_have: + commands = self.add_commands(w) + else: + diff = self.diff_of_dicts(w, obj_in_have) + if diff and not replace: + if "mode" in diff.keys() and diff["mode"]: + commands = self.add_commands(diff) + if "allowed_vlans" in diff.keys() and diff["allowed_vlans"]: + vlan_tobe_added = diff["allowed_vlans"].split(",") + vlan_list = vlan_tobe_added[:] + if obj_in_have.get("allowed_vlans"): + have_vlans = obj_in_have["allowed_vlans"].split(",") + else: + have_vlans = [] + for w_vlans in vlan_list: + if w_vlans in have_vlans: + vlan_tobe_added.pop(vlan_tobe_added.index(w_vlans)) + if vlan_tobe_added: + diff.update( + {"allowed_vlans": ",".join(vlan_tobe_added)} + ) + if have_vlans: + commands = self.add_commands(diff, True) + else: + commands = self.add_commands(diff) + return commands + commands = self.add_commands(diff) + return commands diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/l3_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/l3_interfaces.py new file mode 100644 index 00000000..18c46e50 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/l3_interfaces/l3_interfaces.py @@ -0,0 +1,568 @@ +# +# -*- 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 nxos_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 + +import re + +from copy import deepcopy +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 ( + to_list, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + normalize_interface, + search_obj_in_list, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + remove_rsvd_interfaces, + get_interface_type, +) + + +class L3_interfaces(ConfigBase): + """ + The nxos_l3_interfaces class + """ + + gather_subset = ["min"] + + gather_network_resources = ["l3_interfaces"] + + exclude_params = [] + + def __init__(self, module): + super(L3_interfaces, self).__init__(module) + + def get_l3_interfaces_facts(self, data=None): + """ Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + if self.state not in self.ACTION_STATES: + self.gather_subset = ["!all", "!min"] + + 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" + ) + self.platform = facts.get("ansible_net_platform", "") + + return l3_interfaces_facts + + def edit_config(self, commands): + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = [] + warnings = [] + + 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.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 + """ + config = self._module.params.get("config") + want = [] + if config: + for w in config: + w.update({"name": normalize_interface(w["name"])}) + want.append(remove_empties(w)) + have = deepcopy(existing_l3_interfaces_facts) + self.init_check_existing(have) + 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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + + commands = [] + if state == "overridden": + commands.extend(self._state_overridden(want, have)) + elif state == "deleted": + commands.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + commands.extend(self._state_merged(w, have)) + elif state == "replaced": + commands.extend(self._state_replaced(w, have)) + return commands + + def _state_replaced(self, want, have): + """ The command generator when state is replaced + Scope is limited to interface objects defined in the playbook. + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + cmds = [] + name = want["name"] + obj_in_have = search_obj_in_list(want["name"], have, "name") + + have_v4 = obj_in_have.pop("ipv4", []) if obj_in_have else [] + have_v6 = obj_in_have.pop("ipv6", []) if obj_in_have else [] + + # Process lists of dicts separately + v4_cmds = self._v4_cmds( + want.pop("ipv4", []), have_v4, state="replaced" + ) + v6_cmds = self._v6_cmds( + want.pop("ipv6", []), have_v6, state="replaced" + ) + + # Process remaining attrs + if obj_in_have: + # Find 'want' changes first + diff = self.diff_of_dicts(want, obj_in_have) + rmv = {"name": name} + haves_not_in_want = ( + set(obj_in_have.keys()) - set(want.keys()) - set(diff.keys()) + ) + for i in haves_not_in_want: + rmv[i] = obj_in_have[i] + cmds.extend(self.generate_delete_commands(rmv)) + else: + diff = want + + cmds.extend(self.add_commands(diff, name=name)) + cmds.extend(v4_cmds) + cmds.extend(v6_cmds) + self.cmd_order_fixup(cmds, name) + return cmds + + def _state_overridden(self, want, have): + """ The command generator when state is overridden + Scope includes all interface objects on the device. + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + # overridden behavior is the same as replaced except for scope. + cmds = [] + for i in have: + obj_in_want = search_obj_in_list(i["name"], want, "name") + if obj_in_want: + if i != obj_in_want: + v4_cmds = self._v4_cmds( + obj_in_want.pop("ipv4", []), + i.pop("ipv4", []), + state="overridden", + ) + replaced_cmds = self._state_replaced(obj_in_want, [i]) + replaced_cmds.extend(v4_cmds) + self.cmd_order_fixup(replaced_cmds, obj_in_want["name"]) + cmds.extend(replaced_cmds) + else: + deleted_cmds = self.generate_delete_commands(i) + self.cmd_order_fixup(deleted_cmds, i["name"]) + cmds.extend(deleted_cmds) + + for i in want: + if [item for item in have if i["name"] == item["name"]]: + continue + cmds.extend(self.add_commands(i, name=i["name"])) + + return cmds + + def _state_merged(self, w, 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(w, have) + + def _v4_cmds(self, want, have, state=None): + """Helper method for processing ipv4 changes. + This is needed to handle primary/secondary address changes, which require a specific sequence when changing. + """ + # The ip address cli does not allow removing primary addresses while + # secondaries are present, but it does allow changing a primary to a + # new address as long as the address is not a current secondary. + # Be aware of scenarios where a secondary is taking over + # the role of the primary, which must be changed in sequence. + # In general, primaries/secondaries should change in this order: + # Step 1. Remove secondaries that are being changed or removed + # Step 2. Change the primary if needed + # Step 3. Merge secondaries + + # Normalize inputs (add tag key if not present) + for i in want: + i["tag"] = i.get("tag") + for i in have: + i["tag"] = i.get("tag") + + merged = True if state == "merged" else False + replaced = True if state == "replaced" else False + overridden = True if state == "overridden" else False + + # Create secondary and primary wants/haves + sec_w = [i for i in want if i.get("secondary")] + sec_h = [i for i in have if i.get("secondary")] + pri_w = [i for i in want if not i.get("secondary")] + pri_h = [i for i in have if not i.get("secondary")] + pri_w = pri_w[0] if pri_w else {} + pri_h = pri_h[0] if pri_h else {} + cmds = [] + + # Remove all addrs when no primary is specified in want (pri_w) + if pri_h and not pri_w and (replaced or overridden): + cmds.append("no ip address") + return cmds + + # 1. Determine which secondaries are changing and remove them. Need a have/want + # diff instead of want/have because a have sec addr may be changing to a pri. + sec_to_rmv = [] + sec_diff = self.diff_list_of_dicts(sec_h, sec_w) + for i in sec_diff: + if overridden or [ + w for w in sec_w if w["address"] == i["address"] + ]: + sec_to_rmv.append(i["address"]) + + # Check if new primary is currently a secondary + if pri_w and [h for h in sec_h if h["address"] == pri_w["address"]]: + if not overridden: + sec_to_rmv.append(pri_w["address"]) + + # Remove the changing secondaries + cmds.extend(["no ip address %s secondary" % i for i in sec_to_rmv]) + + # 2. change primary + if pri_w: + diff = dict(set(pri_w.items()) - set(pri_h.items())) + if diff: + addr = diff.get("address") or pri_w.get("address") + cmd = "ip address %s" % addr + tag = diff.get("tag") + cmd += " tag %s" % tag if tag else "" + cmds.append(cmd) + + # 3. process remaining secondaries last + sec_w_to_chg = self.diff_list_of_dicts(sec_w, sec_h) + for i in sec_w_to_chg: + cmd = "ip address %s secondary" % i["address"] + cmd += " tag %s" % i["tag"] if i["tag"] else "" + cmds.append(cmd) + + return cmds + + def _v6_cmds(self, want, have, state=""): + """Helper method for processing ipv6 changes. + This is needed to avoid unnecessary churn on the device when removing or changing multiple addresses. + """ + # Normalize inputs (add tag key if not present) + for i in want: + i["tag"] = i.get("tag") + for i in have: + i["tag"] = i.get("tag") + + cmds = [] + # items to remove (items in 'have' only) + if state == "replaced": + for i in self.diff_list_of_dicts(have, want): + want_addr = [w for w in want if w["address"] == i["address"]] + if not want_addr: + cmds.append("no ipv6 address %s" % i["address"]) + elif i["tag"] and not want_addr[0]["tag"]: + # Must remove entire cli when removing tag + cmds.append("no ipv6 address %s" % i["address"]) + + # items to merge/add + for i in self.diff_list_of_dicts(want, have): + addr = i["address"] + tag = i["tag"] + if not tag and state == "merged": + # When want is IP-no-tag and have is IP+tag it will show up in diff, + # but for merged nothing has changed, so ignore it for idempotence. + have_addr = [h for h in have if h["address"] == addr] + if have_addr and have_addr[0].get("tag"): + continue + cmd = "ipv6 address %s" % i["address"] + cmd += " tag %s" % tag if tag else "" + cmds.append(cmd) + + return cmds + + 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 want: + for w in want: + obj_in_have = search_obj_in_list(w["name"], have, "name") + commands.extend(self.del_all_attribs(obj_in_have)) + else: + if not have: + return commands + for h in have: + commands.extend(self.del_all_attribs(h)) + return commands + + def del_all_attribs(self, obj): + commands = [] + if not obj or len(obj.keys()) == 1: + return commands + commands = self.generate_delete_commands(obj) + self.cmd_order_fixup(commands, obj["name"]) + return commands + + def generate_delete_commands(self, obj): + """Generate CLI commands to remove non-default settings. + obj: dict of attrs to remove + """ + commands = [] + name = obj.get("name") + if "dot1q" in obj: + commands.append("no encapsulation dot1q") + if "redirects" in obj: + if not self.check_existing(name, "has_secondary") or re.match( + "N[3567]", self.platform + ): + # device auto-enables redirects when secondaries are removed; + # auto-enable may fail on legacy platforms so always do explicit enable + commands.append("ip redirects") + if "unreachables" in obj: + commands.append("no ip unreachables") + if "ipv4" in obj: + commands.append("no ip address") + if "ipv6" in obj: + commands.append("no ipv6 address") + if "evpn_multisite_tracking" in obj: + have = self.existing_facts.get(name, {}) + if have.get("evpn_multisite_tracking", False) is not False: + cmd = "no evpn multisite %s" % have.get( + "evpn_multisite_tracking" + ) + commands.append(cmd) + return commands + + def init_check_existing(self, have): + """Creates a class var dict for easier access to existing states + """ + self.existing_facts = dict() + have_copy = deepcopy(have) + for intf in have_copy: + name = intf["name"] + self.existing_facts[name] = intf + # Check for presence of secondaries; used for ip redirects logic + if [i for i in intf.get("ipv4", []) if i.get("secondary")]: + self.existing_facts[name]["has_secondary"] = True + + def check_existing(self, name, query): + """Helper method to lookup existing states on an interface. + This is needed for attribute changes that have additional dependencies; + e.g. 'ip redirects' may auto-enable when all secondary ip addrs are removed. + """ + if name: + have = self.existing_facts.get(name, {}) + if "has_secondary" in query: + return have.get("has_secondary", False) + if "redirects" in query: + return have.get("redirects", True) + if "unreachables" in query: + return have.get("unreachables", False) + return None + + def diff_of_dicts(self, w, obj): + diff = set(w.items()) - set(obj.items()) + diff = dict(diff) + if diff and w["name"] == obj["name"]: + diff.update({"name": w["name"]}) + return diff + + def diff_list_of_dicts(self, w, h): + diff = [] + set_w = set(tuple(sorted(d.items())) for d in w) if w else set() + set_h = set(tuple(sorted(d.items())) for d in h) if h else set() + difference = set_w.difference(set_h) + for element in difference: + diff.append(dict((x, y) for x, y in element)) + return diff + + def add_commands(self, diff, name=""): + commands = [] + if not diff: + return commands + if "dot1q" in diff: + commands.append("encapsulation dot1q " + str(diff["dot1q"])) + if "redirects" in diff: + # Note: device will auto-disable redirects when secondaries are present + if diff["redirects"] != self.check_existing(name, "redirects"): + no_cmd = "no " if diff["redirects"] is False else "" + commands.append(no_cmd + "ip redirects") + self.cmd_order_fixup(commands, name) + if "unreachables" in diff: + if diff["unreachables"] != self.check_existing( + name, "unreachables" + ): + no_cmd = "no " if diff["unreachables"] is False else "" + commands.append(no_cmd + "ip unreachables") + if "evpn_multisite_tracking" in diff: + commands.append( + "evpn multisite " + str(diff["evpn_multisite_tracking"]) + ) + if "ipv4" in diff: + commands.extend(self.generate_afi_commands(diff["ipv4"])) + if "ipv6" in diff: + commands.extend(self.generate_afi_commands(diff["ipv6"])) + self.cmd_order_fixup(commands, name) + + return commands + + def generate_afi_commands(self, diff): + cmds = [] + for i in diff: + cmd = ( + "ipv6 address " + if re.search("::", i["address"]) + else "ip address " + ) + cmd += i["address"] + if i.get("secondary"): + cmd += " secondary" + if i.get("tag"): + cmd += " tag " + str(i["tag"]) + cmds.append(cmd) + return cmds + + def set_commands(self, w, have): + commands = [] + name = w["name"] + obj_in_have = search_obj_in_list(name, have, "name") + if not obj_in_have: + commands = self.add_commands(w, name=name) + else: + # lists of dicts must be processed separately from non-list attrs + v4_cmds = self._v4_cmds( + w.pop("ipv4", []), obj_in_have.pop("ipv4", []), state="merged" + ) + v6_cmds = self._v6_cmds( + w.pop("ipv6", []), obj_in_have.pop("ipv6", []), state="merged" + ) + + # diff remaining attrs + diff = self.diff_of_dicts(w, obj_in_have) + commands = self.add_commands(diff, name=name) + commands.extend(v4_cmds) + commands.extend(v6_cmds) + + self.cmd_order_fixup(commands, name) + return commands + + def cmd_order_fixup(self, cmds, name): + """Inserts 'interface ' config at the beginning of populated command list; reorders dependent commands that must process after others. + """ + if cmds: + if name and not [ + item for item in cmds if item.startswith("interface") + ]: + cmds.insert(0, "interface " + name) + + redirects = [ + item for item in cmds if re.match("(no )*ip redirects", item) + ] + if redirects: + # redirects should occur after ipv4 commands, just move to end of list + redirects = redirects.pop() + cmds.remove(redirects) + cmds.append(redirects) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/lacp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/lacp.py new file mode 100644 index 00000000..84ead279 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp/lacp.py @@ -0,0 +1,234 @@ +# +# -*- 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 nxos_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, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) + + +class Lacp(ConfigBase): + """ + The nxos_lacp class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lacp"] + + exclude_params = ["priority", "mac"] + + def __init__(self, module): + super(Lacp, self).__init__(module) + + 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", {}) + + return lacp_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_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 = remove_empties(self._module.params["config"]) + 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 + ) + ) + + commands = list() + + if state == "deleted": + commands.extend(self._state_deleted(want, have)) + elif state in ["merged", "rendered"]: + commands.extend(self._state_merged(want, have)) + elif state == "replaced": + commands.extend(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 = [] + diff = dict_diff(want, have) + wkeys = want.keys() + dkeys = diff.keys() + for k in wkeys: + if k in self.exclude_params and k in dkeys: + del diff[k] + deleted_commands = self.del_all(diff) + merged_commands = self._state_merged(want, have) + + commands.extend(deleted_commands) + if merged_commands: + commands.extend(merged_commands) + + 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 = [] + if not have: + return commands + commands.extend(self.del_all(have)) + return commands + + def get_diff(self, comparable, base): + diff = {} + if not base: + diff = comparable + else: + diff = dict_diff(base, comparable) + return diff + + def del_all(self, diff): + commands = [] + base = "no lacp system-" + diff = diff.get("system") + if diff: + if "priority" in diff: + commands.append(base + "priority") + if "mac" in diff: + commands.append(base + "mac") + return commands + + def add_commands(self, diff): + commands = [] + base = "lacp system-" + diff = diff.get("system") + if diff and "priority" in diff: + cmd = base + "priority" + " " + str(diff["priority"]) + commands.append(cmd) + if diff and "mac" in diff: + cmd = "" + if "address" in diff["mac"]: + cmd += base + "mac" + " " + diff["mac"]["address"] + if "role" in diff["mac"]: + cmd += " " + "role" + " " + diff["mac"]["role"] + if cmd: + commands.append(cmd) + + return commands + + def set_commands(self, want, have): + if not want: + return [] + diff = self.get_diff(want, have) + return self.add_commands(diff) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/lacp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/lacp_interfaces.py new file mode 100644 index 00000000..d2518c29 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lacp_interfaces/lacp_interfaces.py @@ -0,0 +1,336 @@ +# +# -*- 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 nxos_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 ( + to_list, + dict_diff, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + search_obj_in_list, + get_interface_type, + normalize_interface, +) + + +class Lacp_interfaces(ConfigBase): + """ + The nxos_lacp_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lacp_interfaces"] + + exclude_params = ["port_priority", "rate", "min", "max"] + + def __init__(self, module): + super(Lacp_interfaces, self).__init__(module) + + 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} + commands = list() + warnings = 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 + """ + config = self._module.params.get("config") + want = [] + if config: + for w in config: + if get_interface_type(w["name"]) not in ( + "portchannel", + "ethernet", + ): + self._module.fail_json( + msg="This module works with either portchannel or ethernet" + ) + w.update({"name": normalize_interface(w["name"])}) + want.append(remove_empties(w)) + 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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + commands = list() + + if state == "overridden": + commands.extend(self._state_overridden(want, have)) + elif state == "deleted": + commands.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + commands.extend(self._state_merged(flatten_dict(w), have)) + elif state == "replaced": + commands.extend( + self._state_replaced(flatten_dict(w), have) + ) + return commands + + def _state_replaced(self, w, 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 = [] + obj_in_have = flatten_dict(search_obj_in_list(w["name"], have, "name")) + diff = dict_diff(w, obj_in_have) + merged_commands = self.set_commands(w, have) + if "name" not in diff: + diff["name"] = w["name"] + wkeys = w.keys() + dkeys = diff.keys() + for k in wkeys: + if k in self.exclude_params and k in dkeys: + del diff[k] + replaced_commands = self.del_attribs(diff) + + if merged_commands: + cmds = set(replaced_commands).intersection(set(merged_commands)) + for cmd in cmds: + merged_commands.remove(cmd) + commands.extend(replaced_commands) + commands.extend(merged_commands) + return commands + + 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: + h = flatten_dict(h) + obj_in_want = flatten_dict( + search_obj_in_list(h["name"], want, "name") + ) + if h == obj_in_want: + continue + for w in want: + w = flatten_dict(w) + if h["name"] == w["name"]: + wkeys = w.keys() + hkeys = h.keys() + for k in wkeys: + if k in self.exclude_params and k in hkeys: + del h[k] + commands.extend(self.del_attribs(h)) + for w in want: + commands.extend(self.set_commands(flatten_dict(w), have)) + return commands + + def _state_merged(self, w, 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(w, 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 want: + for w in want: + obj_in_have = flatten_dict( + search_obj_in_list(w["name"], have, "name") + ) + commands.extend(self.del_attribs(obj_in_have)) + else: + if not have: + return commands + for h in have: + commands.extend(self.del_attribs(flatten_dict(h))) + return commands + + def del_attribs(self, obj): + commands = [] + if not obj or len(obj.keys()) == 1: + return commands + commands.append("interface " + obj["name"]) + if "graceful" in obj: + commands.append("lacp graceful-convergence") + if "vpc" in obj: + commands.append("no lacp vpn-convergence") + if "suspend_individual" in obj: + commands.append("lacp suspend_individual") + if "mode" in obj: + commands.append("no lacp mode " + obj["mode"]) + if "max" in obj: + commands.append("no lacp max-bundle") + if "min" in obj: + commands.append("no lacp min-links") + if "port_priority" in obj: + commands.append("no lacp port-priority") + if "rate" in obj: + commands.append("no lacp rate") + return commands + + def diff_of_dicts(self, w, obj): + diff = set(w.items()) - set(obj.items()) + diff = dict(diff) + if diff and w["name"] == obj["name"]: + diff.update({"name": w["name"]}) + return diff + + def add_commands(self, d): + commands = [] + if not d: + return commands + commands.append("interface" + " " + d["name"]) + + if "port_priority" in d: + commands.append("lacp port-priority " + str(d["port_priority"])) + if "rate" in d: + commands.append("lacp rate " + str(d["rate"])) + if "min" in d: + commands.append("lacp min-links " + str(d["min"])) + if "max" in d: + commands.append("lacp max-bundle " + str(d["max"])) + if "mode" in d: + commands.append("lacp mode " + d["mode"]) + if "suspend_individual" in d: + if d["suspend_individual"] is True: + commands.append("lacp suspend-individual") + else: + commands.append("no lacp suspend-individual") + if "graceful" in d: + if d["graceful"] is True: + commands.append("lacp graceful-convergence") + else: + commands.append("no lacp graceful-convergence") + if "vpc" in d: + if d["vpc"] is True: + commands.append("lacp vpc-convergence") + else: + commands.append("no lacp vpc-convergence") + return commands + + def set_commands(self, w, have): + commands = [] + obj_in_have = flatten_dict(search_obj_in_list(w["name"], have, "name")) + if not obj_in_have: + commands = self.add_commands(w) + else: + diff = self.diff_of_dicts(w, obj_in_have) + commands = self.add_commands(diff) + return commands diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/lag_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/lag_interfaces.py new file mode 100644 index 00000000..c0808113 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lag_interfaces/lag_interfaces.py @@ -0,0 +1,335 @@ +# +# -*- 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 nxos_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 + +__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 ( + to_list, + remove_empties, + dict_diff, + search_obj_in_list, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + normalize_interface, +) + + +class Lag_interfaces(ConfigBase): + """ + The nxos_lag_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lag_interfaces"] + + def __init__(self, module): + super(Lag_interfaces, self).__init__(module) + + 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: + resp = self._connection.edit_config(commands) + if "response" in resp: + for item in resp["response"]: + if item: + err_str = item + if err_str.lower().startswith("cannot add"): + self._module.fail_json(msg=err_str) + 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.get("config") + if want: + for w in want: + w.update(remove_empties(w)) + if "members" in w and w["members"]: + for item in w["members"]: + item.update( + {"member": normalize_interface(item["member"])} + ) + 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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + commands = list() + + if state == "overridden": + commands.extend(self._state_overridden(want, have)) + elif state == "deleted": + commands.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + commands.extend(self._state_merged(w, have)) + if state == "replaced": + commands.extend(self._state_replaced(w, have)) + return commands + + def _state_replaced(self, w, 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 = [] + merged_commands = self.set_commands(w, have) + replaced_commands = self.del_intf_commands(w, have) + if merged_commands: + commands.extend(replaced_commands) + commands.extend(merged_commands) + return commands + + 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: + obj_in_want = search_obj_in_list(h["name"], want, "name") + if obj_in_want: + diff = self.diff_list_of_dicts( + h["members"], obj_in_want["members"] + ) + if not diff: + continue + commands.extend(self.del_all_commands(h)) + for w in want: + commands.extend(self.set_commands(w, have)) + return commands + + def _state_merged(self, w, 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(w, 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 want: + for w in want: + obj_in_have = search_obj_in_list(w["name"], have, "name") + commands.extend(self.del_all_commands(obj_in_have)) + else: + if not have: + return commands + for h in have: + commands.extend(self.del_all_commands(h)) + return commands + + def diff_list_of_dicts(self, want, have): + if not want: + want = [] + + if not have: + have = [] + + diff = [] + for w_item in want: + h_item = ( + search_obj_in_list(w_item["member"], have, key="member") or {} + ) + delta = dict_diff(h_item, w_item) + if delta: + if h_item: + if ( + "mode" in delta.keys() + and delta["mode"] == "on" + and "mode" not in h_item.keys() + ): + # mode = on will not be displayed in running-config + continue + if "member" not in delta.keys(): + delta["member"] = w_item["member"] + diff.append(delta) + + return diff + + def intersect_list_of_dicts(self, w, h): + intersect = [] + wmem = [] + hmem = [] + for d in w: + wmem.append({"member": d["member"]}) + for d in h: + hmem.append({"member": d["member"]}) + set_w = set(tuple(sorted(d.items())) for d in wmem) + set_h = set(tuple(sorted(d.items())) for d in hmem) + intersection = set_w.intersection(set_h) + for element in intersection: + intersect.append(dict((x, y) for x, y in element)) + return intersect + + def add_commands(self, diff, name): + commands = [] + name = name.strip("port-channel") + for d in diff: + commands.append("interface" + " " + d["member"]) + cmd = "" + group_cmd = "channel-group {0}".format(name) + if d.get("force"): + cmd = group_cmd + " force " + if "mode" in d: + if cmd: + cmd = cmd + " mode " + d["mode"] + else: + cmd = group_cmd + " mode " + d["mode"] + if not cmd: + cmd = group_cmd + commands.append(cmd) + return commands + + def set_commands(self, w, have): + commands = [] + obj_in_have = search_obj_in_list(w["name"], have, "name") + if not obj_in_have: + commands = self.add_commands(w["members"], w["name"]) + else: + if "members" not in obj_in_have: + obj_in_have["members"] = None + diff = self.diff_list_of_dicts( + w["members"], obj_in_have["members"] + ) + commands = self.add_commands(diff, w["name"]) + return commands + + def del_all_commands(self, obj_in_have): + commands = [] + if not obj_in_have: + return commands + for m in obj_in_have.get("members", []): + commands.append("interface" + " " + m["member"]) + commands.append("no channel-group") + return commands + + def del_intf_commands(self, w, have): + commands = [] + obj_in_have = search_obj_in_list(w["name"], have, "name") + if obj_in_have: + lst_to_del = self.intersect_list_of_dicts( + w["members"], obj_in_have["members"] + ) + if lst_to_del: + for item in lst_to_del: + commands.append("interface" + " " + item["member"]) + commands.append("no channel-group") + return commands diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/lldp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/lldp_global.py new file mode 100644 index 00000000..95b5f531 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_global/lldp_global.py @@ -0,0 +1,285 @@ +# +# -*- 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 nxos_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 ( + remove_empties, + dict_diff, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) + + +class Lldp_global(ConfigBase): + """ + The nxos_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} + commands = list() + warnings = 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"] + have = existing_lldp_global_facts + resp = self.set_state(remove_empties(want), have) + return 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 + ) + ) + commands = list() + + if state == "deleted": + commands = self._state_deleted(have) + elif state in ["merged", "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 = [] + merge_dict = dict_diff(have, want) + # merge_dict will contain new and unique values in want + delete_dict = self.find_delete_params(have, want) + self._module.params["state"] = "deleted" + commands.extend(self._state_deleted(delete_dict)) # delete + self._module.params["state"] = "merged" + commands.extend(self.set_commands(merge_dict)) # merge + self._module.params["state"] = "replaced" + return commands + + def delete_nested_dict(self, have, want): + """ + Returns tlv_select nested dict that needs to be defaulted + """ + outer_dict = {} + for key, val in have.items(): + inner_dict = {} + if not isinstance(val, dict): + if key not in want.keys(): + inner_dict.update({key: val}) + return inner_dict + else: + if key in want.keys(): + outer_dict.update( + {key: self.delete_nested_dict(val, want[key])} + ) + else: + outer_dict.update({key: val}) + return outer_dict + + def find_delete_params(self, have, want): + """ + Returns parameters that are present in have and not in want, that need to be defaulted + """ + delete_dict = {} + for key, val in have.items(): + if key not in want.keys(): + delete_dict.update({key: val}) + else: + if key == "tlv_select": + delete_dict.update( + { + key: self.delete_nested_dict( + have["tlv_select"], want["tlv_select"] + ) + } + ) + return delete_dict + + 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 + """ + commands = [] + diff = dict_diff(have, want) + commands.extend(self.set_commands(diff)) + return commands + + def _state_deleted(self, 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 have: + for key, val in have.items(): + if "tlv_select" in key: + commands.extend(self.process_nested_dict(val)) + else: + if key == "port_id": + key = "portid-subtype" + commands.append("no lldp " + key + " " + str(val)) + + return commands + + def set_commands(self, diff): + commands = [] + for key, val in diff.items(): + commands.extend(self.add_commands(key, val)) + return commands + + def add_commands(self, key, val): + command = [] + if "port_id" in key: + command.append("lldp portid-subtype " + str(val)) + elif "tlv_select" in key: + command.extend(self.process_nested_dict(val)) + else: + if val: + command.append("lldp " + key + " " + str(val)) + return command + + def process_nested_dict(self, val): + nested_commands = [] + for k, v in val.items(): + if isinstance(v, dict): + for k1, v1 in v.items(): + com1 = "lldp tlv-select " + com2 = "" + if "system" in k: + com2 = "system-" + k1 + elif "management_address" in k: + com2 = "management-address " + k1 + elif "port" in k: + com2 = "port-" + k1 + + com1 += com2 + com1 = self.negate_command(com1, v1) + nested_commands.append(com1) + else: + com1 = "lldp tlv-select " + if "power_management" in k: + com1 += "power-management" + else: + com1 += k + + com1 = self.negate_command(com1, v) + nested_commands.append(com1) + return nested_commands + + def negate_command(self, command, val): + # for merged, replaced vals need to be checked to add 'no' + if self._module.params["state"] == "merged": + if not val: + command = "no " + command + return command diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/lldp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/lldp_interfaces.py new file mode 100644 index 00000000..7bc2db0c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/lldp_interfaces/lldp_interfaces.py @@ -0,0 +1,325 @@ +# +# -*- 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 nxos_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 ( + to_list, + remove_empties, + dict_diff, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + search_obj_in_list, + get_interface_type, + normalize_interface, +) + + +class Lldp_interfaces(ConfigBase): + """ + The nxos_lldp_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lldp_interfaces"] + + def __init__(self, module): + super(Lldp_interfaces, self).__init__(module) + + 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 edit_config(self, commands): + """Wrapper method for `_connection.edit_config()` + This exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = list() + warnings = list() + state = self._module.params["state"] + action_states = ["merged", "replaced", "deleted", "overridden"] + + if state == "gathered": + result["gathered"] = self.get_lldp_interfaces_facts() + elif state == "rendered": + result["rendered"] = self.set_config({}) + elif state == "parsed": + result["parsed"] = self.set_config({}) + else: + existing_lldp_interfaces_facts = self.get_lldp_interfaces_facts() + commands.extend(self.set_config(existing_lldp_interfaces_facts)) + if commands and state in action_states: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + result["before"] = existing_lldp_interfaces_facts + result["commands"] = commands + result["commands"] = commands + + changed_lldp_interfaces_facts = self.get_lldp_interfaces_facts() + + if result["changed"]: + result["after"] = 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 + """ + config = self._module.params["config"] + want = [] + if config: + for w in config: + if get_interface_type(w["name"]) not in ( + "management", + "ethernet", + ): + self._module.fail_json( + msg="This module works with either management or ethernet" + ) + w.update({"name": normalize_interface(w["name"])}) + want.append(remove_empties(w)) + 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 + """ + commands = [] + 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 == "rendered": + commands = self._state_rendered(want) + elif state == "parsed": + want = self._module.params["running_config"] + commands = self._state_parsed(want) + else: + for w in want: + if state == "merged": + commands.extend(self._state_merged(flatten_dict(w), have)) + elif state == "replaced": + commands.extend( + self._state_replaced(flatten_dict(w), have) + ) + return commands + + def _state_parsed(self, want): + return self.get_lldp_interfaces_facts(want) + + def _state_rendered(self, want): + commands = [] + for w in want: + commands.extend(self.set_commands(w, {})) + return commands + + def _state_gathered(self, have): + """ The command generator when state is gathered + + :rtype: A list + :returns: the commands necessary to reproduce the current configuration + """ + commands = [] + want = {} + commands.append(self.set_commands(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 = [] + del_commands = [] + delete_dict = {} + obj_in_have = flatten_dict( + search_obj_in_list(want["name"], have, "name") + ) + for k1 in obj_in_have.keys(): + if k1 not in want.keys(): + delete_dict.update({k1: obj_in_have[k1]}) + + if delete_dict: + delete_dict.update({"name": want["name"]}) + del_commands = self.del_commands(delete_dict) + merged_commands = self.set_commands(want, have) + + if merged_commands: + cmds = set(del_commands).intersection(set(merged_commands)) + for cmd in cmds: + merged_commands.remove(cmd) + + commands.extend(del_commands) + commands.extend(merged_commands) + return commands + + 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 = [] + want_intfs = [w["name"] for w in want] + for h in have: + h = flatten_dict(h) + delete_dict = {} + if h["name"] in want_intfs: + for w in want: + if w["name"] == h["name"]: + delete_keys = list(set(h) - set(flatten_dict(w))) + for k in delete_keys: + delete_dict.update({k: h[k]}) + delete_dict.update({"name": h["name"]}) + break + else: + delete_dict.update(h) + commands.extend(self.del_commands(delete_dict)) + for w in want: + commands.extend(self.set_commands(flatten_dict(w), have)) + 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 = [] + if want: + for w in want: + obj_in_have = flatten_dict( + search_obj_in_list(w["name"], have, "name") + ) + commands.extend(self.del_commands(obj_in_have)) + else: + if not have: + return commands + for h in have: + commands.extend(self.del_commands(flatten_dict(h))) + return commands + + def set_commands(self, want, have): + commands = [] + obj_in_have = flatten_dict( + search_obj_in_list(want["name"], have, "name") + ) + if not obj_in_have: + commands = self.add_commands(flatten_dict(want)) + else: + diff = dict_diff(obj_in_have, want) + if diff: + diff.update({"name": want["name"]}) + commands = self.add_commands(diff) + return commands + + def add_commands(self, d): + commands = [] + if not d: + return commands + commands.append("interface " + d["name"]) + if "transmit" in d: + if d["transmit"]: + commands.append("lldp transmit") + else: + commands.append("no lldp transmit") + if "receive" in d: + if d["receive"]: + commands.append("lldp receive") + else: + commands.append("no lldp receive") + if "management_address" in d: + commands.append( + "lldp tlv-set management-address " + d["management_address"] + ) + if "vlan" in d: + commands.append("lldp tlv-set vlan " + str(d["vlan"])) + + return commands + + def del_commands(self, obj): + commands = [] + if not obj or len(obj.keys()) == 1: + return commands + commands.append("interface " + obj["name"]) + if "transmit" in obj: + commands.append("lldp transmit") + if "receive" in obj: + commands.append("lldp receive") + if "management_address" in obj: + commands.append( + "no lldp tlv-set management-address " + + obj["management_address"] + ) + if "vlan" in obj: + commands.append("no lldp tlv-set vlan " + str(obj["vlan"])) + + return commands diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/ospf_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/ospf_interfaces.py new file mode 100644 index 00000000..10fd6a54 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospf_interfaces/ospf_interfaces.py @@ -0,0 +1,206 @@ +# +# -*- 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 nxos_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 copy import deepcopy + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module import ( + ResourceModule, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.ospf_interfaces import ( + Ospf_interfacesTemplate, +) + + +class Ospf_interfaces(ResourceModule): + """ + The nxos_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 = [ + "authentication", + "authentication_key", + "message_digest_key", + "cost", + "dead_interval", + "hello_interval", + "instance", + "mtu_ignore", + "network", + "passive_interface", + "priority", + "retransmit_interval", + "shutdown", + "transmit_delay", + ] + + 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 = {entry["name"]: entry for entry in self.want} + haved = {entry["name"]: entry for entry in self.have} + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._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 = {} + + # 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 Ospf_interfaces network resource. + """ + begin = len(self.commands) + self._compare_ospf_interfaces(want, have) + if len(self.commands) != begin: + self.commands.insert( + begin, self._tmplt.render(want or have, "interface", False) + ) + + def _compare_ospf_interfaces(self, want, have): + waf = want.get("address_family", {}) + haf = have.get("address_family", {}) + + for afi in ("ipv4", "ipv6"): + witem = waf.pop(afi, {}) + hitem = haf.pop(afi, {}) + + # this key needs to be compared separately and + # popped from `authentication` dict to + # preserve idempotence for other keys in this dict + self.compare(["authentication.key_chain"], want=witem, have=hitem) + witem.get("authentication", {}).pop("key_chain", None) + hitem.get("authentication", {}).pop("key_chain", None) + + self.compare(parsers=self.parsers, want=witem, have=hitem) + + # compare top-level `multi_areas` config + for area in witem.get("multi_areas", []): + if area not in hitem.get("multi_areas", []): + self.addcmd( + {"afi": afi, "area": area}, "multi_areas", negate=False + ) + # remove superfluous top-level `multi_areas` config + for area in hitem.get("multi_areas", []): + if area not in witem.get("multi_areas", []): + self.addcmd( + {"afi": afi, "area": area}, "multi_areas", negate=True + ) + + # compare config->address_family->processes + self._compare_processes( + afi, witem.get("processes", {}), hitem.get("processes", {}) + ) + + def _compare_processes(self, afi, want, have): + # add and update config->address_family->processes + + for w_id, wproc in want.items(): + hproc = have.pop(w_id, {}) + hproc["afi"] = wproc["afi"] = afi + + # compare config->address_family->processes->area + self.compare(["area"], wproc, hproc) + + # compare config->address_family->processes->multi_areas + marea_dict = {"afi": afi, "process_id": wproc["process_id"]} + for area in wproc.get("multi_areas", []): + if area not in hproc.get("multi_areas", []): + marea_dict["area"] = area + self.addcmd( + marea_dict, "processes_multi_areas", negate=False + ) + # remove superfluous processes->multi_areas config + for area in hproc.get("multi_areas", []): + if area not in wproc.get("multi_areas", []): + marea_dict["area"] = area + self.addcmd( + marea_dict, "processes_multi_areas", negate=True + ) + + # remove superflous config->address_family->processes + for hproc in have.values(): + hproc["afi"] = afi + + # remove config->address_family->processes->area + self.addcmd(hproc, "area", negate=True) + + # remove superfluous processes->multi_areas config + marea_dict = {"afi": afi, "process_id": hproc["process_id"]} + for area in hproc.get("multi_areas", []): + marea_dict["area"] = area + self.addcmd(marea_dict, "processes_multi_areas", negate=True) + + def _list_to_dict(self, entry): + for item in entry.values(): + for ag in item.get("address_family", []): + ag["processes"] = { + subentry["process_id"]: subentry + for subentry in ag.get("processes", []) + } + item["address_family"] = { + subentry["afi"]: subentry + for subentry in item.get("address_family", []) + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/ospfv2.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/ospfv2.py new file mode 100644 index 00000000..6338317e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv2/ospfv2.py @@ -0,0 +1,238 @@ +# -*- 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 nxos_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 copy import deepcopy +from ansible.module_utils.six import iteritems +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.ospfv2 import ( + Ospfv2Template, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + get_from_dict, +) + + +class Ospfv2(ResourceModule): + """ + The nxos_ospfv2 class + """ + + def __init__(self, module): + super(Ospfv2, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="ospfv2", + tmplt=Ospfv2Template(), + ) + self.parsers = [ + "router_id", + "auto_cost", + "graceful_restart.set", + "graceful_restart.helper_disable", + "isolate", + "log_adjacency_changes", + "max_lsa", + "mpls.traffic_eng.router_id", + "mpls.traffic_eng.multicast_intact", + "name_lookup", + "passive_interface.default", + "rfc1583compatibility", + "shutdown", + "default_information.originate", + "default_metric", + "distance", + "table_map", + "timers.lsa_arrival", + "timers.lsa_group_pacing", + "timers.throttle.lsa", + "timers.throttle.spf", + "maximum_paths", + "max_metric", + "down_bit_ignore", + "capability.vrf_lite", + "bfd", + ] + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.gen_config() + self.run_commands() + return self.result + + def gen_config(self): + """ Select the appropriate function based on the state provided + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + wantd = { + (entry["process_id"]): entry + for entry in self.want.get("processes", []) + } + haved = { + (entry["process_id"]): entry + for entry in self.have.get("processes", []) + } + + # 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": + haved = { + k: v for k, v in iteritems(haved) if k in wantd or not wantd + } + wantd = {} + + # if state is overridden, first remove processes that are in have but not in want + if self.state in ["overridden", "deleted"]: + for k, have in iteritems(haved): + if k not in wantd: + self.addcmd(have, "process_id", True) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + begin = len(self.commands) + self.compare(self.parsers, want=want, have=have) + self._compare_lists(want=want, have=have) + self._areas_compare(want=want, have=have) + self._vrfs_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" + if "vrf" in (want.keys() or have.keys()) + else "process_id", + False, + ), + ) + + 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.authentication", + "area.nssa", + "area.nssa.translate", + "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 ["filter_list", "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 [ + "summary_address", + "redistribute", + "mpls.traffic_eng.areas", + ]: + 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 _vrfs_compare(self, want, have): + wvrfs = want.get("vrfs", {}) + hvrfs = have.get("vrfs", {}) + for name, entry in iteritems(wvrfs): + self._compare(want=entry, have=hvrfs.pop(name, {})) + # remove remaining items in have for replaced + for name, entry in iteritems(hvrfs): + self.addcmd(entry, "vrf", True) + + def _ospf_list_to_dict(self, entry): + for _pid, proc in iteritems(entry): + for area in proc.get("areas", []): + area["ranges"] = { + entry["prefix"]: entry for entry in area.get("ranges", []) + } + area["filter_list"] = { + entry["direction"]: entry + for entry in area.get("filter_list", []) + } + mpls_areas = { + entry["area_id"]: entry + for entry in proc.get("mpls", {}) + .get("traffic_eng", {}) + .get("areas", []) + } + if mpls_areas: + proc["mpls"]["traffic_eng"]["areas"] = mpls_areas + proc["areas"] = { + entry["area_id"]: entry for entry in proc.get("areas", []) + } + proc["summary_address"] = { + entry["prefix"]: entry + for entry in proc.get("summary_address", []) + } + proc["redistribute"] = { + (entry.get("id"), entry["protocol"]): entry + for entry in proc.get("redistribute", []) + } + if "vrfs" in proc: + proc["vrfs"] = { + entry["vrf"]: entry for entry in proc.get("vrfs", []) + } + self._ospf_list_to_dict(proc["vrfs"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/ospfv3.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/ospfv3.py new file mode 100644 index 00000000..648332b9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/ospfv3/ospfv3.py @@ -0,0 +1,253 @@ +# +# -*- 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 nxos_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. +""" + +from copy import deepcopy + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, + get_from_dict, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module import ( + ResourceModule, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.ospfv3 import ( + Ospfv3Template, +) + + +class Ospfv3(ResourceModule): + """ + The nxos_ospfv3 config class + """ + + def __init__(self, module): + super(Ospfv3, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="ospfv3", + tmplt=Ospfv3Template(), + ) + self.parsers = [ + "auto_cost", + "flush_routes", + "graceful_restart.set", + "graceful_restart.helper_disable", + "graceful_restart.grace_period", + "graceful_restart.planned_only", + "isolate", + "log_adjacency_changes", + "max_lsa", + "max_metric", + "name_lookup", + "passive_interface.default", + "router_id", + "shutdown", + "timers.lsa_arrival", + "timers.lsa_group_pacing", + "timers.throttle.lsa", + ] + + 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 = { + (entry["process_id"]): entry + for entry in self.want.get("processes", []) + } + haved = { + (entry["process_id"]): entry + for entry in self.have.get("processes", []) + } + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._ospfv3_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 overridden, first remove processes that are in have but not in want + if self.state in ["overridden", "deleted"]: + for k, have in iteritems(haved): + if k not in wantd: + self.addcmd(have, "process_id", 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.compare(parsers=self.parsers, want=want, have=have) + self._areas_compare(want=want, have=have) + self._vrfs_compare(want=want, have=have) + self._af_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" + if "vrf" in (want.keys() or have.keys()) + else "process_id", + False, + ), + ) + + 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.nssa", "area.nssa.translate", "area.stub"] + self.compare(parsers=parsers, want=want, have=have) + + def _vrfs_compare(self, want, have): + wvrfs = want.get("vrfs", {}) + hvrfs = have.get("vrfs", {}) + for name, entry in iteritems(wvrfs): + self._compare(want=entry, have=hvrfs.pop(name, {})) + # remove remaining items in have for replaced + for name, entry in iteritems(hvrfs): + self.addcmd(entry, "vrf", True) + + def _af_compare(self, want, have): + parsers = [ + "default_information.originate", + "distance", + "maximum_paths", + "table_map", + "timers.throttle.spf", + ] + waf = want.get("address_family", {}) + haf = have.get("address_family", {}) + + cmd_ptr = len(self.commands) + + self._af_areas_compare(want=waf, have=haf) + self._af_compare_lists(want=waf, have=haf) + self.compare(parsers=parsers, want=waf, have=haf) + + cmd_ptr_nxt = len(self.commands) + if cmd_ptr < cmd_ptr_nxt: + self.commands.insert(cmd_ptr, "address-family ipv6 unicast") + + def _af_areas_compare(self, want, have): + wareas = want.get("areas", {}) + hareas = have.get("areas", {}) + for name, entry in iteritems(wareas): + self._af_area_compare(want=entry, have=hareas.pop(name, {})) + for name, entry in iteritems(hareas): + self._af_area_compare(want={}, have=entry) + + def _af_area_compare(self, want, have): + self.compare(parsers=["area.default_cost"], want=want, have=have) + self._af_area_compare_lists(want=want, have=have) + + def _af_area_compare_lists(self, want, have): + for attrib in ["filter_list", "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 _af_compare_lists(self, want, have): + for attrib in ["summary_address", "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 _ospfv3_list_to_dict(self, entry): + for _pid, proc in iteritems(entry): + proc["areas"] = { + entry["area_id"]: entry for entry in proc.get("areas", []) + } + af = proc.get("address_family") + if af: + for area in af.get("areas", []): + area["ranges"] = { + entry["prefix"]: entry + for entry in area.get("ranges", []) + } + area["filter_list"] = { + entry["direction"]: entry + for entry in area.get("filter_list", []) + } + af["areas"] = { + entry["area_id"]: entry for entry in af.get("areas", []) + } + af["summary_address"] = { + entry["prefix"]: entry + for entry in af.get("summary_address", []) + } + af["redistribute"] = { + (entry.get("id"), entry["protocol"]): entry + for entry in af.get("redistribute", []) + } + if "vrfs" in proc: + proc["vrfs"] = { + entry["vrf"]: entry for entry in proc.get("vrfs", []) + } + self._ospfv3_list_to_dict(proc["vrfs"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/static_routes.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/static_routes.py new file mode 100644 index 00000000..a28b5699 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/static_routes/static_routes.py @@ -0,0 +1,616 @@ +# +# -*- 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 nxos_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 + +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 ( + to_list, + remove_empties, + dict_diff, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from copy import deepcopy +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + flatten_dict, + search_obj_in_list, + get_interface_type, + normalize_interface, +) + + +class Static_routes(ConfigBase): + """ + The nxos_xstatic_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 edit_config(self, commands): + """Wrapper method for `_connection.edit_config()` + This exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + state = self._module.params["state"] + action_states = ["merged", "replaced", "deleted", "overridden"] + + if state == "gathered": + result["gathered"] = self.get_static_routes_facts() + elif state == "rendered": + result["rendered"] = self.set_config({}) + # no need to fetch facts for rendered + elif state == "parsed": + result["parsed"] = self.set_config({}) + # no need to fetch facts for parsed + else: + existing_static_routes_facts = self.get_static_routes_facts() + commands.extend(self.set_config(existing_static_routes_facts)) + if commands and state in action_states: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + result["before"] = existing_static_routes_facts + result["commands"] = commands + + changed_static_routes_facts = self.get_static_routes_facts() + if result["changed"]: + result["after"] = 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 + """ + config = self._module.params["config"] + want = [] + if config: + for w in config: + want.append(remove_empties(w)) + have = existing_static_routes_facts + want = self.add_default_vrf(deepcopy(want)) + have = self.add_default_vrf(deepcopy(have)) + 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"] + commands = [] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "rendered": + commands = self._state_rendered(want, have=[]) + elif state == "parsed": + want = self._module.params["running_config"] + commands = self._state_parsed(want) + else: + for w in want: + if state == "merged": + commands.extend(self._state_merged(w, have)) + elif state == "replaced": + commands.extend(self._state_replaced(w, have)) + return commands + + def _state_parsed(self, want): + return self.get_static_routes_facts(want) + + def _state_rendered(self, want, have): + commands = [] + for w in want: + commands.extend(self.set_commands(w, {})) + 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 = [] + delete_commands = [] + state = self._module.params["state"] + merged_commands = [] + obj_in_have = search_obj_in_list(want["vrf"], have, "vrf") + # in replaced, we check if whatever in have is in want, unlike merged. This is because we need to apply deleted on have config + if obj_in_have and obj_in_have != {"vrf": "default"}: + want_afi_list = [] + if "address_families" in want.keys(): + want_afi_list = [w["afi"] for w in want["address_families"]] + if len(want_afi_list) > 0: + for h in obj_in_have["address_families"]: + if h["afi"] in want_afi_list: + want_afi = search_obj_in_list( + h["afi"], want["address_families"], "afi" + ) + want_dest_list = [] + if "routes" in want_afi.keys(): + want_dest_list = [ + w["dest"] for w in want_afi["routes"] + ] + if len(want_dest_list) > 0: + for ro in h["routes"]: + if ro["dest"] in want_dest_list: + want_dest = search_obj_in_list( + ro["dest"], want_afi["routes"], "dest" + ) + want_next_hops = [] + if "next_hops" in want_dest.keys(): + want_next_hops = [ + nh for nh in want_dest["next_hops"] + ] + if len(want_next_hops) > 0: + for next_hop in ro["next_hops"]: + if next_hop not in want_next_hops: + # have's next hop not in want, so delete it + delete_dict = { + "vrf": obj_in_have["vrf"], + "address_families": [ + { + "afi": h["afi"], + "routes": [ + { + "dest": ro[ + "dest" + ], + "next_hops": [ + next_hop + ], + } + ], + } + ], + } + delete_commands.extend( + self.del_commands( + [delete_dict] + ) + ) + else: + # want has no next_hops, so delete all next_hops under that dest + if state == "overridden": + delete_dict = { + "vrf": obj_in_have["vrf"], + "address_families": [ + { + "afi": h["afi"], + "routes": [ + { + "dest": ro[ + "dest" + ], + "next_hops": ro[ + "next_hops" + ], + } + ], + } + ], + } + delete_commands.extend( + self.del_commands( + [delete_dict] + ) + ) + else: + if state == "overridden": + delete_dict = { + "vrf": obj_in_have["vrf"], + "address_families": [ + { + "afi": h["afi"], + "routes": [ + { + "dest": ro["dest"], + "next_hops": ro[ + "next_hops" + ], + } + ], + } + ], + } + delete_commands.extend( + self.del_commands([delete_dict]) + ) + + else: + if ( + state == "overridden" + ): # want has no 'routes' key, so delete all routes under that afi + if "routes" in h.keys(): + delete_dict = { + "vrf": obj_in_have["vrf"], + "address_families": [ + { + "afi": h["afi"], + "routes": h["routes"], + } + ], + } + delete_commands.extend( + self.del_commands([delete_dict]) + ) + else: + if ( + state == "overridden" + ): # want has 'vrf' key only. So delete all address families in it + delete_commands.extend( + self.del_commands( + [ + { + "address_families": [ + h + for h in obj_in_have[ + "address_families" + ] + ], + "vrf": obj_in_have["vrf"], + } + ] + ) + ) + final_delete_commands = [] + for d in delete_commands: + if d not in final_delete_commands: + final_delete_commands.append(d) + # if there are two afis, 'vrf context..' is added twice fom del_commands. The above code removes the redundant 'vrf context ..' + merged_commands = self.set_commands(want, have) + if merged_commands: + cmds = set(final_delete_commands).intersection( + set(merged_commands) + ) + for c in cmds: + merged_commands.remove(c) + + # set_commands adds a 'vrf context..' line. The above code removes the redundant 'vrf context ..' + commands.extend(final_delete_commands) + commands.extend(merged_commands) + return commands + + 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 = [] + want_vrfs = [w["vrf"] for w in want] + for h in have: + if h["vrf"] not in want_vrfs and h["vrf"] != "management": + commands.extend(self._state_deleted([h], have)) + for w in want: + commands.extend(self._state_replaced(w, have)) + 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 = [] + if want: + for w in want: + delete_dict = {} + obj_in_have = search_obj_in_list(w["vrf"], have, "vrf") + if obj_in_have: + if "address_families" in w.keys(): + o1 = obj_in_have["address_families"] + afi_list = [o["afi"] for o in o1] # have's afi list + for w1 in w["address_families"]: + if w1["afi"] in afi_list: + o2 = search_obj_in_list(w1["afi"], o1, "afi") + state = self._module.params["state"] + if state != "deleted": + # Deleted scope is till afi only. Part below is for use by overridden state. + if "routes" in w1.keys(): + for w2 in w1["routes"]: + o3 = search_obj_in_list( + w2["dest"], + o2["routes"], + "dest", + ) + hops = [] + if "next_hops" in w2.keys(): + for nh in w2["next_hops"]: + if nh in o3["next_hops"]: + hops.append(nh) + else: + # if next hops not given + hops = o3["next_hops"] + + delete_dict = { + "vrf": obj_in_have["vrf"], + "address_families": [ + { + "afi": w1["afi"], + "routes": [ + { + "dest": w2[ + "dest" + ], + "next_hops": hops, + } + ], + } + ], + } + commands.extend( + self.del_commands( + [delete_dict] + ) + ) + else: + # case when only afi given for delete + delete_dict = { + "vrf": obj_in_have["vrf"], + "address_families": [ + { + "afi": o2["afi"], + "routes": o2["routes"], + } + ], + } + commands.extend( + self.del_commands([delete_dict]) + ) + else: + commands.extend( + self.del_commands( + [ + { + "vrf": obj_in_have["vrf"], + "address_families": [o2], + } + ] + ) + ) + else: + # only vrf given to delete + commands.extend(self.del_commands([obj_in_have])) + else: + if have: + # delete everything + del_have = [] + for h in have: + if h["vrf"] != "management": # protect management vrf + del_have.append(h) + commands = self.del_commands(del_have) + + final_delete_commands = [] + # del_commands might add 'vrf context..' twice for two routes in the same vrf. This removes it + for c in commands: + if c not in final_delete_commands: + final_delete_commands.append(c) + return final_delete_commands + + def del_commands(self, have): + commands = [] + for h in have: + if h != {"vrf": "default"}: + vrf = h["vrf"] + commands.append("vrf context " + vrf) + for af in h["address_families"]: + for route in af["routes"]: + for next_hop in route["next_hops"]: + command = self.del_next_hop(af, route, next_hop) + commands.append(command.strip()) + return commands + + def del_next_hop(self, af, route, next_hop): + command = "" + if af["afi"] == "ipv4": + command = ( + "no ip route " + + route["dest"] + + " " + + self.add_commands(next_hop) + ) + else: + command = ( + "no ipv6 route " + + route["dest"] + + " " + + self.add_commands(next_hop) + ) + return command + + def add_commands(self, want): + command = "" + params = want.keys() + pref = vrf = ip = intf = name = tag = track = "" + if "admin_distance" in params: + pref = str(want["admin_distance"]) + " " + if "track" in params: + track = "track " + str(want["track"]) + " " + if "dest_vrf" in params: + vrf = "vrf " + str(want["dest_vrf"]) + " " + if "forward_router_address" in params: + ip = want["forward_router_address"] + " " + if "interface" in params: + intf = normalize_interface(want["interface"]) + " " + if "null0" in intf: + ip = "" + intf = "null0 " + if "route_name" in params: + name = "name " + str(want["route_name"]) + " " + if "tag" in params: + tag = "tag " + str(want["tag"]) + " " + command = intf + ip + vrf + name + tag + track + pref + if intf != "Null0 " and ip == "": + self._module.fail_json(msg="forward_router_address error") + return command.strip() + + def set_commands(self, want, have): + commands = [] + h1 = h2 = h3 = {} + want = remove_empties(want) + vrf_list = [] + if have: + vrf_list = [h["vrf"] for h in have] + if want["vrf"] in vrf_list and have != [{"vrf": "default"}]: + for x in have: + if x["vrf"] == want["vrf"]: + h1 = x # this has the 'have' dict with same vrf as want + if "address_families" in h1.keys(): + afi_list = [h["afi"] for h in h1["address_families"]] + if "address_families" in want.keys(): + for af in want["address_families"]: + if af["afi"] in afi_list: + for x in h1["address_families"]: + if x["afi"] == af["afi"]: + h2 = ( + x + ) # this has the have dict with same vrf and afi as want + dest_list = [h["dest"] for h in h2["routes"]] + if "routes" in af.keys(): + for ro in af["routes"]: + if ro["dest"] in dest_list: + for x in h2["routes"]: + if x["dest"] == ro["dest"]: + h3 = ( + x + ) # this has the have dict with same vrf, afi and dest as want + next_hop_list = [ + h for h in h3["next_hops"] + ] + if "next_hops" in ro.keys(): + for nh in ro["next_hops"]: + if "interface" in nh.keys(): + nh[ + "interface" + ] = normalize_interface( + nh["interface"] + ) + if nh not in next_hop_list: + # no match for next hop in have + commands = self.set_next_hop( + want, + h2, + nh, + ro, + commands, + ) + vrf_list.append( + want["vrf"] + ) + else: + # no match for dest + if "next_hops" in ro.keys(): + for nh in ro["next_hops"]: + commands = self.set_next_hop( + want, h2, nh, ro, commands + ) + else: + # no match for afi + if "routes" in af.keys(): + for ro in af["routes"]: + for nh in ro["next_hops"]: + commands = self.set_next_hop( + want, af, nh, ro, commands + ) + else: + # no match for vrf + vrf_list.append(want["vrf"]) + for af in want["address_families"]: + for ro in af["routes"]: + for nh in ro["next_hops"]: + commands = self.set_next_hop( + want, af, nh, ro, commands + ) + return commands + + def set_next_hop(self, want, h2, nh, ro, commands): + vrf = want["vrf"] + if h2["afi"] == "ipv4": + com = "ip route " + ro["dest"] + " " + self.add_commands(nh) + else: + com = "ipv6 route " + ro["dest"] + " " + self.add_commands(nh) + commands.append(com.strip()) + string = "vrf context " + str(vrf) + if string not in commands: + commands.insert(0, string) + return commands + + def add_default_vrf(self, dictionary): + """ + This method is used to add 'default' vrf to the facts collected as global/default vrf + is not shown in facts. vrf key exists for all vrfs except global. + """ + for d in dictionary: + if "vrf" not in d.keys(): + d.update({"vrf": "default"}) + return dictionary diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/telemetry.py new file mode 100644 index 00000000..b1a5a0b2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/telemetry/telemetry.py @@ -0,0 +1,665 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The nxos_telemetry 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 ( + to_list, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.cmdref.telemetry.telemetry import ( + TMS_GLOBAL, + TMS_DESTGROUP, + TMS_SENSORGROUP, + TMS_SUBSCRIPTION, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.telemetry.telemetry import ( + normalize_data, + remove_duplicate_context, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.telemetry.telemetry import ( + valiate_input, + get_setval_path, + massage_data, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.telemetry.telemetry import ( + get_module_params_subsection, + remove_duplicate_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + normalize_interface, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + NxosCmdRef, +) + + +class Telemetry(ConfigBase): + """ + The nxos_telemetry class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["telemetry"] + + def __init__(self, module): + super(Telemetry, self).__init__(module) + + def get_telemetry_facts(self): + """ 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 + ) + telemetry_facts = facts["ansible_network_resources"].get("telemetry") + if not telemetry_facts: + return {} + return telemetry_facts + + def edit_config(self, commands): + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = list() + warnings = list() + + state = self._module.params["state"] + if "overridden" in state: + self._module.fail_json( + msg="State is invalid for this module." + ) + # When state is 'deleted', the module_params should not contain data + # under the 'config' key + if "deleted" in state and self._module.params.get("config"): + self._module.fail_json( + msg="Remove config key from playbook when state is " + ) + + if self._module.params["config"] is None: + self._module.params["config"] = {} + # Normalize interface name. + int = self._module.params["config"].get("source_interface") + if int: + self._module.params["config"][ + "source_interface" + ] = normalize_interface(int) + + existing_telemetry_facts = self.get_telemetry_facts() + commands.extend(self.set_config(existing_telemetry_facts)) + if commands: + if not self._module.check_mode: + self.edit_config(commands) + # TODO: edit_config is only available for network_cli. Once we + # add support for httpapi, we will need to switch to load_config + # or add support to httpapi for edit_config + # + # self._connection.load_config(commands) + result["changed"] = True + result["commands"] = commands + + changed_telemetry_facts = self.get_telemetry_facts() + + result["before"] = existing_telemetry_facts + if result["changed"]: + result["after"] = changed_telemetry_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_tms_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 + """ + config = self._module.params["config"] + want = dict((k, v) for k, v in config.items() if v is not None) + have = existing_tms_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"] + + # The deleted case is very simple since we purge all telemetry config + # and does not require any processing using NxosCmdRef objects. + if state == "deleted": + return self._state_deleted(want, have) + elif state == "replaced": + if want == have: + return [] + return self._state_replaced(want, have) + + # Save off module params + ALL_MP = self._module.params["config"] + + cmd_ref = {} + cmd_ref["TMS_GLOBAL"] = {} + cmd_ref["TMS_DESTGROUP"] = {} + cmd_ref["TMS_SENSORGROUP"] = {} + cmd_ref["TMS_SUBSCRIPTION"] = {} + + # Build Telemetry Global NxosCmdRef Object + cmd_ref["TMS_GLOBAL"]["ref"] = [] + self._module.params["config"] = get_module_params_subsection( + ALL_MP, "TMS_GLOBAL" + ) + cmd_ref["TMS_GLOBAL"]["ref"].append( + NxosCmdRef(self._module, TMS_GLOBAL) + ) + ref = cmd_ref["TMS_GLOBAL"]["ref"][0] + ref.set_context() + ref.get_existing() + ref.get_playvals() + device_cache = ref.cache_existing + + def build_cmdref_objects(td): + cmd_ref[td["type"]]["ref"] = [] + saved_ids = [] + if want.get(td["name"]): + for playvals in want[td["name"]]: + valiate_input(playvals, td["name"], self._module) + if playvals["id"] in saved_ids: + continue + saved_ids.append(playvals["id"]) + resource_key = td["cmd"].format(playvals["id"]) + # Only build the NxosCmdRef object for the td['name'] module parameters. + self._module.params[ + "config" + ] = get_module_params_subsection( + ALL_MP, td["type"], playvals["id"] + ) + cmd_ref[td["type"]]["ref"].append( + NxosCmdRef(self._module, td["obj"]) + ) + ref = cmd_ref[td["type"]]["ref"][-1] + ref.set_context([resource_key]) + if td["type"] == "TMS_SENSORGROUP" and get_setval_path( + self._module + ): + # Sensor group path setting can contain optional values. + # Call get_setval_path helper function to process any + # optional setval keys. + ref._ref["path"]["setval"] = get_setval_path( + self._module + ) + ref.get_existing(device_cache) + ref.get_playvals() + if td["type"] == "TMS_DESTGROUP": + normalize_data(ref) + + # Build Telemetry Destination Group NxosCmdRef Objects + td = { + "name": "destination_groups", + "type": "TMS_DESTGROUP", + "obj": TMS_DESTGROUP, + "cmd": "destination-group {0}", + } + build_cmdref_objects(td) + + # Build Telemetry Sensor Group NxosCmdRef Objects + td = { + "name": "sensor_groups", + "type": "TMS_SENSORGROUP", + "obj": TMS_SENSORGROUP, + "cmd": "sensor-group {0}", + } + build_cmdref_objects(td) + + # Build Telemetry Subscription NxosCmdRef Objects + td = { + "name": "subscriptions", + "type": "TMS_SUBSCRIPTION", + "obj": TMS_SUBSCRIPTION, + "cmd": "subscription {0}", + } + build_cmdref_objects(td) + + if state == "merged": + if want == have: + return [] + commands = self._state_merged(cmd_ref) + 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 = [] + massaged_have = massage_data(have) + massaged_want = massage_data(want) + + ref = {} + ref["tms_global"] = NxosCmdRef([], TMS_GLOBAL, ref_only=True) + ref["tms_destgroup"] = NxosCmdRef([], TMS_DESTGROUP, ref_only=True) + ref["tms_sensorgroup"] = NxosCmdRef([], TMS_SENSORGROUP, ref_only=True) + ref["tms_subscription"] = NxosCmdRef( + [], TMS_SUBSCRIPTION, ref_only=True + ) + + # Order matters for state replaced. + # First remove all subscriptions, followed by sensor-groups and destination-groups. + # Second add all destination-groups, followed by sensor-groups and subscriptions + add = { + "TMS_GLOBAL": [], + "TMS_DESTGROUP": [], + "TMS_SENSORGROUP": [], + "TMS_SUBSCRIPTION": [], + } + delete = { + "TMS_DESTGROUP": [], + "TMS_SENSORGROUP": [], + "TMS_SUBSCRIPTION": [], + } + + # Process Telemetry Global Want and Have Values + # Possible states: + # - want and have are (set) (equal: no action, not equal: replace with want) + # - want (set) have (not set) (add want) + # - want (not set) have (set) (delete have) + # - want (not set) have (not set) (no action) + # global_ctx = ref['tms_global']._ref['_template']['context'] + # property_ctx = ref['tms_global']._ref['certificate'].get('context') + # setval = ref['tms_global']._ref['certificate']['setval'] + # + all_global_properties = [ + "certificate", + "compression", + "source_interface", + "vrf", + ] + dest_profile_properties = ["compression", "source_interface", "vrf"] + dest_profile_remote_commands = [] + for property in all_global_properties: + cmd = None + global_ctx = ref["tms_global"]._ref["_template"]["context"] + property_ctx = ref["tms_global"]._ref[property].get("context") + setval = ref["tms_global"]._ref[property]["setval"] + kind = ref["tms_global"]._ref[property]["kind"] + if want.get(property) is not None: + if have.get(property) is not None: + if want.get(property) != have.get(property): + if kind == "dict": + cmd = [setval.format(**want.get(property))] + else: + cmd = [setval.format(want.get(property))] + elif have.get(property) is None: + if kind == "dict": + cmd = [setval.format(**want.get(property))] + else: + cmd = [setval.format(want.get(property))] + elif want.get(property) is None: + if have.get(property) is not None: + if kind == "dict": + cmd = ["no " + setval.format(**have.get(property))] + else: + cmd = ["no " + setval.format(have.get(property))] + if property in dest_profile_properties: + dest_profile_remote_commands.extend(cmd) + + if cmd is not None: + ctx = global_ctx + if property_ctx is not None: + ctx.extend(property_ctx) + add["TMS_GLOBAL"].extend(ctx) + add["TMS_GLOBAL"].extend(cmd) + + add["TMS_GLOBAL"] = remove_duplicate_commands(add["TMS_GLOBAL"]) + # If all destination profile commands are being removed then just + # remove the config context instead. + if len(dest_profile_remote_commands) == 3: + for item in dest_profile_remote_commands: + add["TMS_GLOBAL"].remove(item) + add["TMS_GLOBAL"].remove("destination-profile") + add["TMS_GLOBAL"].extend(["no destination-profile"]) + + # Process Telemetry destination_group, sensor_group and subscription Want and Have Values + # Possible states: + # - want (not set) have (set) (delete have) + # - want and have are (set) (equal: no action, not equal: replace with want) + # - want (set) have (not set) (add want) + # - want (not set) have (not set) (no action) + tms_resources = [ + "TMS_DESTGROUP", + "TMS_SENSORGROUP", + "TMS_SUBSCRIPTION", + ] + for resource in tms_resources: + if resource == "TMS_DESTGROUP": + name = "destination-group" + cmd_property = "destination" + global_ctx = ref["tms_destgroup"]._ref["_template"]["context"] + setval = ref["tms_destgroup"]._ref["destination"]["setval"] + want_resources = massaged_want.get("destination_groups") + have_resources = massaged_have.get("destination_groups") + if resource == "TMS_SENSORGROUP": + name = "sensor-group" + global_ctx = ref["tms_sensorgroup"]._ref["_template"][ + "context" + ] + setval = {} + setval["data_source"] = ref["tms_sensorgroup"]._ref[ + "data_source" + ]["setval"] + setval["path"] = ref["tms_sensorgroup"]._ref["path"]["setval"] + want_resources = massaged_want.get("sensor_groups") + have_resources = massaged_have.get("sensor_groups") + if resource == "TMS_SUBSCRIPTION": + name = "subscription" + global_ctx = ref["tms_subscription"]._ref["_template"][ + "context" + ] + setval = {} + setval["destination_group"] = ref["tms_subscription"]._ref[ + "destination_group" + ]["setval"] + setval["sensor_group"] = ref["tms_subscription"]._ref[ + "sensor_group" + ]["setval"] + want_resources = massaged_want.get("subscriptions") + have_resources = massaged_have.get("subscriptions") + + if not want_resources and have_resources: + # want not and have not set so delete have + for key in have_resources.keys(): + remove_context = ["{0} {1} {2}".format("no", name, key)] + delete[resource].extend(global_ctx) + if remove_context[0] not in delete[resource]: + delete[resource].extend(remove_context) + else: + # want and have are set. + # process wants: + for want_key in want_resources.keys(): + if want_key not in have_resources.keys(): + # Want resource key not in have resource key so add it + property_ctx = ["{0} {1}".format(name, want_key)] + for item in want_resources[want_key]: + if resource == "TMS_DESTGROUP": + cmd = [setval.format(**item[cmd_property])] + add[resource].extend(global_ctx) + if property_ctx[0] not in add[resource]: + add[resource].extend(property_ctx) + add[resource].extend(cmd) + if resource == "TMS_SENSORGROUP": + cmd = {} + if item.get("data_source"): + cmd["data_source"] = [ + setval["data_source"].format( + item["data_source"] + ) + ] + if item.get("path"): + setval["path"] = get_setval_path( + item.get("path") + ) + cmd["path"] = [ + setval["path"].format(**item["path"]) + ] + add[resource].extend(global_ctx) + if property_ctx[0] not in add[resource]: + add[resource].extend(property_ctx) + if cmd.get("data_source"): + add[resource].extend(cmd["data_source"]) + if cmd.get("path"): + add[resource].extend(cmd["path"]) + if resource == "TMS_SUBSCRIPTION": + cmd = {} + if item.get("destination_group"): + cmd["destination_group"] = [ + setval["destination_group"].format( + item["destination_group"] + ) + ] + if item.get("sensor_group"): + cmd["sensor_group"] = [ + setval["sensor_group"].format( + **item["sensor_group"] + ) + ] + add[resource].extend(global_ctx) + if property_ctx[0] not in add[resource]: + add[resource].extend(property_ctx) + if cmd.get("destination_group"): + add[resource].extend( + cmd["destination_group"] + ) + if cmd.get("sensor_group"): + add[resource].extend(cmd["sensor_group"]) + + elif want_key in have_resources.keys(): + # Want resource key exists in have resource keys but we need to + # inspect the individual items under the resource key + # for differences + for item in want_resources[want_key]: + if item not in have_resources[want_key]: + if item is None: + continue + # item wanted but does not exist so add it + property_ctx = [ + "{0} {1}".format(name, want_key) + ] + if resource == "TMS_DESTGROUP": + cmd = [setval.format(**item[cmd_property])] + add[resource].extend(global_ctx) + if property_ctx[0] not in add[resource]: + add[resource].extend(property_ctx) + add[resource].extend(cmd) + if resource == "TMS_SENSORGROUP": + cmd = {} + if item.get("data_source"): + cmd["data_source"] = [ + setval["data_source"].format( + item["data_source"] + ) + ] + if item.get("path"): + setval["path"] = get_setval_path( + item.get("path") + ) + cmd["path"] = [ + setval["path"].format( + **item["path"] + ) + ] + add[resource].extend(global_ctx) + if property_ctx[0] not in add[resource]: + add[resource].extend(property_ctx) + if cmd.get("data_source"): + add[resource].extend( + cmd["data_source"] + ) + if cmd.get("path"): + add[resource].extend(cmd["path"]) + if resource == "TMS_SUBSCRIPTION": + cmd = {} + if item.get("destination_group"): + cmd["destination_group"] = [ + setval["destination_group"].format( + item["destination_group"] + ) + ] + if item.get("sensor_group"): + cmd["sensor_group"] = [ + setval["sensor_group"].format( + **item["sensor_group"] + ) + ] + add[resource].extend(global_ctx) + if property_ctx[0] not in add[resource]: + add[resource].extend(property_ctx) + if cmd.get("destination_group"): + add[resource].extend( + cmd["destination_group"] + ) + if cmd.get("sensor_group"): + add[resource].extend( + cmd["sensor_group"] + ) + + # process haves: + for have_key in have_resources.keys(): + if have_key not in want_resources.keys(): + # Want resource key is not in have resource keys so remove it + cmd = ["no " + "{0} {1}".format(name, have_key)] + delete[resource].extend(global_ctx) + delete[resource].extend(cmd) + elif have_key in want_resources.keys(): + # Have resource key exists in want resource keys but we need to + # inspect the individual items under the resource key + # for differences + for item in have_resources[have_key]: + if item not in want_resources[have_key]: + if item is None: + continue + # have item not wanted so remove it + property_ctx = [ + "{0} {1}".format(name, have_key) + ] + if resource == "TMS_DESTGROUP": + cmd = [ + "no " + + setval.format(**item[cmd_property]) + ] + delete[resource].extend(global_ctx) + if property_ctx[0] not in delete[resource]: + delete[resource].extend(property_ctx) + delete[resource].extend(cmd) + if resource == "TMS_SENSORGROUP": + cmd = {} + if item.get("data_source"): + cmd["data_source"] = [ + "no " + + setval["data_source"].format( + item["data_source"] + ) + ] + if item.get("path"): + setval["path"] = get_setval_path( + item.get("path") + ) + cmd["path"] = [ + "no " + + setval["path"].format( + **item["path"] + ) + ] + delete[resource].extend(global_ctx) + if property_ctx[0] not in delete[resource]: + delete[resource].extend(property_ctx) + if cmd.get("data_source"): + delete[resource].extend( + cmd["data_source"] + ) + if cmd.get("path"): + delete[resource].extend(cmd["path"]) + if resource == "TMS_SUBSCRIPTION": + cmd = {} + if item.get("destination_group"): + cmd["destination_group"] = [ + "no " + + setval[ + "destination_group" + ].format(item["destination_group"]) + ] + if item.get("sensor_group"): + cmd["sensor_group"] = [ + "no " + + setval["sensor_group"].format( + **item["sensor_group"] + ) + ] + delete[resource].extend(global_ctx) + if property_ctx[0] not in delete[resource]: + delete[resource].extend(property_ctx) + if cmd.get("destination_group"): + delete[resource].extend( + cmd["destination_group"] + ) + if cmd.get("sensor_group"): + delete[resource].extend( + cmd["sensor_group"] + ) + + add[resource] = remove_duplicate_context(add[resource]) + delete[resource] = remove_duplicate_context(delete[resource]) + + commands.extend(delete["TMS_SUBSCRIPTION"]) + commands.extend(delete["TMS_SENSORGROUP"]) + commands.extend(delete["TMS_DESTGROUP"]) + commands.extend(add["TMS_DESTGROUP"]) + commands.extend(add["TMS_SENSORGROUP"]) + commands.extend(add["TMS_SUBSCRIPTION"]) + commands.extend(add["TMS_GLOBAL"]) + commands = remove_duplicate_context(commands) + + return commands + + @staticmethod + def _state_merged(cmd_ref): + """ The command generator when state is merged + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = cmd_ref["TMS_GLOBAL"]["ref"][0].get_proposed() + + if cmd_ref["TMS_DESTGROUP"].get("ref"): + for cr in cmd_ref["TMS_DESTGROUP"]["ref"]: + commands.extend(cr.get_proposed()) + + if cmd_ref["TMS_SENSORGROUP"].get("ref"): + for cr in cmd_ref["TMS_SENSORGROUP"]["ref"]: + commands.extend(cr.get_proposed()) + + if cmd_ref["TMS_SUBSCRIPTION"].get("ref"): + for cr in cmd_ref["TMS_SUBSCRIPTION"]["ref"]: + commands.extend(cr.get_proposed()) + + return remove_duplicate_context(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 = [] + if want != have: + commands = ["no telemetry"] + return commands diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/vlans.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/vlans.py new file mode 100644 index 00000000..09badec7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/config/vlans/vlans.py @@ -0,0 +1,338 @@ +# +# -*- 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 nxos_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 + +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, + to_list, + remove_empties, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + search_obj_in_list, +) + + +class Vlans(ConfigBase): + """ + The nxos_vlans class + """ + + gather_subset = ["min"] + + gather_network_resources = ["vlans"] + + def __init__(self, module): + super(Vlans, self).__init__(module) + + def get_platform(self): + """Wrapper method for getting platform info + This method exists solely to allow the unit test framework to mock calls. + """ + return self.facts.get("ansible_net_platform", "") + + def get_vlans_facts(self, data=None): + """ Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + self.facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, self.gather_network_resources, data=data + ) + vlans_facts = self.facts["ansible_network_resources"].get("vlans") + if not vlans_facts: + return [] + + return vlans_facts + + def edit_config(self, commands): + """Wrapper method for `_connection.edit_config()` + This exists solely to allow the unit test framework to mock device connection calls. + """ + return self._connection.edit_config(commands) + + def execute_module(self): + """ Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = [] + warnings = [] + + if self.state in self.ACTION_STATES: + existing_vlans_facts = self.get_vlans_facts() + self._platform = self.get_platform() + else: + existing_vlans_facts = [] + self._platform = "" + + 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.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.get("config") or [] + have = existing_vlans_facts + resp = self.set_state(self._sanitize(want), self._sanitize(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 ("overridden", "merged", "replaced", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state + ) + ) + + commands = list() + if state == "overridden": + commands.extend(self._state_overridden(want, have)) + elif state == "deleted": + commands.extend(self._state_deleted(want, have)) + else: + for w in want: + if state in ["merged", "rendered"]: + commands.extend(self._state_merged(w, have)) + elif state == "replaced": + commands.extend(self._state_replaced(w, have)) + + return commands + + def remove_default_states(self, obj): + """Removes non-empty but default states from the obj. + """ + default_states = {"enabled": True, "state": "active", "mode": "ce"} + for k in default_states.keys(): + if obj.get(k) == default_states[k]: + obj.pop(k, None) + return obj + + def _state_replaced(self, want, have): + """ The command generator when state is replaced. + Scope is limited to vlan objects defined in the playbook. + :rtype: A list + :returns: The minimum command set required to migrate the current + configuration to the desired configuration. + """ + obj_in_have = search_obj_in_list(want["vlan_id"], have, "vlan_id") + if obj_in_have: + # Diff the want and have + diff = dict_diff(want, obj_in_have) + # Remove merge items from diff; what's left will be used to + # remove states not specified in the playbook + for k in dict(set(want.items()) - set(obj_in_have.items())).keys(): + diff.pop(k, None) + else: + diff = want + + # Remove default states from resulting diff + diff = self.remove_default_states(diff) + + # merged_cmds: 'want' cmds to update 'have' states that don't match + # replaced_cmds: remaining 'have' cmds that need to be reset to default + merged_cmds = self.set_commands(want, have) + replaced_cmds = [] + if obj_in_have: + # Remaining diff items are used to reset states to default + replaced_cmds = self.del_attribs(diff) + cmds = [] + if replaced_cmds or merged_cmds: + cmds += ["vlan %s" % str(want["vlan_id"])] + cmds += merged_cmds + replaced_cmds + return cmds + + def _state_overridden(self, want, have): + """ The command generator when state is overridden. + Scope includes all vlan objects on the device. + :rtype: A list + :returns: the minimum command set required to migrate the current + configuration to the desired configuration. + """ + # overridden behavior is the same as replaced except for scope. + cmds = [] + existing_vlans = [] + for h in have: + existing_vlans.append(h["vlan_id"]) + obj_in_want = search_obj_in_list(h["vlan_id"], want, "vlan_id") + if obj_in_want: + if h != obj_in_want: + replaced_cmds = self._state_replaced(obj_in_want, [h]) + if replaced_cmds: + cmds.extend(replaced_cmds) + else: + cmds.append("no vlan %s" % h["vlan_id"]) + + # Add wanted vlans that don't exist on the device yet + for w in want: + if w["vlan_id"] not in existing_vlans: + new_vlan = ["vlan %s" % w["vlan_id"]] + cmds.extend(new_vlan + self.add_commands(w)) + return cmds + + def _state_merged(self, w, have): + """ The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + cmds = self.set_commands(w, have) + if cmds: + cmds.insert(0, "vlan %s" % str(w["vlan_id"])) + return cmds + + 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 want: + for w in want: + obj_in_have = search_obj_in_list(w["vlan_id"], have, "vlan_id") + if obj_in_have: + commands.append("no vlan " + str(obj_in_have["vlan_id"])) + else: + if not have: + return commands + for h in have: + commands.append("no vlan " + str(h["vlan_id"])) + return commands + + def del_attribs(self, obj): + """Returns a list of commands to reset states to default + """ + commands = [] + if not obj: + return commands + default_cmds = { + "name": "no name", + "state": "no state", + "enabled": "no shutdown", + "mode": "mode ce", + "mapped_vni": "no vn-segment", + } + for k in obj: + commands.append(default_cmds[k]) + return commands + + def diff_of_dicts(self, w, obj): + diff = set(w.items()) - set(obj.items()) + diff = dict(diff) + if diff and w["vlan_id"] == obj["vlan_id"]: + diff.update({"vlan_id": w["vlan_id"]}) + return diff + + def add_commands(self, d): + commands = [] + if not d: + return commands + if "name" in d: + commands.append("name " + d["name"]) + if "state" in d: + commands.append("state " + d["state"]) + if "enabled" in d: + if d["enabled"] is True: + commands.append("no shutdown") + else: + commands.append("shutdown") + if "mode" in d: + commands.append("mode " + d["mode"]) + if "mapped_vni" in d: + commands.append("vn-segment %s" % d["mapped_vni"]) + + return commands + + def set_commands(self, w, have): + commands = [] + obj_in_have = search_obj_in_list(w["vlan_id"], have, "vlan_id") + if not obj_in_have: + commands = self.add_commands(w) + else: + diff = self.diff_of_dicts(w, obj_in_have) + commands = self.add_commands(diff) + return commands + + def _sanitize(self, vlans): + sanitized_vlans = [] + for vlan in vlans: + if not re.search("N[567][7K]", self._platform): + if "mode" in vlan: + del vlan["mode"] + sanitized_vlans.append(remove_empties(vlan)) + return sanitized_vlans diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/acl_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/acl_interfaces.py new file mode 100644 index 00000000..94686bd9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acl_interfaces/acl_interfaces.py @@ -0,0 +1,135 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.acl_interfaces.acl_interfaces import ( + Acl_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + normalize_interface, +) + + +class Acl_interfacesFacts(object): + """ The nxos 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 | section ^interface") + + 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) + data = data.split("interface") + + resources = [] + for i in range(len(data)): + intf = data[i].split("\n") + for l in range(1, len(intf)): + if not re.search( + "ip(v6)?( port)? (access-group|traffic-filter)", intf[l] + ): + intf[l] = "" + intf = list(filter(None, intf)) + resources.append(intf) + + 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} + ) + params = utils.remove_empties(params) + facts["acl_interfaces"] = 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"] = conf[0].strip() + config["access_groups"] = [] + v4 = {"afi": "ipv4", "acls": []} + v6 = {"afi": "ipv6", "acls": []} + for c in conf[1:]: + if c: + acl4 = re.search( + r"ip(?P\sport)?\saccess-group\s(?P\S+)\s(?Pin|out)", + c, + ) + acl6 = re.search( + r"ipv6(?P\sport)?\straffic-filter\s(?P\S+)\s(?Pin|out)", + c, + ) + if acl4: + v4["acls"].append(self._parse(acl4)) + elif acl6: + v6["acls"].append(self._parse(acl6)) + + if len(v4["acls"]) > 0: + config["access_groups"].append(v4) + if len(v6["acls"]) > 0: + config["access_groups"].append(v6) + + return utils.remove_empties(config) + + def _parse(self, data): + return { + "name": data.group("name").strip(), + "direction": data.group("dir").strip(), + "port": True if data.group("port") else None, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/acls.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/acls.py new file mode 100644 index 00000000..abdf2968 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/acls/acls.py @@ -0,0 +1,283 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.acls.acls import ( + AclsArgs, +) + + +class AclsFacts(object): + """ The nxos 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): + data = connection.get( + "show running-config | section 'ip(v6)* access-list'" + ) + if data == "{}": + return "" + return data + + 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) + data = re.split("\nip", data) + v6 = [] + v4 = [] + + for i in range(len(data)): + if str(data[i]): + if "v6" in str(data[i]).split()[0]: + v6.append(data[i]) + else: + v4.append(data[i]) + + resources = [] + resources.append(v6) + resources.append(v4) + 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("acls", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + params = utils.remove_empties(params) + facts["acls"] = params["config"] + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def get_endpoint(self, ace, pro): + ret_dict = {} + option = ace.split()[0] + if option == "any": + ret_dict.update({"any": True}) + else: + # it could be a.b.c.d or a.b.c.d/x or a.b.c.d/32 + if "/" in option: # or 'host' in option: + ip = re.search(r"(.*)/(\d+)", option) + if int(ip.group(2)) < 32 or 32 < int(ip.group(2)) < 128: + ret_dict.update({"prefix": option}) + else: + ret_dict.update({"host": ip.group(1)}) + else: + ret_dict.update({"address": option}) + wb = ace.split()[1] + ret_dict.update({"wildcard_bits": wb}) + ace = re.sub("{0}".format(wb), "", ace, 1) + ace = re.sub(option, "", ace, 1) + if pro in ["tcp", "udp"]: + keywords = ["eq", "lt", "gt", "neq", "range"] + if len(ace.split()) and ace.split()[0] in keywords: + port_protocol = {} + port_pro = re.search(r"(eq|lt|gt|neq) (\w*)", ace) + if port_pro: + port_protocol.update( + {port_pro.group(1): port_pro.group(2)} + ) + ace = re.sub(port_pro.group(1), "", ace, 1) + ace = re.sub(port_pro.group(2), "", ace, 1) + else: + limit = re.search(r"(range) (\w*) (\w*)", ace) + if limit: + port_protocol.update( + { + "range": { + "start": limit.group(2), + "end": limit.group(3), + } + } + ) + ace = re.sub(limit.group(2), "", ace, 1) + ace = re.sub(limit.group(3), "", ace, 1) + if port_protocol: + ret_dict.update({"port_protocol": port_protocol}) + return ace, ret_dict + + 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) + protocol_options = { + "tcp": ["fin", "established", "psh", "rst", "syn", "urg", "ack"], + "icmp": [ + "administratively_prohibited", + "alternate_address", + "conversion_error", + "dod_host_prohibited", + "dod_net_prohibited", + "echo_request", + "echo", + "echo_reply", + "general_parameter_problem", + "host_isolated", + "host_precedence_unreachable", + "host_redirect", + "host_tos_redirect", + "host_tos_unreachable", + "host_unknown", + "host_unreachable", + "information_reply", + "information_request", + "mask_reply", + "mask_request", + "mobile_redirect", + "net_redirect", + "net_tos_redirect", + "net_tos_unreachable", + "net_unreachable", + "network_unknown", + "no_room_for_option", + "option_missing", + "packet_too_big", + "parameter_problem", + "port_unreachable", + "precedence_unreachable", + "protocol_unreachable", + "reassembly_timeout", + "redirect", + "router_advertisement", + "router_solicitation", + "source_quench", + "source_route_failed", + "time_exceeded", + "timestamp_reply", + "timestamp_request", + "traceroute", + "ttl_exceeded", + "unreachable", + ], + "igmp": ["dvmrp", "host_query", "host_report"], + } + if conf: + if "v6" in conf[0].split()[0]: + config["afi"] = "ipv6" + else: + config["afi"] = "ipv4" + config["acls"] = [] + for acl in conf: + acls = {} + if "match-local-traffic" in acl: + config["match_local_traffic"] = True + continue + acl = acl.split("\n") + acl = [a.strip() for a in acl] + acl = list(filter(None, acl)) + acls["name"] = re.match( + r"(ip)?(v6)?\s?access-list (.*)", acl[0] + ).group(3) + acls["aces"] = [] + for ace in list(filter(None, acl[1:])): + if re.search(r"ip(.*)access-list.*", ace): + break + entry = {} + ace = ace.strip() + seq = re.match(r"(\d*)", ace).group(0) + entry.update({"sequence": seq}) + ace = re.sub(seq, "", ace, 1) + grant = ace.split()[0] + rem = "" + if grant != "remark": + entry.update({"grant": grant}) + else: + rem = re.match(".*remark (.*)", ace).group(1) + entry.update({"remark": rem}) + + if not rem: + ace = re.sub(grant, "", ace, 1) + pro = ace.split()[0] + entry.update({"protocol": pro}) + ace = re.sub(pro, "", ace, 1) + ace, source = self.get_endpoint(ace, pro) + entry.update({"source": source}) + ace, dest = self.get_endpoint(ace, pro) + entry.update({"destination": dest}) + + dscp = re.search(r"dscp (\w*)", ace) + if dscp: + entry.update({"dscp": dscp.group(1)}) + + frag = re.search(r"fragments", ace) + if frag: + entry.update({"fragments": True}) + + prec = re.search(r"precedence (\w*)", ace) + if prec: + entry.update({"precedence": prec.group(1)}) + + log = re.search("log", ace) + if log: + entry.update({"log": True}) + + if pro == "tcp" or pro == "icmp" or pro == "igmp": + pro_options = {} + options = {} + for option in protocol_options[pro]: + option = re.sub("_", "-", option) + if option in ace: + if ( + option == "echo" + and "echo_request" in options + ): + continue + option = re.sub("-", "_", option) + options.update({option: True}) + if options: + pro_options.update({pro: options}) + if pro_options: + entry.update({"protocol_options": pro_options}) + acls["aces"].append(entry) + config["acls"].append(acls) + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/bfd_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/bfd_interfaces.py new file mode 100644 index 00000000..dee9d60c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bfd_interfaces/bfd_interfaces.py @@ -0,0 +1,114 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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 nxos bfd_interfaces fact class +Populate the facts tree based on the current device configuration. +""" +import re +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.bfd_interfaces.bfd_interfaces import ( + Bfd_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) + + +class Bfd_interfacesFacts(object): + """ The nxos_bfd_interfaces fact class + """ + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Bfd_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 bfd_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + + if not data: + data = connection.get( + "show running-config | section '^interface|^feature bfd'" + ) + + # Some of the bfd attributes + if "feature bfd" in data.split("\n"): + resources = data.split("interface ") + resources.pop(0) + else: + resources = [] + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj and len(obj.keys()) > 1: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("bfd_interfaces", None) + facts = {} + if objs: + facts["bfd_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["bfd_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) + + match = re.search(r"^(\S+)", conf) + intf = match.group(1) + if get_interface_type(intf) == "unknown": + return {} + config["name"] = intf + # 'bfd'/'bfd echo' do not nvgen when enabled thus set to 'enable' when None. + # 'bfd' is not supported on some platforms + config["bfd"] = ( + utils.parse_conf_cmd_arg(conf, "bfd", "enable", "disable") + or "enable" + ) + config["echo"] = ( + utils.parse_conf_cmd_arg(conf, "bfd echo", "enable", "disable") + or "enable" + ) + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/bgp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/bgp_global.py new file mode 100644 index 00000000..764acaa1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/bgp_global/bgp_global.py @@ -0,0 +1,135 @@ +# -*- 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 nxos 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 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.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.bgp_global import ( + Bgp_globalTemplate, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.bgp_global.bgp_global import ( + Bgp_globalArgs, +) + + +class Bgp_globalFacts(object): + """ The nxos 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 bgp'") + + 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 = {} + + if not data: + data = self.get_config(connection) + + data = self._flatten_config(data) + + # parse native config using the Bgp_global template + bgp_global_parser = Bgp_globalTemplate(lines=data.splitlines()) + obj = bgp_global_parser.parse() + + vrfs = obj.get("vrfs", {}) + + # move global vals to their correct position in facts tree + # this is only needed for keys that are valid for both global + # and VRF contexts + global_vals = vrfs.pop("vrf_", {}) + for key, value in iteritems(global_vals): + obj[key] = value + + # transform vrfs into a list + if vrfs: + obj["vrfs"] = sorted( + list(obj["vrfs"].values()), key=lambda k, sk="vrf": k[sk] + ) + for vrf in obj["vrfs"]: + self._post_parse(vrf) + + self._post_parse(obj) + + obj = utils.remove_empties(obj) + + ansible_facts["ansible_network_resources"].pop("bgp_global", None) + params = utils.remove_empties( + utils.validate_config(self.argument_spec, {"config": obj}) + ) + + facts["bgp_global"] = params.get("config", {}) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts + + def _flatten_config(self, data): + """ Flatten neighbor contexts in + the running-config for easier parsing. + :param obj: dict + :returns: flattened running config + """ + data = data.split("\n") + in_nbr_cxt = False + cur_nbr = {} + + for x in data: + cur_indent = len(x) - len(x.lstrip()) + if x.strip().startswith("neighbor"): + in_nbr_cxt = True + cur_nbr["nbr"] = x + cur_nbr["indent"] = cur_indent + elif cur_nbr and (cur_indent <= cur_nbr["indent"]): + in_nbr_cxt = False + elif in_nbr_cxt: + data[data.index(x)] = cur_nbr["nbr"] + " " + x.strip() + + return "\n".join(data) + + def _post_parse(self, obj): + """ Converts the intermediate data structure + to valid format as per argspec. + :param obj: dict + """ + conf_peers = obj.get("confederation", {}).get("peers") + if conf_peers: + obj["confederation"]["peers"] = conf_peers.split() + obj["confederation"]["peers"].sort() + + neighbors = obj.get("neighbors", {}) + if neighbors: + obj["neighbors"] = sorted( + list(neighbors.values()), + key=lambda k, sk="neighbor_address": k[sk], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/facts.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/facts.py new file mode 100644 index 00000000..9620c415 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/facts.py @@ -0,0 +1,145 @@ +# +# -*- 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 facts class for nxos +this file validates each subset of facts and selectively +calls the appropriate facts gathering function +""" +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts import ( + FactsBase, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.legacy.base import ( + Default, + Legacy, + Hardware, + Config, + Interfaces, + Features, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.bfd_interfaces.bfd_interfaces import ( + Bfd_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.hsrp_interfaces.hsrp_interfaces import ( + Hsrp_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.interfaces.interfaces import ( + InterfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.l2_interfaces.l2_interfaces import ( + L2_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.lacp.lacp import ( + LacpFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.l3_interfaces.l3_interfaces import ( + L3_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.lag_interfaces.lag_interfaces import ( + Lag_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.telemetry.telemetry import ( + TelemetryFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.vlans.vlans import ( + VlansFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.lacp_interfaces.lacp_interfaces import ( + Lacp_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.lldp_global.lldp_global import ( + Lldp_globalFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.lldp_interfaces.lldp_interfaces import ( + Lldp_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.acl_interfaces.acl_interfaces import ( + Acl_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.acls.acls import ( + AclsFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.static_routes.static_routes import ( + Static_routesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.ospfv2.ospfv2 import ( + Ospfv2Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.ospfv3.ospfv3 import ( + Ospfv3Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.ospf_interfaces.ospf_interfaces import ( + Ospf_interfacesFacts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.bgp_global.bgp_global import ( + Bgp_globalFacts, +) + + +FACT_LEGACY_SUBSETS = dict( + default=Default, + legacy=Legacy, + hardware=Hardware, + interfaces=Interfaces, + config=Config, + features=Features, +) +FACT_RESOURCE_SUBSETS = dict( + bfd_interfaces=Bfd_interfacesFacts, + hsrp_interfaces=Hsrp_interfacesFacts, + lag_interfaces=Lag_interfacesFacts, + lldp_global=Lldp_globalFacts, + telemetry=TelemetryFacts, + vlans=VlansFacts, + lacp=LacpFacts, + lacp_interfaces=Lacp_interfacesFacts, + interfaces=InterfacesFacts, + l3_interfaces=L3_interfacesFacts, + l2_interfaces=L2_interfacesFacts, + lldp_interfaces=Lldp_interfacesFacts, + acl_interfaces=Acl_interfacesFacts, + acls=AclsFacts, + static_routes=Static_routesFacts, + ospfv2=Ospfv2Facts, + ospfv3=Ospfv3Facts, + ospf_interfaces=Ospf_interfacesFacts, + bgp_global=Bgp_globalFacts, +) + + +class Facts(FactsBase): + """ The fact class for nxos + """ + + VALID_LEGACY_GATHER_SUBSETS = frozenset(FACT_LEGACY_SUBSETS.keys()) + VALID_RESOURCE_SUBSETS = frozenset(FACT_RESOURCE_SUBSETS.keys()) + + def __init__(self, module): + super(Facts, self).__init__(module) + + def get_facts( + self, legacy_facts_type=None, resource_facts_type=None, data=None + ): + """ Collect the facts for nxos + :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/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/hsrp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/hsrp_interfaces.py new file mode 100644 index 00000000..7275e4e3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/hsrp_interfaces/hsrp_interfaces.py @@ -0,0 +1,100 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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 nxos hsrp_interfaces fact class +Populate the facts tree based on the current device configuration. +""" +import re +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.hsrp_interfaces.hsrp_interfaces import ( + Hsrp_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) + + +class Hsrp_interfacesFacts(object): + """ The nxos hsrp_interfaces fact class + """ + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Hsrp_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 hsrp_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + + if not data: + data = connection.get("show running-config | section ^interface") + + resources = data.split("interface ") + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj and len(obj.keys()) > 1: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("hsrp_interfaces", None) + facts = {} + if objs: + facts["hsrp_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["hsrp_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) + + match = re.search(r"^(\S+)", conf) + intf = match.group(1) + if get_interface_type(intf) == "unknown": + return {} + config["name"] = intf + config["bfd"] = utils.parse_conf_cmd_arg( + conf, "hsrp bfd", "enable", "disable" + ) + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/interfaces.py new file mode 100644 index 00000000..0c5f0964 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/interfaces/interfaces.py @@ -0,0 +1,119 @@ +# +# -*- 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)#!/usr/bin/python +""" +The nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.interfaces.interfaces import ( + InterfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + default_intf_enabled, +) + + +class InterfacesFacts(object): + """ The nxos 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 populate_facts(self, connection, ansible_facts, data=None): + """ Populate the facts for interfaces + :param connection: the device connection + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + if not data: + data = connection.get("show running-config | section ^interface") + + config = ("\n" + data).split("\ninterface ") + for conf in config: + conf = conf.strip() + if conf: + obj = self.render_config(self.generated_spec, conf) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("interfaces", None) + facts = {} + 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) + + match = re.search(r"^(\S+)", conf) + intf = match.group(1) + if get_interface_type(intf) == "unknown": + return {} + config["name"] = intf + config["description"] = utils.parse_conf_arg(conf, "description") + config["speed"] = utils.parse_conf_arg(conf, "speed") + config["mtu"] = utils.parse_conf_arg(conf, "mtu") + config["duplex"] = utils.parse_conf_arg(conf, "duplex") + config["mode"] = utils.parse_conf_cmd_arg( + conf, "switchport", "layer2", "layer3" + ) + + config["enabled"] = utils.parse_conf_cmd_arg( + conf, "shutdown", False, True + ) + + config["fabric_forwarding_anycast_gateway"] = utils.parse_conf_cmd_arg( + conf, "fabric forwarding mode anycast-gateway", True + ) + config["ip_forward"] = utils.parse_conf_cmd_arg( + conf, "ip forward", True + ) + + interfaces_cfg = utils.remove_empties(config) + return interfaces_cfg diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/l2_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/l2_interfaces.py new file mode 100644 index 00000000..481b6db2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l2_interfaces/l2_interfaces.py @@ -0,0 +1,109 @@ +# +# -*- 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)#!/usr/bin/python +""" +The nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.l2_interfaces.l2_interfaces import ( + L2_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) + + +class L2_interfacesFacts(object): + """The nxos 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 populate_facts(self, connection, ansible_facts, data=None): + """ Populate the facts for l2_interfaces + :param connection: the device connection + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + if not data: + data = connection.get("show running-config | section ^interface") + + config = ("\n" + data).split("\ninterface ") + for conf in config: + conf = conf.strip() + if conf: + obj = self.render_config(self.generated_spec, conf) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("l2_interfaces", None) + facts = {} + if objs: + facts["l2_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["l2_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) + + match = re.search(r"^(\S+)", conf) + intf = match.group(1) + if get_interface_type(intf) == "unknown": + return {} + + config["name"] = intf + config["mode"] = utils.parse_conf_arg(conf, "switchport mode") + config["ip_forward"] = utils.parse_conf_arg(conf, "ip forward") + config["access"]["vlan"] = utils.parse_conf_arg( + conf, "switchport access vlan" + ) + config["trunk"]["allowed_vlans"] = utils.parse_conf_arg( + conf, "switchport trunk allowed vlan" + ) + config["trunk"]["native_vlan"] = utils.parse_conf_arg( + conf, "switchport trunk native vlan" + ) + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/l3_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/l3_interfaces.py new file mode 100644 index 00000000..18dc6595 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/l3_interfaces/l3_interfaces.py @@ -0,0 +1,144 @@ +# +# -*- 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)#!/usr/bin/python +""" +The nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.l3_interfaces.l3_interfaces import ( + L3_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) + + +class L3_interfacesFacts(object): + """ The nxos 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 populate_facts(self, connection, ansible_facts, data=None): + """ Populate the facts for l3_interfaces + :param connection: the device connection + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + if not data: + data = connection.get("show running-config | section ^interface") + + config = ("\n" + data).split("\ninterface ") + for conf in config: + conf = conf.strip() + if conf: + obj = self.render_config(self.generated_spec, conf) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("l3_interfaces", None) + facts = {} + if objs: + facts["l3_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["l3_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) + match = re.search(r"^(\S+)", conf) + intf = match.group(1) + if get_interface_type(intf) == "unknown": + return {} + config["name"] = intf + config["dot1q"] = utils.parse_conf_arg(conf, "encapsulation dot1[qQ]") + config["redirects"] = utils.parse_conf_cmd_arg( + conf, "no ip redirects", False, True + ) + config["unreachables"] = utils.parse_conf_cmd_arg( + conf, "ip unreachables", True, False + ) + config["evpn_multisite_tracking"] = utils.parse_conf_arg( + conf, "evpn multisite" + ) + ipv4_match = re.compile(r"\n ip address (.*)") + matches = ipv4_match.findall(conf) + if matches: + if matches[0]: + config["ipv4"] = [] + for m in matches: + ipv4_conf = m.split() + addr = ipv4_conf[0] + if addr: + config_dict = {"address": addr} + if len(ipv4_conf) > 1: + d = ipv4_conf[1] + if d == "secondary": + config_dict.update({"secondary": True}) + if len(ipv4_conf) == 4: + if ipv4_conf[2] == "tag": + config_dict.update( + {"tag": int(ipv4_conf[-1])} + ) + elif d == "tag": + config_dict.update({"tag": int(ipv4_conf[-1])}) + config["ipv4"].append(config_dict) + + ipv6_match = re.compile(r"\n ipv6 address (.*)") + matches = ipv6_match.findall(conf) + if matches: + if matches[0]: + config["ipv6"] = [] + for m in matches: + ipv6_conf = m.split() + addr = ipv6_conf[0] + if addr: + config_dict = {"address": addr} + if len(ipv6_conf) > 1: + d = ipv6_conf[1] + if d == "tag": + config_dict.update({"tag": int(ipv6_conf[-1])}) + config["ipv6"].append(config_dict) + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/lacp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/lacp.py new file mode 100644 index 00000000..3813bcd6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp/lacp.py @@ -0,0 +1,93 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.lacp.lacp import ( + LacpArgs, +) + + +class LacpFacts(object): + """ The nxos 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 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 conf + :rtype: dictionary + :returns: facts + """ + if not data: + data = connection.get("show running-config | include lacp") + resources = data.strip() + objs = self.render_config(self.generated_spec, resources) + ansible_facts["ansible_network_resources"].pop("lacp", None) + facts = {} + 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) + + p_match = re.search(r"lacp system-priority (\d+)", conf, re.M) + if p_match: + config["system"]["priority"] = p_match.group(1) + + a_match = re.search(r"lacp system-mac (\S+)", conf, re.M) + if a_match: + address = a_match.group(1) + config["system"]["mac"]["address"] = address + r_match = re.search( + r"lacp system-mac {0} role (\S+)".format(address), conf, re.M + ) + if r_match: + config["system"]["mac"]["role"] = r_match.group(1) + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/lacp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/lacp_interfaces.py new file mode 100644 index 00000000..7e11c93a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lacp_interfaces/lacp_interfaces.py @@ -0,0 +1,119 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.lacp_interfaces.lacp_interfaces import ( + Lacp_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) + + +class Lacp_interfacesFacts(object): + """ The nxos 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 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 conf + :rtype: dictionary + :returns: facts + """ + objs = [] + + if not data: + data = connection.get("show running-config | section ^interface") + + resources = ("\n" + data).split("\ninterface ") + for resource in resources: + if resource and re.search(r"lacp", resource): + obj = self.render_config(self.generated_spec, resource) + if obj and len(obj.keys()) > 1: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("lacp_interfaces", None) + facts = {} + if objs: + facts["lacp_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["lacp_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) + + match = re.search(r"^(\S+)", conf) + intf = match.group(1) + if get_interface_type(intf) == "unknown": + return {} + config["name"] = intf + config["port_priority"] = utils.parse_conf_arg( + conf, "lacp port-priority" + ) + config["rate"] = utils.parse_conf_arg(conf, "lacp rate") + config["mode"] = utils.parse_conf_arg(conf, "lacp mode") + suspend_individual = re.search(r"no lacp suspend-individual", conf) + if suspend_individual: + config["suspend_individual"] = False + max_links = utils.parse_conf_arg(conf, "lacp max-bundle") + if max_links: + config["links"]["max"] = max_links + min_links = utils.parse_conf_arg(conf, "lacp min-links") + if min_links: + config["links"]["min"] = min_links + graceful = re.search(r"no lacp graceful-convergence", conf) + if graceful: + config["convergence"]["graceful"] = False + vpc = re.search(r"lacp vpc-convergence", conf) + if vpc: + config["convergence"]["vpc"] = True + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/lag_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/lag_interfaces.py new file mode 100644 index 00000000..ff287ecc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lag_interfaces/lag_interfaces.py @@ -0,0 +1,112 @@ +# +# -*- 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)#!/usr/bin/python +""" +The nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.lag_interfaces.lag_interfaces import ( + Lag_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, + normalize_interface, +) + + +class Lag_interfacesFacts(object): + """ The nxos 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 populate_facts(self, connection, ansible_facts, data=None): + """ Populate the facts for lag_interfaces + :param connection: the device connection + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + if not data: + data = connection.get("show running-config | section ^interface") + + objs = self.render_config(self.generated_spec, data, connection) + + ansible_facts["ansible_network_resources"].pop("lag_interfaces", None) + facts = {} + if objs: + facts["lag_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["lag_interfaces"].append(utils.remove_empties(cfg)) + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf, connection): + """ + 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 + """ + result = [] + match = re.findall(r"interface (port-channel\d+)", conf) + + for item in match: + result.append({"name": item, "members": []}) + + for intf in conf.split("interface "): + member = {} + match_intf = re.search(r"(port-channel|Ethernet)(\S+)", intf) + if match_intf: + member["member"] = match_intf.group(0) + + match_line = re.search( + r"channel-group\s(?P\d+)(\smode\s(?Pon|active|passive))?", + intf, + ) + if match_line: + member.update(match_line.groupdict()) + + if member and member.get("port_channel", None): + port_channel = "port-channel{0}".format( + member.pop("port_channel") + ) + for x in result: + if x["name"] == port_channel: + x["members"].append(utils.remove_empties(member)) + + return result diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/base.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/base.py new file mode 100644 index 00000000..bfe14e52 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/legacy/base.py @@ -0,0 +1,822 @@ +# -*- 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_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + run_commands, + get_config, + get_capabilities, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, + normalize_interface, +) +from ansible.module_utils.six import iteritems + + +g_config = None + + +class FactsBase(object): + def __init__(self, module): + self.module = module + self.warnings = list() + self.facts = dict() + self.capabilities = get_capabilities(self.module) + + def populate(self): + pass + + def run(self, command, output="text"): + command_string = command + command = {"command": command, "output": output} + resp = run_commands(self.module, [command], check_rc="retry_json") + try: + return resp[0] + except IndexError: + self.warnings.append( + "command %s failed, facts for this command will not be populated" + % command_string + ) + return None + + def get_config(self): + global g_config + if not g_config: + g_config = get_config(self.module) + return g_config + + def transform_dict(self, data, keymap): + transform = dict() + for key, fact in keymap: + if key in data: + transform[fact] = data[key] + return transform + + def transform_iterable(self, iterable, keymap): + for item in iterable: + yield self.transform_dict(item, keymap) + + +class Default(FactsBase): + def populate(self): + data = None + data = self.run("show version") + + if data: + self.facts["serialnum"] = self.parse_serialnum(data) + + data = self.run("show license host-id") + if data: + self.facts["license_hostid"] = self.parse_license_hostid(data) + + self.facts.update(self.platform_facts()) + + def parse_serialnum(self, data): + match = re.search(r"Processor Board ID\s*(\S+)", data, re.M) + if match: + return match.group(1) + + def platform_facts(self): + platform_facts = {} + + resp = self.capabilities + 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 + + def parse_license_hostid(self, data): + match = re.search(r"License hostid: VDH=(.+)$", data, re.M) + if match: + return match.group(1) + + +class Config(FactsBase): + def populate(self): + super(Config, self).populate() + self.facts["config"] = self.get_config() + + +class Features(FactsBase): + def populate(self): + super(Features, self).populate() + data = self.get_config() + + if data: + features = [] + for line in data.splitlines(): + if line.startswith("feature"): + features.append(line.replace("feature", "").strip()) + + self.facts["features_enabled"] = features + + +class Hardware(FactsBase): + def populate(self): + data = self.run("dir") + if data: + self.facts["filesystems"] = self.parse_filesystems(data) + + data = None + data = self.run("show system resources", output="json") + + if data: + if isinstance(data, dict): + self.facts["memtotal_mb"] = ( + int(data["memory_usage_total"]) / 1024 + ) + self.facts["memfree_mb"] = ( + int(data["memory_usage_free"]) / 1024 + ) + else: + self.facts["memtotal_mb"] = self.parse_memtotal_mb(data) + self.facts["memfree_mb"] = self.parse_memfree_mb(data) + + def parse_filesystems(self, data): + return re.findall(r"^Usage for (\S+)//", data, re.M) + + def parse_memtotal_mb(self, data): + match = re.search(r"(\S+)K(\s+|)total", data, re.M) + if match: + memtotal = match.group(1) + return int(memtotal) / 1024 + + def parse_memfree_mb(self, data): + match = re.search(r"(\S+)K(\s+|)free", data, re.M) + if match: + memfree = match.group(1) + return int(memfree) / 1024 + + +class Interfaces(FactsBase): + + INTERFACE_MAP = frozenset( + [ + ("state", "state"), + ("desc", "description"), + ("eth_bw", "bandwidth"), + ("eth_duplex", "duplex"), + ("eth_speed", "speed"), + ("eth_mode", "mode"), + ("eth_hw_addr", "macaddress"), + ("eth_mtu", "mtu"), + ("eth_hw_desc", "type"), + ] + ) + + INTERFACE_SVI_MAP = frozenset( + [ + ("svi_line_proto", "state"), + ("svi_bw", "bandwidth"), + ("svi_mac", "macaddress"), + ("svi_mtu", "mtu"), + ("type", "type"), + ] + ) + + INTERFACE_IPV4_MAP = frozenset( + [("eth_ip_addr", "address"), ("eth_ip_mask", "masklen")] + ) + + INTERFACE_SVI_IPV4_MAP = frozenset( + [("svi_ip_addr", "address"), ("svi_ip_mask", "masklen")] + ) + + INTERFACE_IPV6_MAP = frozenset([("addr", "address"), ("prefix", "subnet")]) + + def ipv6_structure_op_supported(self): + data = self.capabilities + if data: + nxos_os_version = data["device_info"]["network_os_version"] + unsupported_versions = ["I2", "F1", "A8"] + for ver in unsupported_versions: + if ver in nxos_os_version: + return False + return True + + def populate(self): + self.facts["all_ipv4_addresses"] = list() + self.facts["all_ipv6_addresses"] = list() + self.facts["neighbors"] = {} + data = None + + data = self.run("show interface", output="json") + + if data: + if isinstance(data, dict): + self.facts["interfaces"] = self.populate_structured_interfaces( + data + ) + else: + interfaces = self.parse_interfaces(data) + self.facts["interfaces"] = self.populate_interfaces(interfaces) + + if self.ipv6_structure_op_supported(): + data = self.run("show ipv6 interface", output="json") + else: + data = None + if data: + if isinstance(data, dict): + self.populate_structured_ipv6_interfaces(data) + else: + interfaces = self.parse_interfaces(data) + self.populate_ipv6_interfaces(interfaces) + + data = self.run("show lldp neighbors", output="json") + if data: + if isinstance(data, dict): + self.facts["neighbors"].update( + self.populate_structured_neighbors_lldp(data) + ) + else: + self.facts["neighbors"].update(self.populate_neighbors(data)) + + data = self.run("show cdp neighbors detail", output="json") + if data: + if isinstance(data, dict): + self.facts["neighbors"].update( + self.populate_structured_neighbors_cdp(data) + ) + else: + self.facts["neighbors"].update( + self.populate_neighbors_cdp(data) + ) + + self.facts["neighbors"].pop(None, None) # Remove null key + + def populate_structured_interfaces(self, data): + interfaces = dict() + data = data["TABLE_interface"]["ROW_interface"] + + if isinstance(data, dict): + data = [data] + + for item in data: + name = item["interface"] + + intf = dict() + if "type" in item: + intf.update(self.transform_dict(item, self.INTERFACE_SVI_MAP)) + else: + intf.update(self.transform_dict(item, self.INTERFACE_MAP)) + + if "eth_ip_addr" in item: + intf["ipv4"] = self.transform_dict( + item, self.INTERFACE_IPV4_MAP + ) + self.facts["all_ipv4_addresses"].append(item["eth_ip_addr"]) + + if "svi_ip_addr" in item: + intf["ipv4"] = self.transform_dict( + item, self.INTERFACE_SVI_IPV4_MAP + ) + self.facts["all_ipv4_addresses"].append(item["svi_ip_addr"]) + + interfaces[name] = intf + + return interfaces + + def populate_structured_ipv6_interfaces(self, data): + try: + data = data["TABLE_intf"] + if data: + if isinstance(data, dict): + data = [data] + for item in data: + name = item["ROW_intf"]["intf-name"] + intf = self.facts["interfaces"][name] + intf["ipv6"] = self.transform_dict( + item, self.INTERFACE_IPV6_MAP + ) + try: + addr = item["ROW_intf"]["addr"] + except KeyError: + addr = item["ROW_intf"]["TABLE_addr"]["ROW_addr"][ + "addr" + ] + self.facts["all_ipv6_addresses"].append(addr) + else: + return "" + except TypeError: + return "" + + def populate_structured_neighbors_lldp(self, data): + objects = dict() + data = data["TABLE_nbor"]["ROW_nbor"] + + if isinstance(data, dict): + data = [data] + + for item in data: + local_intf = normalize_interface(item["l_port_id"]) + objects[local_intf] = list() + nbor = dict() + nbor["port"] = item["port_id"] + nbor["host"] = nbor["sysname"] = item["chassis_id"] + objects[local_intf].append(nbor) + + return objects + + def populate_structured_neighbors_cdp(self, data): + objects = dict() + data = data["TABLE_cdp_neighbor_detail_info"][ + "ROW_cdp_neighbor_detail_info" + ] + + if isinstance(data, dict): + data = [data] + + for item in data: + local_intf = item["intf_id"] + objects[local_intf] = list() + nbor = dict() + nbor["port"] = item["port_id"] + nbor["host"] = nbor["sysname"] = item["device_id"] + objects[local_intf].append(nbor) + + return objects + + def parse_interfaces(self, data): + parsed = dict() + key = "" + for line in data.split("\n"): + if len(line) == 0: + continue + elif line.startswith("admin") or line[0] == " ": + parsed[key] += "\n%s" % line + else: + match = re.match(r"^(\S+)", line) + if match: + key = match.group(1) + if not key.startswith("admin") or not key.startswith( + "IPv6 Interface" + ): + parsed[key] = line + return parsed + + def populate_interfaces(self, interfaces): + facts = dict() + for key, value in iteritems(interfaces): + intf = dict() + if get_interface_type(key) == "svi": + intf["state"] = self.parse_state(key, value, intf_type="svi") + intf["macaddress"] = self.parse_macaddress( + value, intf_type="svi" + ) + intf["mtu"] = self.parse_mtu(value, intf_type="svi") + intf["bandwidth"] = self.parse_bandwidth( + value, intf_type="svi" + ) + intf["type"] = self.parse_type(value, intf_type="svi") + if "Internet Address" in value: + intf["ipv4"] = self.parse_ipv4_address( + value, intf_type="svi" + ) + facts[key] = intf + else: + intf["state"] = self.parse_state(key, value) + intf["description"] = self.parse_description(value) + intf["macaddress"] = self.parse_macaddress(value) + intf["mode"] = self.parse_mode(value) + intf["mtu"] = self.parse_mtu(value) + intf["bandwidth"] = self.parse_bandwidth(value) + intf["duplex"] = self.parse_duplex(value) + intf["speed"] = self.parse_speed(value) + intf["type"] = self.parse_type(value) + if "Internet Address" in value: + intf["ipv4"] = self.parse_ipv4_address(value) + facts[key] = intf + + return facts + + def parse_state(self, key, value, intf_type="ethernet"): + match = None + if intf_type == "svi": + match = re.search(r"line protocol is\s*(\S+)", value, re.M) + else: + match = re.search(r"%s is\s*(\S+)" % key, value, re.M) + + if match: + return match.group(1) + + def parse_macaddress(self, value, intf_type="ethernet"): + match = None + if intf_type == "svi": + match = re.search(r"address is\s*(\S+)", value, re.M) + else: + match = re.search(r"address:\s*(\S+)", value, re.M) + + if match: + return match.group(1) + + def parse_mtu(self, value, intf_type="ethernet"): + match = re.search(r"MTU\s*(\S+)", value, re.M) + if match: + return match.group(1) + + def parse_bandwidth(self, value, intf_type="ethernet"): + match = re.search(r"BW\s*(\S+)", value, re.M) + if match: + return match.group(1) + + def parse_type(self, value, intf_type="ethernet"): + match = None + if intf_type == "svi": + match = re.search(r"Hardware is\s*(\S+)", value, re.M) + else: + match = re.search(r"Hardware:\s*(.+),", value, re.M) + + if match: + return match.group(1) + + def parse_description(self, value, intf_type="ethernet"): + match = re.search(r"Description: (.+)$", value, re.M) + if match: + return match.group(1) + + def parse_mode(self, value, intf_type="ethernet"): + match = re.search(r"Port mode is (\S+)", value, re.M) + if match: + return match.group(1) + + def parse_duplex(self, value, intf_type="ethernet"): + match = re.search(r"(\S+)-duplex", value, re.M) + if match: + return match.group(1) + + def parse_speed(self, value, intf_type="ethernet"): + match = re.search(r"duplex, (.+)$", value, re.M) + if match: + return match.group(1) + + def parse_ipv4_address(self, value, intf_type="ethernet"): + ipv4 = {} + match = re.search(r"Internet Address is (.+)$", value, re.M) + if match: + address = match.group(1) + addr = address.split("/")[0] + ipv4["address"] = address.split("/")[0] + ipv4["masklen"] = address.split("/")[1] + self.facts["all_ipv4_addresses"].append(addr) + return ipv4 + + def populate_neighbors(self, data): + objects = dict() + # if there are no neighbors the show command returns + # ERROR: No neighbour information + if data.startswith("ERROR"): + return dict() + + regex = re.compile(r"(\S+)\s+(\S+)\s+\d+\s+\w+\s+(\S+)") + + for item in data.split("\n")[4:-1]: + match = regex.match(item) + if match: + nbor = dict() + nbor["host"] = nbor["sysname"] = match.group(1) + nbor["port"] = match.group(3) + local_intf = normalize_interface(match.group(2)) + if local_intf not in objects: + objects[local_intf] = [] + objects[local_intf].append(nbor) + + return objects + + def populate_neighbors_cdp(self, data): + facts = dict() + + for item in data.split("----------------------------------------"): + if item == "": + continue + local_intf = self.parse_lldp_intf(item) + if local_intf not in facts: + facts[local_intf] = list() + + fact = dict() + fact["port"] = self.parse_lldp_port(item) + fact["sysname"] = self.parse_lldp_sysname(item) + facts[local_intf].append(fact) + + return facts + + def parse_lldp_intf(self, data): + match = re.search(r"Interface:\s*(\S+)", data, re.M) + if match: + return match.group(1).strip(",") + + def parse_lldp_port(self, data): + match = re.search(r"Port ID \(outgoing port\):\s*(\S+)", data, re.M) + if match: + return match.group(1) + + def parse_lldp_sysname(self, data): + match = re.search(r"Device ID:(.+)$", data, re.M) + if match: + return match.group(1) + + def populate_ipv6_interfaces(self, interfaces): + facts = dict() + for key, value in iteritems(interfaces): + intf = dict() + intf["ipv6"] = self.parse_ipv6_address(value) + facts[key] = intf + + def parse_ipv6_address(self, value): + ipv6 = {} + match_addr = re.search(r"IPv6 address:\s*(\S+)", value, re.M) + if match_addr: + addr = match_addr.group(1) + ipv6["address"] = addr + self.facts["all_ipv6_addresses"].append(addr) + match_subnet = re.search(r"IPv6 subnet:\s*(\S+)", value, re.M) + if match_subnet: + ipv6["subnet"] = match_subnet.group(1) + + return ipv6 + + +class Legacy(FactsBase): + # facts from nxos_facts 2.1 + + VERSION_MAP = frozenset( + [ + ("host_name", "_hostname"), + ("kickstart_ver_str", "_os"), + ("chassis_id", "_platform"), + ] + ) + + MODULE_MAP = frozenset( + [ + ("model", "model"), + ("modtype", "type"), + ("ports", "ports"), + ("status", "status"), + ] + ) + + FAN_MAP = frozenset( + [ + ("fanname", "name"), + ("fanmodel", "model"), + ("fanhwver", "hw_ver"), + ("fandir", "direction"), + ("fanstatus", "status"), + ] + ) + + POWERSUP_MAP = frozenset( + [ + ("psmodel", "model"), + ("psnum", "number"), + ("ps_status", "status"), + ("ps_status_3k", "status"), + ("actual_out", "actual_output"), + ("actual_in", "actual_in"), + ("total_capa", "total_capacity"), + ("input_type", "input_type"), + ("watts", "watts"), + ("amps", "amps"), + ] + ) + + def populate(self): + data = None + + data = self.run("show version", output="json") + if data: + if isinstance(data, dict): + self.facts.update(self.transform_dict(data, self.VERSION_MAP)) + else: + self.facts["hostname"] = self.parse_hostname(data) + self.facts["os"] = self.parse_os(data) + self.facts["platform"] = self.parse_platform(data) + + data = self.run("show interface", output="json") + if data: + if isinstance(data, dict): + self.facts[ + "interfaces_list" + ] = self.parse_structured_interfaces(data) + else: + self.facts["interfaces_list"] = self.parse_interfaces(data) + + data = self.run("show vlan brief", output="json") + if data: + if isinstance(data, dict): + self.facts["vlan_list"] = self.parse_structured_vlans(data) + else: + self.facts["vlan_list"] = self.parse_vlans(data) + + data = self.run("show module", output="json") + if data: + if isinstance(data, dict): + self.facts["module"] = self.parse_structured_module(data) + else: + self.facts["module"] = self.parse_module(data) + + data = self.run("show environment fan", output="json") + if data: + if isinstance(data, dict): + self.facts["fan_info"] = self.parse_structured_fan_info(data) + else: + self.facts["fan_info"] = self.parse_fan_info(data) + + data = self.run("show environment power", output="json") + if data: + if isinstance(data, dict): + self.facts[ + "power_supply_info" + ] = self.parse_structured_power_supply_info(data) + else: + self.facts["power_supply_info"] = self.parse_power_supply_info( + data + ) + + def parse_structured_interfaces(self, data): + objects = list() + data = data["TABLE_interface"]["ROW_interface"] + if isinstance(data, dict): + objects.append(data["interface"]) + elif isinstance(data, list): + for item in data: + objects.append(item["interface"]) + return objects + + def parse_structured_vlans(self, data): + objects = list() + data = data["TABLE_vlanbriefxbrief"]["ROW_vlanbriefxbrief"] + if isinstance(data, dict): + objects.append(data["vlanshowbr-vlanid-utf"]) + elif isinstance(data, list): + for item in data: + objects.append(item["vlanshowbr-vlanid-utf"]) + return objects + + def parse_structured_module(self, data): + data = data["TABLE_modinfo"]["ROW_modinfo"] + if isinstance(data, dict): + data = [data] + objects = list(self.transform_iterable(data, self.MODULE_MAP)) + return objects + + def parse_structured_fan_info(self, data): + objects = list() + + for key in ("fandetails", "fandetails_3k"): + if data.get(key): + try: + data = data[key]["TABLE_faninfo"]["ROW_faninfo"] + except KeyError: + # Some virtual images don't actually report faninfo. In this case, move on and + # just return an empty list. + pass + else: + objects = list(self.transform_iterable(data, self.FAN_MAP)) + break + + return objects + + def parse_structured_power_supply_info(self, data): + ps_data = data.get("powersup", {}) + if ps_data.get("TABLE_psinfo_n3k"): + fact = ps_data["TABLE_psinfo_n3k"]["ROW_psinfo_n3k"] + else: + # {TABLE,ROW}_psinfo keys have been renamed to + # {TABLE,ROW}_ps_info in later NX-OS releases + tab_key, row_key = "TABLE_psinfo", "ROW_psinfo" + if tab_key not in ps_data: + tab_key, row_key = "TABLE_ps_info", "ROW_ps_info" + + ps_tab_data = ps_data[tab_key] + + if isinstance(ps_tab_data, list): + fact = [] + for i in ps_tab_data: + fact.append(i[row_key]) + else: + fact = ps_tab_data[row_key] + + objects = list(self.transform_iterable(fact, self.POWERSUP_MAP)) + return objects + + def parse_hostname(self, data): + match = re.search(r"\s+Device name:\s+(\S+)", data, re.M) + if match: + return match.group(1) + + def parse_os(self, data): + match = re.search(r"\s+system:\s+version\s*(\S+)", data, re.M) + if match: + return match.group(1) + else: + match = re.search(r"\s+kickstart:\s+version\s*(\S+)", data, re.M) + if match: + return match.group(1) + + def parse_platform(self, data): + match = re.search(r"Hardware\n\s+cisco\s+(\S+\s+\S+)", data, re.M) + if match: + return match.group(1) + + def parse_interfaces(self, data): + objects = list() + for line in data.split("\n"): + if len(line) == 0: + continue + elif line.startswith("admin") or line[0] == " ": + continue + else: + match = re.match(r"^(\S+)", line) + if match: + intf = match.group(1) + if get_interface_type(intf) != "unknown": + objects.append(intf) + return objects + + def parse_vlans(self, data): + objects = list() + for line in data.splitlines(): + if line == "": + continue + if line[0].isdigit(): + vlan = line.split()[0] + objects.append(vlan) + return objects + + def parse_module(self, data): + objects = list() + for line in data.splitlines(): + if line == "": + break + if line[0].isdigit(): + obj = {} + match_port = re.search(r"\d\s*(\d*)", line, re.M) + if match_port: + obj["ports"] = match_port.group(1) + + match = re.search(r"\d\s*\d*\s*(.+)$", line, re.M) + if match: + l = match.group(1).split(" ") + items = list() + for item in l: + if item == "": + continue + items.append(item.strip()) + + if items: + obj["type"] = items[0] + obj["model"] = items[1] + obj["status"] = items[2] + + objects.append(obj) + return objects + + def parse_fan_info(self, data): + objects = list() + + for l in data.splitlines(): + if "-----------------" in l or "Status" in l: + continue + line = l.split() + if len(line) > 1: + obj = {} + obj["name"] = line[0] + obj["model"] = line[1] + obj["hw_ver"] = line[-2] + obj["status"] = line[-1] + objects.append(obj) + return objects + + def parse_power_supply_info(self, data): + objects = list() + + for l in data.splitlines(): + if l == "": + break + if l[0].isdigit(): + obj = {} + line = l.split() + obj["model"] = line[1] + obj["number"] = line[0] + obj["status"] = line[-1] + + objects.append(obj) + return objects diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/lldp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/lldp_global.py new file mode 100644 index 00000000..d9898840 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_global/lldp_global.py @@ -0,0 +1,113 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.lldp_global.lldp_global import ( + Lldp_globalArgs, +) + + +class Lldp_globalFacts(object): + """ The nxos 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 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 = connection.get("show running-config | include lldp") + + objs = {} + objs = self.render_config(self.generated_spec, data) + ansible_facts["ansible_network_resources"].pop("lldp_global", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + facts["lldp_global"] = params["config"] + facts = utils.remove_empties(facts) + 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) + conf = re.split("\n", conf) + for command in conf: + param = re.search( + r"(.*)lldp (\w+(-?)\w+)", command + ) # get the word after 'lldp' + if param: + # get the nested-dict/value for that param + key2 = re.search(r"%s(.*)" % param.group(2), command) + key2 = key2.group(1).strip() + key1 = param.group(2).replace("-", "_") + + if key1 == "portid_subtype": + key1 = "port_id" + config[key1] = key2 + elif key1 == "tlv_select": + key2 = key2.split() + key2[0] = key2[0].replace("-", "_") + if len(key2) == 1: + if ( + "port" in key2[0] or "system" in key2[0] + ): # nested dicts + key2 = key2[0].split("_") + # config[tlv_select][system][name]=False + config[key1][key2[0]][key2[1]] = False + else: + # config[tlv_select][dcbxp]=False + config[key1][key2[0]] = False + else: + # config[tlv_select][management_address][v6]=False + config[key1][key2[0]][key2[1]] = False + else: + config[key1] = key2 # config[reinit]=4 + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/lldp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/lldp_interfaces.py new file mode 100644 index 00000000..ebf13bc1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/lldp_interfaces/lldp_interfaces.py @@ -0,0 +1,129 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.lldp_interfaces.lldp_interfaces import ( + Lldp_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.utils import ( + get_interface_type, +) + + +class Lldp_interfacesFacts(object): + """ The nxos 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 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 lldp_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) + + objs = [] + + data = data.split("interface") + resources = [] + + for i in range(len(data)): + intf = data[i].split("\n") + for l in range(1, len(intf)): + if not re.search("lldp", intf[l]): + intf[l] = "" + intf = list(filter(None, intf)) + intf = "".join(i for i in intf) + resources.append(intf) + + for resource in resources: + if resource: # and re.search(r'lldp', resource): + obj = self.render_config(self.generated_spec, resource) + if obj and len(obj.keys()) >= 1: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("lldp_interfaces", None) + facts = {} + if objs: + facts["lldp_interfaces"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["lldp_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) + match = re.search(r"^ (\S+)", conf) + if match is None: + return {} + intf = match.group(1) + if get_interface_type(intf) not in ["management", "ethernet"]: + return {} + config["name"] = intf + if "lldp receive" in conf: # for parsed state only + config["receive"] = True + if "no lldp receive" in conf: + config["receive"] = False + + if "lldp transmit" in conf: # for parsed state only + config["transmit"] = True + if "no lldp transmit" in conf: + config["transmit"] = False + if "management-address" in conf: + config["tlv_set"]["management_address"] = re.search( + r"management-address (\S*)", conf + ).group(1) + if "vlan" in conf: + config["tlv_set"]["vlan"] = re.search(r"vlan (\S*)", conf).group(1) + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/ospf_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/ospf_interfaces.py new file mode 100644 index 00000000..44726688 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospf_interfaces/ospf_interfaces.py @@ -0,0 +1,82 @@ +# -*- 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 nxos 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. +""" + +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.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.ospf_interfaces import ( + Ospf_interfacesTemplate, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospf_interfaces.ospf_interfaces import ( + Ospf_interfacesArgs, +) + + +class Ospf_interfacesFacts(object): + """ The nxos 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 = {} + objs = [] + + if not data: + data = self.get_config(connection) + + # parse native config using the Ospf_interfaces template + ospf_interfaces_parser = Ospf_interfacesTemplate( + lines=data.splitlines() + ) + objs = list(ospf_interfaces_parser.parse().values()) + if objs: + for item in objs: + item["address_family"] = list(item["address_family"].values()) + for af in item["address_family"]: + if af.get("processes"): + af["processes"] = list(af["processes"].values()) + + ansible_facts["ansible_network_resources"].pop("ospf_interfaces", None) + + params = utils.remove_empties( + utils.validate_config(self.argument_spec, {"config": objs}) + ) + + facts["ospf_interfaces"] = params.get("config", []) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/ospfv2.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/ospfv2.py new file mode 100644 index 00000000..c0c58a3f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv2/ospfv2.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) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +""" +The nxos snmp 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 copy import deepcopy + +from ansible.module_utils.six import iteritems +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.ospfv2 import ( + Ospfv2Template, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospfv2.ospfv2 import ( + Ospfv2Args, +) + + +class Ospfv2Facts(object): + """ The nxos snmp 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_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 ospf .*'" + ) + + 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 conf + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_config(connection) + + ipv4 = {"processes": []} + for section in data.split("router "): + rmmod = Ospfv2Template(lines=section.splitlines()) + entry = rmmod.parse() + + if entry: + global_vals = entry.get("vrfs", {}).pop("vrf_", {}) + for key, value in iteritems(global_vals): + entry[key] = value + + if "vrfs" in entry: + entry["vrfs"] = list(entry["vrfs"].values()) + + for vrf in entry["vrfs"]: + if "areas" in vrf: + vrf["areas"] = list(vrf["areas"].values()) + + if "areas" in entry: + entry["areas"] = list(entry["areas"].values()) + + ipv4["processes"].append(entry) + + ansible_facts["ansible_network_resources"].pop("ospfv2", None) + facts = {} + params = utils.validate_config(self.argument_spec, {"config": ipv4}) + params = utils.remove_empties(params) + + facts["ospfv2"] = params.get("config", []) + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/ospfv3.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/ospfv3.py new file mode 100644 index 00000000..9704b864 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/ospfv3/ospfv3.py @@ -0,0 +1,93 @@ +# -*- 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 nxos 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. +""" +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.cisco.nxos.plugins.module_utils.network.nxos.rm_templates.ospfv3 import ( + Ospfv3Template, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospfv3.ospfv3 import ( + Ospfv3Args, +) + + +class Ospfv3Facts(object): + """ The nxos ospfv3 facts class + """ + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Ospfv3Args.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 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 + """ + if not data: + data = self.get_config(connection) + + ipv6 = {"processes": []} + for section in data.split("router "): + rmmod = Ospfv3Template(lines=section.splitlines()) + entry = rmmod.parse() + + if entry: + global_vals = entry.get("vrfs", {}).pop("vrf_", {}) + for key, value in iteritems(global_vals): + entry[key] = value + + if "vrfs" in entry: + entry["vrfs"] = list(entry["vrfs"].values()) + + for vrf in entry["vrfs"]: + if "areas" in vrf: + vrf["areas"] = list(vrf["areas"].values()) + + if "areas" in entry: + entry["areas"] = list(entry["areas"].values()) + + if "address_family" in entry: + if "areas" in entry["address_family"]: + entry["address_family"]["areas"] = list( + entry["address_family"]["areas"].values() + ) + + ipv6["processes"].append(entry) + + ansible_facts["ansible_network_resources"].pop("ospfv3", None) + facts = {} + params = utils.validate_config(self.argument_spec, {"config": ipv6}) + params = utils.remove_empties(params) + + facts["ospfv3"] = params.get("config", []) + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/static_routes.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/static_routes.py new file mode 100644 index 00000000..e887fd5f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/static_routes/static_routes.py @@ -0,0 +1,245 @@ +# +# -*- 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 nxos 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.static_routes.static_routes import ( + Static_routesArgs, +) + + +class Static_routesFacts(object): + """ The nxos 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, data): + vrf_data = [] + non_vrf_data = [] + if not data: + non_vrf_data = connection.get( + "show running-config | include '^ip(v6)* route'" + ) + vrf_data = connection.get( + "show running-config | section '^vrf context'" + ) + if non_vrf_data: + non_vrf_data = non_vrf_data.split("\n") + else: + non_vrf_data = [] + vrf_data = vrf_data.split("\nvrf context") + # as we split based on 'vrf context', it is stripped from the data except the first element + else: + # used for parsed state where data is from the 'running-config' key + data = data.split("\n") + i = 0 + while i <= (len(data) - 1): + if "vrf context " in data[i]: + vrf_conf = data[i] + j = i + 1 + while j < len(data) and "vrf context " not in data[j]: + vrf_conf += "\n" + data[j] + j += 1 + i = j + vrf_data.append(vrf_conf) + else: + non_vrf_data.append(data[i]) + i += 1 + + new_vrf_data = [] + for v in vrf_data: + if re.search(r"\n\s*ip(v6)? route", v): + new_vrf_data.append(v) + # dont consider vrf if it does not have routes + for i in range(len(new_vrf_data)): + if not re.search("^vrf context", new_vrf_data[i]): + new_vrf_data[i] = "vrf context" + new_vrf_data[i] + + resources = non_vrf_data + new_vrf_data + return resources + + 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 + """ + objs = [] + resources = self.get_device_data(connection, data) + objs = self.render_config(self.generated_spec, resources) + ansible_facts["ansible_network_resources"].pop("static_routes", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + params = utils.remove_empties(params) + for c in params["config"]: + if c == {"vrf": "default"}: + params["config"].remove(c) + facts["static_routes"] = params["config"] + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def get_inner_dict(self, conf, inner_dict): + """ + This method parses the command to create the innermost dictionary of the config + """ + conf = re.sub(r"\s*ip(v6)? route", "", conf) + # strip 'ip route' + inner_dict["dest"] = re.match(r"^\s*(\S+\/\d+) .*", conf).group(1) + + # ethernet1/2/23 + iface = re.match( + r".* (Ethernet|loopback|mgmt|port\-channel)(\S*) .*", conf + ) + i = ["Ethernet", "loopback", "mgmt", "port-channel"] + if iface and iface.group(1) in i: + inner_dict["interface"] = (iface.group(1)) + (iface.group(2)) + conf = re.sub(inner_dict["interface"], "", conf) + + if "." in inner_dict["dest"]: + conf = re.sub(inner_dict["dest"], "", conf) + inner_dict["afi"] = "ipv4" + ipv4 = re.match( + r".* (\d+\.\d+\.\d+\.\d+\/?\d*).*", conf + ) # gets next hop ip + if ipv4: + inner_dict["forward_router_address"] = ipv4.group(1) + conf = re.sub(inner_dict["forward_router_address"], "", conf) + else: + inner_dict["afi"] = "ipv6" + conf = re.sub(inner_dict["dest"], "", conf) + ipv6 = re.match(r".* (\S*:\S*:\S*\/?\d*).*", conf) + if ipv6: + inner_dict["forward_router_address"] = ipv6.group(1) + conf = re.sub(inner_dict["forward_router_address"], "", conf) + + nullif = re.search(r"null0", conf, re.IGNORECASE) + if nullif: + inner_dict["interface"] = "Null0" + inner_dict["forward_router_address"] = None + return inner_dict # dest IP not needed for null if + + keywords = ["vrf", "name", "tag", "track"] + for key in keywords: + pattern = re.match(r".* (?:%s) (\S+).*" % key, conf) + if pattern: + if key == "vrf": + key = "dest_vrf" + elif key == "name": + key = "route_name" + inner_dict[key] = pattern.group(1).strip() + conf = re.sub(key + " " + inner_dict[key], "", conf) + + pref = re.match(r"(?:.*) (\d+)$", conf) + if pref: + # if something is left at the end without any key, it is the pref + inner_dict["admin_distance"] = pref.group(1) + return inner_dict + + def get_command(self, conf, afi_list, dest_list, af): + inner_dict = {} + inner_dict = self.get_inner_dict(conf, inner_dict) + if inner_dict["afi"] not in afi_list: + af.append({"afi": inner_dict["afi"], "routes": []}) + afi_list.append(inner_dict["afi"]) + + next_hop = {} + params = [ + "forward_router_address", + "interface", + "admin_distance", + "route_name", + "tag", + "track", + "dest_vrf", + ] + for p in params: + if p in inner_dict.keys(): + next_hop.update({p: inner_dict[p]}) + + if inner_dict["dest"] not in dest_list: + dest_list.append(inner_dict["dest"]) + af[-1]["routes"].append( + {"dest": inner_dict["dest"], "next_hops": []} + ) + # if 'dest' is new, create new list under 'routes' + af[-1]["routes"][-1]["next_hops"].append(next_hop) + else: + af[-1]["routes"][-1]["next_hops"].append(next_hop) + # just append if dest already exists + return af + + def render_config(self, spec, con): + """ + 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 = [] + global_afi_list = [] + global_af = [] + global_dest_list = [] + if con: + for conf in con: + if conf.startswith("vrf context"): + svrf = re.match(r"vrf context (\S+)\n", conf).group(1) + afi_list = [] + af = [] + dest_list = [] + config_dict = {"vrf": svrf, "address_families": []} + conf = conf.split("\n") + # considering from the second line as first line is 'vrf context..' + conf = conf[1:] + for c in conf: + if "ip route" in c or "ipv6 route" in c: + self.get_command(c, afi_list, dest_list, af) + config_dict["address_families"] = af + config.append(config_dict) + else: + if "ip route" in conf or "ipv6 route" in conf: + self.get_command( + conf, global_afi_list, global_dest_list, global_af + ) + if global_af: + config.append( + utils.remove_empties({"address_families": global_af}) + ) + return config diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/telemetry.py new file mode 100644 index 00000000..47fdf118 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/telemetry/telemetry.py @@ -0,0 +1,210 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The nxos telemetry 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.cisco.nxos.plugins.module_utils.network.nxos.argspec.telemetry.telemetry import ( + TelemetryArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.cmdref.telemetry.telemetry import ( + TMS_GLOBAL, + TMS_DESTGROUP, + TMS_SENSORGROUP, + TMS_SUBSCRIPTION, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.telemetry.telemetry import ( + get_instance_data, + cr_key_lookup, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.utils.telemetry.telemetry import ( + normalize_data, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + NxosCmdRef, +) + + +class TelemetryFacts(object): + """ The nxos telemetry fact class + """ + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = TelemetryArgs.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 telemetry + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + if connection: # just for linting purposes, remove + pass + + cmd_ref = {} + cmd_ref["TMS_GLOBAL"] = {} + cmd_ref["TMS_DESTGROUP"] = {} + cmd_ref["TMS_SENSORGROUP"] = {} + cmd_ref["TMS_SUBSCRIPTION"] = {} + + # For fact gathering, module state should be 'present' when using + # NxosCmdRef to query state + if self._module.params.get("state"): + saved_module_state = self._module.params["state"] + self._module.params["state"] = "present" + + # Get Telemetry Global Data + cmd_ref["TMS_GLOBAL"]["ref"] = [] + cmd_ref["TMS_GLOBAL"]["ref"].append( + NxosCmdRef(self._module, TMS_GLOBAL) + ) + ref = cmd_ref["TMS_GLOBAL"]["ref"][0] + ref.set_context() + ref.get_existing() + device_cache = ref.cache_existing + + if device_cache is None: + device_cache_lines = [] + else: + device_cache_lines = device_cache.split("\n") + + # Get Telemetry Destination Group Data + cmd_ref["TMS_DESTGROUP"]["ref"] = [] + for line in device_cache_lines: + if re.search(r"destination-group", line): + resource_key = line.strip() + cmd_ref["TMS_DESTGROUP"]["ref"].append( + NxosCmdRef(self._module, TMS_DESTGROUP) + ) + ref = cmd_ref["TMS_DESTGROUP"]["ref"][-1] + ref.set_context([resource_key]) + ref.get_existing(device_cache) + normalize_data(ref) + + # Get Telemetry Sensorgroup Group Data + cmd_ref["TMS_SENSORGROUP"]["ref"] = [] + for line in device_cache_lines: + if re.search(r"sensor-group", line): + resource_key = line.strip() + cmd_ref["TMS_SENSORGROUP"]["ref"].append( + NxosCmdRef(self._module, TMS_SENSORGROUP) + ) + ref = cmd_ref["TMS_SENSORGROUP"]["ref"][-1] + ref.set_context([resource_key]) + ref.get_existing(device_cache) + + # Get Telemetry Subscription Data + cmd_ref["TMS_SUBSCRIPTION"]["ref"] = [] + for line in device_cache_lines: + if re.search(r"subscription", line): + resource_key = line.strip() + cmd_ref["TMS_SUBSCRIPTION"]["ref"].append( + NxosCmdRef(self._module, TMS_SUBSCRIPTION) + ) + ref = cmd_ref["TMS_SUBSCRIPTION"]["ref"][-1] + ref.set_context([resource_key]) + ref.get_existing(device_cache) + + objs = [] + objs = self.render_config(self.generated_spec, cmd_ref) + facts = {"telemetry": {}} + if objs: + # params = utils.validate_config(self.argument_spec, {'config': objs}) + facts["telemetry"] = objs + + ansible_facts["ansible_network_resources"].update(facts) + if self._module.params.get("state"): + self._module.params["state"] = saved_module_state + return ansible_facts + + def render_config(self, spec, cmd_ref): + """ + 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["destination_groups"] = [] + config["sensor_groups"] = [] + config["subscriptions"] = [] + managed_objects = [ + "TMS_GLOBAL", + "TMS_DESTGROUP", + "TMS_SENSORGROUP", + "TMS_SUBSCRIPTION", + ] + + # Walk the argspec and cmd_ref objects and build out config dict. + for key in config.keys(): + for mo in managed_objects: + for cr in cmd_ref[mo]["ref"]: + cr_keys = cr_key_lookup(key, mo) + for cr_key in cr_keys: + if cr._ref.get(cr_key) and cr._ref[cr_key].get( + "existing" + ): + if isinstance(config[key], dict): + for k in config[key].keys(): + for existing_key in cr._ref[cr_key][ + "existing" + ].keys(): + config[key][k] = cr._ref[cr_key][ + "existing" + ][existing_key][k] + continue + if isinstance(config[key], list): + for existing_key in cr._ref[cr_key][ + "existing" + ].keys(): + data = get_instance_data( + key, cr_key, cr, existing_key + ) + config[key].append(data) + continue + for existing_key in cr._ref[cr_key][ + "existing" + ].keys(): + config[key] = cr._ref[cr_key]["existing"][ + existing_key + ] + elif cr._ref.get(cr_key): + data = get_instance_data(key, cr_key, cr, None) + if ( + isinstance(config[key], list) + and data not in config[key] + ): + config[key].append(data) + + return utils.remove_empties(config) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/vlans.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/vlans.py new file mode 100644 index 00000000..78951140 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/facts/vlans/vlans.py @@ -0,0 +1,192 @@ +# +# -*- 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)#!/usr/bin/python + +""" +The nxos 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 +import ast +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + parse_conf_arg, + parse_conf_cmd_arg, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.vlans.vlans import ( + VlansArgs, +) + + +class VlansFacts(object): + """ The nxos 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 get_device_data(self, connection, show_cmd): + """Wrapper method for `connection.get()` + This exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get(show_cmd) + + def populate_facts(self, connection, ansible_facts, data=None): + """ Populate the facts for vlans + :param connection: the device connection + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + objs = [] + # **TBD** + # N7K EOL/legacy image 6.2 does not support show vlan | json output. + # If support is still required for this image then: + # - Wrapp the json calls below in a try/except + # - When excepted, use a helper method to parse the run_cfg_output, + # using the run_cfg_output data to generate compatible json data that + # can be read by normalize_table_data. + if not data: + # Use structured for most of the vlan parameter states. + # This data is consistent across the supported nxos platforms. + structured = self.get_device_data(connection, "show vlan | json") + + # Raw cli config is needed for mapped_vni, which is not included in structured. + run_cfg_output = self.get_device_data( + connection, "show running-config | section ^vlan" + ) + else: + running_config = data.split("\n\n") + structured, run_cfg_output = running_config[0], running_config[1] + + # Create a single dictionary from all data sources + data = self.normalize_table_data(structured, run_cfg_output) + + for vlan in data: + obj = self.render_config(self.generated_spec, vlan) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("vlans", None) + facts = {} + if objs: + facts["vlans"] = [] + params = utils.validate_config( + self.argument_spec, {"config": objs} + ) + for cfg in params["config"]: + facts["vlans"].append(utils.remove_empties(cfg)) + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, vlan): + """ + Render config as dictionary structure and delete keys + from spec for null values + :param spec: The facts tree, generated from the argspec + :param vlan: structured data vlan settings (dict) and raw cfg from device + :rtype: dictionary + :returns: The generated config + Sample inputs: test/units/modules/network/nxos/fixtures/nxos_vlans/show_vlan + """ + obj = deepcopy(spec) + + obj["vlan_id"] = vlan["vlan_id"] + + # name: 'VLAN000x' (default name) or custom name + name = vlan["vlanshowbr-vlanname"] + if name and re.match("VLAN%04d" % int(vlan["vlan_id"]), name): + name = None + obj["name"] = name + + # mode: 'ce-vlan' or 'fabricpath-vlan' + obj["mode"] = vlan["vlanshowinfo-vlanmode"].replace("-vlan", "") + + # enabled: shutdown, noshutdown + obj["enabled"] = ( + True if "noshutdown" in vlan["vlanshowbr-shutstate"] else False + ) + + # state: active, suspend + obj["state"] = vlan["vlanshowbr-vlanstate"] + + # non-structured data + obj["mapped_vni"] = parse_conf_arg(vlan["run_cfg"], "vn-segment") + + return utils.remove_empties(obj) + + def normalize_table_data(self, structured, run_cfg_output): + """Normalize structured output and raw running-config output into + a single dict to simplify render_config usage. + This is needed because: + - The NXOS devices report most of the vlan settings within two + structured data keys: 'vlanbrief' and 'mtuinfo', but the output is + incomplete and therefore raw running-config data is also needed. + - running-config by itself is insufficient because of major differences + in the cli config syntax across platforms. + - Thus a helper method combines settings from the separate top-level keys, + and adds a 'run_cfg' key containing raw cli from the device. + """ + # device output may be string, convert to list + structured = ast.literal_eval(str(structured)) + + vlanbrief = [] + mtuinfo = [] + if "TABLE_vlanbrief" in structured: + # SAMPLE: {"TABLE_vlanbriefid": {"ROW_vlanbriefid": { + # "vlanshowbr-vlanid": "4", "vlanshowbr-vlanid-utf": "4", + # "vlanshowbr-vlanname": "VLAN0004", "vlanshowbr-vlanstate": "active", + # "vlanshowbr-shutstate": "noshutdown"}}, + vlanbrief = structured["TABLE_vlanbrief"]["ROW_vlanbrief"] + + # SAMPLE: "TABLE_mtuinfoid": {"ROW_mtuinfoid": { + # "vlanshowinfo-vlanid": "4", "vlanshowinfo-media-type": "enet", + # "vlanshowinfo-vlanmode": "ce-vlan"}} + mtuinfo = structured["TABLE_mtuinfo"]["ROW_mtuinfo"] + + if type(vlanbrief) is not list: + # vlanbrief is not a list when only one vlan is found. + vlanbrief = [vlanbrief] + mtuinfo = [mtuinfo] + + # split out any per-vlan cli config + run_cfg_list = re.split(r"[\n^]vlan ", run_cfg_output) + + # Create a list of vlan dicts where each dict contains vlanbrief, + # mtuinfo, and non-structured running-config data for one vlan. + vlans = [] + for index, v in enumerate(vlanbrief): + v["vlan_id"] = v.get("vlanshowbr-vlanid-utf") + vlan = {} + vlan.update(v) + vlan.update(mtuinfo[index]) + + run_cfg = [ + i for i in run_cfg_list if "%s\n" % v["vlan_id"] in i + ] or [""] + vlan["run_cfg"] = run_cfg.pop() + vlans.append(vlan) + return vlans diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/nxos.py new file mode 100644 index 00000000..32ecc0d8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/nxos.py @@ -0,0 +1,1501 @@ +# +# 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. +# +# Copyright: (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 collections +import json +import re +import sys +from copy import deepcopy + +from ansible.module_utils._text import to_text +from ansible.module_utils.basic import env_fallback +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, + ComplexList, +) +from ansible.module_utils.connection import Connection, ConnectionError +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.config import ( + CustomNetworkConfig, +) +from ansible.module_utils.six import iteritems, PY2, PY3 +from ansible.module_utils.urls import fetch_url + +try: + import yaml + + HAS_YAML = True +except ImportError: + HAS_YAML = False + +try: + if sys.version_info[:2] < (2, 7): + from ordereddict import OrderedDict + else: + from collections import OrderedDict + HAS_ORDEREDDICT = True +except ImportError: + HAS_ORDEREDDICT = False + +_DEVICE_CONNECTION = None + +nxos_provider_spec = { + "host": dict(type="str"), + "port": dict(type="int"), + "username": dict( + type="str", fallback=(env_fallback, ["ANSIBLE_NET_USERNAME"]) + ), + "password": dict( + type="str", + no_log=True, + fallback=(env_fallback, ["ANSIBLE_NET_PASSWORD"]), + ), + "ssh_keyfile": dict( + type="str", fallback=(env_fallback, ["ANSIBLE_NET_SSH_KEYFILE"]) + ), + "authorize": dict( + type="bool", + default=False, + fallback=(env_fallback, ["ANSIBLE_NET_AUTHORIZE"]), + ), + "auth_pass": dict( + type="str", + no_log=True, + fallback=(env_fallback, ["ANSIBLE_NET_AUTH_PASS"]), + ), + "use_ssl": dict(type="bool", default=False), + "use_proxy": dict(type="bool", default=True), + "validate_certs": dict(type="bool", default=False), + "timeout": dict(type="int"), + "transport": dict(type="str", default="cli", choices=["cli", "nxapi"]), +} +nxos_argument_spec = { + "provider": dict( + type="dict", + options=nxos_provider_spec, + removed_at_date="2022-06-01", + removed_from_collection="cisco.nxos", + ) +} + + +def get_provider_argspec(): + return nxos_provider_spec + + +def get_connection(module): + global _DEVICE_CONNECTION + if not _DEVICE_CONNECTION: + if is_local_nxapi(module): + conn = LocalNxapi(module) + else: + 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"] == "nxapi": + conn = HttpApi(module) + _DEVICE_CONNECTION = conn + return _DEVICE_CONNECTION + + +class Cli: + def __init__(self, module): + self._module = module + self._device_configs = {} + self._connection = None + + 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: + connection = self._get_connection() + try: + out = connection.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() + "\n" + 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: + out = connection.run_commands(commands, check_rc) + if check_rc == "retry_json": + capabilities = self.get_capabilities() + network_api = capabilities.get("network_api") + + if network_api == "cliconf" and out: + for index, resp in enumerate(out): + if ( + "Invalid command at" in resp + or "Ambiguous command at" in resp + ) and "json" in resp: + if commands[index]["output"] == "json": + commands[index]["output"] = "text" + out = connection.run_commands( + commands, check_rc + ) + return out + except ConnectionError as exc: + self._module.fail_json(msg=to_text(exc)) + + def load_config(self, config, return_error=False, opts=None, replace=None): + """Sends configuration commands to the remote device + """ + if opts is None: + opts = {} + + connection = self._get_connection() + responses = [] + try: + resp = connection.edit_config(config, replace=replace) + if isinstance(resp, Mapping): + resp = resp["response"] + except ConnectionError as e: + code = getattr(e, "code", 1) + message = getattr(e, "err", e) + err = to_text(message, errors="surrogate_then_replace") + if opts.get("ignore_timeout") and code: + responses.append(err) + return responses + elif code and "no graceful-restart" in err: + if ( + "ISSU/HA will be affected if Graceful Restart is disabled" + in err + ): + msg = [""] + responses.extend(msg) + return responses + else: + self._module.fail_json(msg=err) + elif code: + self._module.fail_json(msg=err) + + responses.extend(resp) + return responses + + 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: + response = 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 response + + 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 + + def read_module_context(self, module_key): + connection = self._get_connection() + try: + module_context = connection.read_module_context(module_key) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace") + ) + + return module_context + + def save_module_context(self, module_key, module_context): + connection = self._get_connection() + try: + connection.save_module_context(module_key, module_context) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace") + ) + + return None + + +class LocalNxapi: + + OUTPUT_TO_COMMAND_TYPE = { + "text": "cli_show_ascii", + "json": "cli_show", + "bash": "bash", + "config": "cli_conf", + } + + def __init__(self, module): + self._module = module + self._nxapi_auth = None + self._device_configs = {} + self._module_context = {} + + provider = self._module.params.get("provider") or {} + self._module.params["url_username"] = provider.get("username") + self._module.params["url_password"] = provider.get("password") + + host = provider.get("host") + port = provider.get("port") + + if provider.get("use_ssl"): + proto = "https" + port = port or 443 + else: + proto = "http" + port = port or 80 + + self._url = "%s://%s:%s/ins" % (proto, host, port) + + def _error(self, msg, **kwargs): + self._nxapi_auth = None + if "url" not in kwargs: + kwargs["url"] = self._url + self._module.fail_json(msg=msg, **kwargs) + + def _request_builder( + self, commands, output, version="1.0", chunk="0", sid=None + ): + """Encodes a NXAPI JSON request message + """ + try: + command_type = self.OUTPUT_TO_COMMAND_TYPE[output] + except KeyError: + msg = "invalid format, received %s, expected one of %s" % ( + output, + ",".join(self.OUTPUT_TO_COMMAND_TYPE.keys()), + ) + self._error(msg=msg) + + if isinstance(commands, (list, set, tuple)): + commands = " ;".join(commands) + + # Order should not matter but some versions of NX-OS software fail + # to process the payload properly if 'input' gets serialized before + # 'type' and the payload of 'input' contains the word 'type'. + msg = collections.OrderedDict() + msg["version"] = version + msg["type"] = command_type + msg["chunk"] = chunk + msg["sid"] = sid + msg["input"] = commands + msg["output_format"] = "json" + + return dict(ins_api=msg) + + def send_request( + self, + commands, + output="text", + check_status=True, + return_error=False, + opts=None, + ): + # only 10 show commands can be encoded in each request + # messages sent to the remote device + if opts is None: + opts = {} + if output != "config": + commands = collections.deque(to_list(commands)) + stack = list() + requests = list() + + while commands: + stack.append(commands.popleft()) + if len(stack) == 10: + body = self._request_builder(stack, output) + data = self._module.jsonify(body) + requests.append(data) + stack = list() + + if stack: + body = self._request_builder(stack, output) + data = self._module.jsonify(body) + requests.append(data) + + else: + body = self._request_builder(commands, "config") + requests = [self._module.jsonify(body)] + + headers = {"Content-Type": "application/json"} + result = list() + timeout = self._module.params["provider"]["timeout"] + use_proxy = self._module.params["provider"]["use_proxy"] + + for req in requests: + if self._nxapi_auth: + headers["Cookie"] = self._nxapi_auth + + response, headers = fetch_url( + self._module, + self._url, + data=req, + headers=headers, + timeout=timeout, + method="POST", + use_proxy=use_proxy, + ) + self._nxapi_auth = headers.get("set-cookie") + + if opts.get("ignore_timeout") and re.search( + r"(-1|5\d\d)", str(headers["status"]) + ): + result.append(headers["status"]) + return result + elif headers["status"] != 200: + self._error(**headers) + + try: + response = self._module.from_json(response.read()) + except ValueError: + self._module.fail_json(msg="unable to parse response") + + if response["ins_api"].get("outputs"): + output = response["ins_api"]["outputs"]["output"] + for item in to_list(output): + if check_status is True and item["code"] != "200": + if return_error: + result.append(item) + else: + self._error(output=output, **item) + elif "body" in item: + result.append(item["body"]) + # else: + # error in command but since check_status is disabled + # silently drop it. + # result.append(item['msg']) + + return result + + 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: + out = self.send_request(cmd) + cfg = str(out[0]).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 + """ + output = None + queue = list() + responses = list() + + def _send(commands, output): + return self.send_request(commands, output, check_status=check_rc) + + for item in to_list(commands): + if is_json(item["command"]): + item["command"] = str(item["command"]).rsplit("|", 1)[0] + item["output"] = "json" + + if all((output == "json", item["output"] == "text")) or all( + (output == "text", item["output"] == "json") + ): + responses.extend(_send(queue, output)) + queue = list() + + output = item["output"] or "json" + queue.append(item["command"]) + + if queue: + responses.extend(_send(queue, output)) + + return responses + + def load_config( + self, commands, return_error=False, opts=None, replace=None + ): + """Sends the ordered set of commands to the device + """ + + if opts is None: + opts = {} + + responses = [] + + if replace: + device_info = self.get_device_info() + if "9K" not in device_info.get("network_os_platform", ""): + self._module.fail_json( + msg="replace is supported only on Nexus 9K devices" + ) + commands = "config replace {0}".format(replace) + + commands = to_list(commands) + try: + resp = self.send_request( + commands, + output="config", + check_status=True, + return_error=return_error, + opts=opts, + ) + except ValueError as exc: + code = getattr(exc, "code", 1) + message = getattr(exc, "err", exc) + err = to_text(message, errors="surrogate_then_replace") + if opts.get("ignore_timeout") and code: + responses.append(code) + return responses + elif code and "no graceful-restart" in err: + if ( + "ISSU/HA will be affected if Graceful Restart is disabled" + in err + ): + msg = [""] + responses.extend(msg) + return responses + else: + self._module.fail_json(msg=err) + elif code: + self._module.fail_json(msg=err) + + if return_error: + return resp + else: + return responses.extend(resp) + + 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=2) + candidate_obj.load(candidate) + + if running and diff_match != "none" and diff_replace != "config": + # running configuration + running_obj = NetworkConfig( + indent=2, 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 get_device_info(self): + device_info = {} + + device_info["network_os"] = "nxos" + reply = self.run_commands( + {"command": "show version", "output": "json"} + ) + data = reply[0] + + platform_reply = self.run_commands( + {"command": "show inventory", "output": "json"} + ) + platform_info = platform_reply[0] + + device_info["network_os_version"] = data.get( + "sys_ver_str" + ) or data.get("kickstart_ver_str") + device_info["network_os_model"] = data["chassis_id"] + device_info["network_os_hostname"] = data["host_name"] + device_info["network_os_image"] = data.get( + "isan_file_name" + ) or data.get("kick_file_name") + + if platform_info: + inventory_table = platform_info["TABLE_inv"]["ROW_inv"] + for info in inventory_table: + if "Chassis" in info["name"]: + device_info["network_os_platform"] = info["productid"] + + return device_info + + def get_capabilities(self): + result = {} + result["device_info"] = self.get_device_info() + result["network_api"] = "nxapi" + return result + + def read_module_context(self, module_key): + if self._module_context.get(module_key): + return self._module_context[module_key] + + return None + + def save_module_context(self, module_key, module_context): + self._module_context[module_key] = module_context + + return None + + +class HttpApi: + def __init__(self, module): + self._module = module + self._device_configs = {} + self._module_context = {} + 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 + + def run_commands(self, commands, check_rc=True): + """Runs list of commands on remote device and returns results + """ + try: + out = self._connection.send_request(commands) + except ConnectionError as exc: + if check_rc is True: + raise + out = to_text(exc) + + out = to_list(out) + if not out[0]: + return out + + for index, response in enumerate(out): + if response[0] == "{": + out[index] = json.loads(response) + + return out + + 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=2) + candidate_obj.load(candidate) + + if running and diff_match != "none" and diff_replace != "config": + # running configuration + running_obj = NetworkConfig( + indent=2, 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, commands, return_error=False, opts=None, replace=None + ): + """Sends the ordered set of commands to the device + """ + if opts is None: + opts = {} + + responses = [] + try: + resp = self.edit_config(commands, replace=replace) + except ConnectionError as exc: + code = getattr(exc, "code", 1) + message = getattr(exc, "err", exc) + err = to_text(message, errors="surrogate_then_replace") + if opts.get("ignore_timeout") and code: + responses.append(code) + return responses + elif opts.get("catch_clierror") and "400" in code: + return [code, err] + elif code and "no graceful-restart" in err: + if ( + "ISSU/HA will be affected if Graceful Restart is disabled" + in err + ): + msg = [""] + responses.extend(msg) + return responses + else: + self._module.fail_json(msg=err) + elif code: + self._module.fail_json(msg=err) + + responses.extend(resp) + return responses + + def edit_config( + self, candidate=None, commit=True, replace=None, comment=None + ): + resp = list() + + self.check_edit_config_capability(candidate, commit, replace, comment) + + if replace: + candidate = "config replace {0}".format(replace) + + responses = self._connection.send_request(candidate, output="config") + for response in to_list(responses): + if response != "{}": + resp.append(response) + if not resp: + resp = [""] + + return resp + + 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 check_edit_config_capability( + self, candidate=None, commit=True, replace=None, comment=None + ): + operations = self._connection.get_device_operations() + + if not candidate and not replace: + raise ValueError( + "must provide a candidate or replace to load configuration" + ) + + if commit not in (True, False): + raise ValueError("'commit' must be a bool, got %s" % commit) + + if replace and not operations.get("supports_replace"): + raise ValueError("configuration replace is not supported") + + if comment and not operations.get("supports_commit_comment", False): + raise ValueError("commit comment is not supported") + + def read_module_context(self, module_key): + try: + module_context = self._connection.read_module_context(module_key) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace") + ) + + return module_context + + def save_module_context(self, module_key, module_context): + try: + self._connection.save_module_context(module_key, module_context) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace") + ) + + return None + + +class NxosCmdRef: + """NXOS Command Reference utilities. + The NxosCmdRef class takes a yaml-formatted string of nxos module commands + and converts it into dict-formatted database of getters/setters/defaults + and associated common and platform-specific values. The utility methods + add additional data such as existing states, playbook states, and proposed cli. + The utilities also abstract away platform differences such as different + defaults and different command syntax. + + Callers must provide a yaml formatted string that defines each command and + its properties; e.g. BFD global: + --- + _template: # _template holds common settings for all commands + # Enable feature bfd if disabled + feature: bfd + # Common getter syntax for BFD commands + get_command: show run bfd all | incl '^(no )*bfd' + + interval: + kind: dict + getval: bfd interval (?P\\d+) min_rx (?P\\d+) multiplier (?P\\d+) + setval: bfd interval {tx} min_rx {min_rx} multiplier {multiplier} + default: + tx: 50 + min_rx: 50 + multiplier: 3 + N3K: + # Platform overrides + default: + tx: 250 + min_rx: 250 + multiplier: 3 + """ + + def __init__(self, module, cmd_ref_str, ref_only=False): + """Initialize cmd_ref from yaml data.""" + + self._module = module + self._check_imports() + self._yaml_load(cmd_ref_str) + self.cache_existing = None + self.present_states = ["present", "merged", "replaced"] + self.absent_states = ["absent", "deleted"] + ref = self._ref + + # Create a list of supported commands based on ref keys + ref["commands"] = sorted([k for k in ref if not k.startswith("_")]) + ref["_proposed"] = [] + ref["_context"] = [] + ref["_resource_key"] = None + + if not ref_only: + ref["_state"] = module.params.get("state", "present") + self.feature_enable() + self.get_platform_defaults() + self.normalize_defaults() + + def __getitem__(self, key=None): + if key is None: + return self._ref + return self._ref[key] + + def _check_imports(self): + module = self._module + msg = nxosCmdRef_import_check() + if msg: + module.fail_json(msg=msg) + + def _yaml_load(self, cmd_ref_str): + if PY2: + self._ref = yaml.load(cmd_ref_str) + elif PY3: + self._ref = yaml.load(cmd_ref_str, Loader=yaml.FullLoader) + + def feature_enable(self): + """Add 'feature ' to _proposed if ref includes a 'feature' key. """ + ref = self._ref + feature = ref["_template"].get("feature") + if feature: + show_cmd = "show run | incl 'feature {0}'".format(feature) + output = self.execute_show_command(show_cmd, "text") + if not output or "CLI command error" in output: + msg = "** 'feature {0}' is not enabled. Module will auto-enable feature {0} ** ".format( + feature + ) + self._module.warn(msg) + ref["_proposed"].append("feature {0}".format(feature)) + ref["_cli_is_feature_disabled"] = ref["_proposed"] + + def get_platform_shortname(self): + """Query device for platform type, normalize to a shortname/nickname. + Returns platform shortname (e.g. 'N3K-3058P' returns 'N3K') or None. + """ + # TBD: add this method logic to get_capabilities() after those methods + # are made consistent across transports + platform_info = self.execute_show_command("show inventory", "json") + if not platform_info or not isinstance(platform_info, dict): + return None + inventory_table = platform_info["TABLE_inv"]["ROW_inv"] + for info in inventory_table: + if "Chassis" in info["name"]: + network_os_platform = info["productid"] + break + else: + return None + + # Supported Platforms: N3K,N5K,N6K,N7K,N9K,N3K-F,N9K-F + m = re.match( + "(?PN[35679][K57])-(?PC35)*", network_os_platform + ) + if not m: + return None + shortname = m.group("short") + + # Normalize + if m.groupdict().get("N35"): + shortname = "N35" + elif re.match("N77", shortname): + shortname = "N7K" + elif re.match(r"N3K|N9K", shortname): + for info in inventory_table: + if "-R" in info["productid"]: + # Fretta Platform + shortname += "-F" + break + return shortname + + def get_platform_defaults(self): + """Update ref with platform specific defaults""" + plat = self.get_platform_shortname() + if not plat: + return + + ref = self._ref + ref["_platform_shortname"] = plat + # Remove excluded commands (no platform support for command) + for k in ref["commands"]: + if plat in ref[k].get("_exclude", ""): + ref["commands"].remove(k) + + # Update platform-specific settings for each item in ref + plat_spec_cmds = [k for k in ref["commands"] if plat in ref[k]] + for k in plat_spec_cmds: + for plat_key in ref[k][plat]: + ref[k][plat_key] = ref[k][plat][plat_key] + + def normalize_defaults(self): + """Update ref defaults with normalized data""" + ref = self._ref + for k in ref["commands"]: + if "default" in ref[k] and ref[k]["default"]: + kind = ref[k]["kind"] + if "int" == kind: + ref[k]["default"] = int(ref[k]["default"]) + elif "list" == kind: + ref[k]["default"] = [str(i) for i in ref[k]["default"]] + elif "dict" == kind: + for key, v in ref[k]["default"].items(): + if v: + v = str(v) + ref[k]["default"][key] = v + + def execute_show_command(self, command, format): + """Generic show command helper. + Warning: 'CLI command error' exceptions are caught, must be handled by caller. + Return device output as a newline-separated string or None. + """ + cmds = [{"command": command, "output": format}] + output = None + try: + output = run_commands(self._module, cmds) + if output: + output = output[0] + except ConnectionError as exc: + if "CLI command error" in repr(exc): + # CLI may be feature disabled + output = repr(exc) + else: + raise + return output + + def pattern_match_existing(self, output, k): + """Pattern matching helper for `get_existing`. + `k` is the command name string. Use the pattern from cmd_ref to + find a matching string in the output. + Return regex match object or None. + """ + ref = self._ref + pattern = re.compile(ref[k]["getval"]) + multiple = "multiple" in ref[k].keys() + match_lines = [re.search(pattern, line) for line in output] + if "dict" == ref[k]["kind"]: + match = [m for m in match_lines if m] + if not match: + return None + if len(match) > 1 and not multiple: + raise ValueError( + "get_existing: multiple matches found for property {0}".format( + k + ) + ) + else: + match = [m.groups() for m in match_lines if m] + if not match: + return None + if len(match) > 1 and not multiple: + raise ValueError( + "get_existing: multiple matches found for property {0}".format( + k + ) + ) + for item in match: + index = match.index(item) + match[index] = list(item) # tuple to list + + # Handle config strings that nvgen with the 'no' prefix. + # Example match behavior: + # When pattern is: '(no )*foo *(\S+)*$' AND + # When output is: 'no foo' -> match: ['no ', None] + # When output is: 'foo 50' -> match: [None, '50'] + if None is match[index][0]: + match[index].pop(0) + elif "no" in match[index][0]: + match[index].pop(0) + if not match: + return None + + return match + + def set_context(self, context=None): + """Update ref with command context. + """ + if context is None: + context = [] + ref = self._ref + # Process any additional context that this propoerty might require. + # 1) Global context from NxosCmdRef _template. + # 2) Context passed in using context arg. + ref["_context"] = ref["_template"].get("context", []) + for cmd in context: + ref["_context"].append(cmd) + # Last key in context is the resource key + ref["_resource_key"] = context[-1] if context else ref["_resource_key"] + + def get_existing(self, cache_output=None): + """Update ref with existing command states from the device. + Store these states in each command's 'existing' key. + """ + ref = self._ref + if ref.get("_cli_is_feature_disabled"): + # Add context to proposed if state is present + if ref["_state"] in self.present_states: + [ref["_proposed"].append(ctx) for ctx in ref["_context"]] + return + + show_cmd = ref["_template"]["get_command"] + if cache_output: + output = cache_output + else: + output = self.execute_show_command(show_cmd, "text") or [] + self.cache_existing = output + + # Add additional command context if needed. + if ref["_context"]: + output = CustomNetworkConfig(indent=2, contents=output) + output = output.get_section(ref["_context"]) + + if not output: + # Add context to proposed if state is present + if ref["_state"] in self.present_states: + [ref["_proposed"].append(ctx) for ctx in ref["_context"]] + return + + # We need to remove the last item in context for state absent case. + if ref["_state"] in self.absent_states and ref["_context"]: + if ( + ref["_resource_key"] + and ref["_resource_key"] == ref["_context"][-1] + ): + if ref["_context"][-1] in output: + ref["_context"][-1] = "no " + ref["_context"][-1] + else: + del ref["_context"][-1] + return + + # Walk each cmd in ref, use cmd pattern to discover existing cmds + output = output.split("\n") + for k in ref["commands"]: + match = self.pattern_match_existing(output, k) + if not match: + continue + ref[k]["existing"] = {} + for item in match: + index = match.index(item) + kind = ref[k]["kind"] + if "int" == kind: + ref[k]["existing"][index] = int(item[0]) + elif "list" == kind: + ref[k]["existing"][index] = [str(i) for i in item[0]] + elif "dict" == kind: + # The getval pattern should contain regex named group keys that + # match up with the setval named placeholder keys; e.g. + # getval: my-cmd (?P\d+) bar (?P\d+) + # setval: my-cmd {foo} bar {baz} + ref[k]["existing"][index] = {} + for key in item.groupdict().keys(): + ref[k]["existing"][index][key] = str(item.group(key)) + elif "str" == kind: + ref[k]["existing"][index] = item[0] + else: + raise ValueError( + "get_existing: unknown 'kind' value specified for key '{0}'".format( + k + ) + ) + + def get_playvals(self): + """Update ref with values from the playbook. + Store these values in each command's 'playval' key. + """ + ref = self._ref + module = self._module + params = {} + if module.params.get("config"): + # Resource module builder packs playvals under 'config' key + param_data = module.params.get("config") + params["global"] = param_data + for key in param_data.keys(): + if isinstance(param_data[key], list): + params[key] = param_data[key] + else: + params["global"] = module.params + for k in ref.keys(): + for level in params.keys(): + if isinstance(params[level], dict): + params[level] = [params[level]] + for item in params[level]: + if k in item and item[k] is not None: + if not ref[k].get("playval"): + ref[k]["playval"] = {} + playval = item[k] + index = params[level].index(item) + # Normalize each value + if "int" == ref[k]["kind"]: + playval = int(playval) + elif "list" == ref[k]["kind"]: + playval = [str(i) for i in playval] + elif "dict" == ref[k]["kind"]: + for key, v in playval.items(): + playval[key] = str(v) + ref[k]["playval"][index] = playval + + def build_cmd_set(self, playval, existing, k): + """Helper function to create list of commands to configure device + Return a list of commands + """ + ref = self._ref + proposed = ref["_proposed"] + cmd = None + kind = ref[k]["kind"] + if "int" == kind: + cmd = ref[k]["setval"].format(playval) + elif "list" == kind: + cmd = ref[k]["setval"].format(*(playval)) + elif "dict" == kind: + # The setval pattern should contain placeholder keys that + # match up with the getval regex named group keys; e.g. + # getval: my-cmd (?P\d+) bar (?P\d+) + # setval: my-cmd {foo} bar {baz} + cmd = ref[k]["setval"].format(**playval) + elif "str" == kind: + if "deleted" in playval: + if existing: + cmd = "no " + ref[k]["setval"].format(existing) + else: + cmd = ref[k]["setval"].format(playval) + else: + raise ValueError( + "get_proposed: unknown 'kind' value specified for key '{0}'".format( + k + ) + ) + if cmd: + if ref["_state"] in self.absent_states and not re.search( + r"^no", cmd + ): + cmd = "no " + cmd + # Commands may require parent commands for proper context. + # Global _template context is replaced by parameter context + [proposed.append(ctx) for ctx in ref["_context"]] + [proposed.append(ctx) for ctx in ref[k].get("context", [])] + proposed.append(cmd) + + def get_proposed(self): + """Compare playbook values against existing states and create a list + of proposed commands. + Return a list of raw cli command strings. + """ + ref = self._ref + # '_proposed' may be empty list or contain initializations; e.g. ['feature foo'] + proposed = ref["_proposed"] + + if ref["_context"] and ref["_context"][-1].startswith("no"): + [proposed.append(ctx) for ctx in ref["_context"]] + return proposed + + # Create a list of commands that have playbook values + play_keys = [k for k in ref["commands"] if "playval" in ref[k]] + + def compare(playval, existing): + if ref["_state"] in self.present_states: + if existing is None: + return False + elif playval == existing: + return True + elif ( + isinstance(existing, dict) and playval in existing.values() + ): + return True + + if ref["_state"] in self.absent_states: + if isinstance(existing, dict) and all( + x is None for x in existing.values() + ): + existing = None + if existing is None or playval not in existing.values(): + return True + return False + + # Compare against current state + for k in play_keys: + playval = ref[k]["playval"] + # Create playval copy to avoid RuntimeError + # dictionary changed size during iteration error + playval_copy = deepcopy(playval) + existing = ref[k].get("existing", ref[k]["default"]) + multiple = "multiple" in ref[k].keys() + + # Multiple Instances: + if isinstance(existing, dict) and multiple: + for ekey, evalue in existing.items(): + if isinstance(evalue, dict): + # Remove values set to string 'None' from dvalue + evalue = dict( + (k, v) for k, v in evalue.items() if v != "None" + ) + for pkey, pvalue in playval.items(): + if compare(pvalue, evalue): + if playval_copy.get(pkey): + del playval_copy[pkey] + if not playval_copy: + continue + # Single Instance: + else: + for pkey, pval in playval.items(): + if compare(pval, existing): + if playval_copy.get(pkey): + del playval_copy[pkey] + if not playval_copy: + continue + + playval = playval_copy + # Multiple Instances: + if isinstance(existing, dict): + for dkey, dvalue in existing.items(): + for pval in playval.values(): + self.build_cmd_set(pval, dvalue, k) + # Single Instance: + else: + for pval in playval.values(): + self.build_cmd_set(pval, existing, k) + + # Remove any duplicate commands before returning. + # pylint: disable=unnecessary-lambda + cmds = sorted(set(proposed), key=lambda x: proposed.index(x)) + return cmds + + +def nxosCmdRef_import_check(): + """Return import error messages or empty string""" + msg = "" + if PY2: + if not HAS_ORDEREDDICT and sys.version_info[:2] < (2, 7): + msg += "Mandatory python library 'ordereddict' is not present, try 'pip install ordereddict'\n" + if not HAS_YAML: + msg += "Mandatory python library 'yaml' is not present, try 'pip install yaml'\n" + elif PY3: + if not HAS_YAML: + msg += "Mandatory python library 'PyYAML' is not present, try 'pip install PyYAML'\n" + return msg + + +def is_json(cmd): + return to_text(cmd).endswith("| json") + + +def is_text(cmd): + return not is_json(cmd) + + +def is_local_nxapi(module): + provider = module.params.get("provider") + if provider: + return provider.get("transport") == "nxapi" + return False + + +def to_command(module, commands): + if is_local_nxapi(module): + default_output = "json" + else: + default_output = "text" + + transform = ComplexList( + dict( + command=dict(key=True), + output=dict(default=default_output), + 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), + ), + module, + ) + + commands = transform(to_list(commands)) + + for item in commands: + if is_json(item["command"]): + item["output"] = "json" + + return commands + + +def get_config(module, flags=None): + flags = [] if flags is None else flags + + conn = get_connection(module) + return conn.get_config(flags=flags) + + +def run_commands(module, commands, check_rc=True): + conn = get_connection(module) + return conn.run_commands(to_command(module, commands), check_rc) + + +def load_config(module, config, return_error=False, opts=None, replace=None): + conn = get_connection(module) + return conn.load_config(config, return_error, opts, replace=replace) + + +def get_capabilities(module): + conn = get_connection(module) + return conn.get_capabilities() + + +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 normalize_interface(name): + """Return the normalized interface name + """ + if not name: + return + + def _get_number(name): + digits = "" + for char in name: + if char.isdigit() or char in "/.": + digits += char + return digits + + if name.lower().startswith("et"): + if_type = "Ethernet" + elif name.lower().startswith("vl"): + if_type = "Vlan" + elif name.lower().startswith("lo"): + if_type = "loopback" + elif name.lower().startswith("po"): + if_type = "port-channel" + elif name.lower().startswith("nv"): + if_type = "nve" + else: + if_type = None + + number_list = name.split(" ") + if len(number_list) == 2: + number = number_list[-1].strip() + else: + number = _get_number(name) + + if if_type: + proper_interface = if_type + number + else: + proper_interface = name + + return proper_interface + + +def get_interface_type(interface): + """Gets the type of interface + """ + if interface.upper().startswith("ET"): + return "ethernet" + elif interface.upper().startswith("VL"): + return "svi" + elif interface.upper().startswith("LO"): + return "loopback" + elif interface.upper().startswith("MG"): + return "management" + elif interface.upper().startswith("MA"): + return "management" + elif interface.upper().startswith("PO"): + return "portchannel" + elif interface.upper().startswith("NV"): + return "nve" + else: + return "unknown" + + +def default_intf_enabled(name="", sysdefs=None, mode=None): + """Get device/version/interface-specific default 'enabled' state. + L3: + - Most L3 intfs default to 'shutdown'. Loopbacks default to 'no shutdown'. + - Some legacy platforms default L3 intfs to 'no shutdown'. + L2: + - User-System-Default 'system default switchport shutdown' defines the + enabled state for L2 intf's. USD defaults may be different on some platforms. + - An intf may be explicitly defined as L2 with 'switchport' or it may be + implicitly defined as L2 when USD 'system default switchport' is defined. + """ + if not name: + return None + if sysdefs is None: + sysdefs = {} + default = False + + if re.search("port-channel|loopback", name): + default = True + else: + if mode is None: + # intf 'switchport' cli is not present so use the user-system-default + mode = sysdefs.get("mode") + + if mode == "layer3": + default = sysdefs.get("L3_enabled") + elif mode == "layer2": + default = sysdefs.get("L2_enabled") + return default + + +def read_module_context(module): + conn = get_connection(module) + return conn.read_module_context(module._name) + + +def save_module_context(module, module_context): + conn = get_connection(module) + return conn.save_module_context(module._name, module_context) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/bgp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/bgp_global.py new file mode 100644 index 00000000..eeab8592 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/bgp_global.py @@ -0,0 +1,1455 @@ +# -*- 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 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.network_template import ( + NetworkTemplate, +) + + +def _tmplt_confederation_peers(proc): + cmd = "confederation peers" + for peer in proc.get("confederation", {})["peers"]: + cmd += " {0}".format(peer) + return cmd + + +def _tmplt_path_attribute(proc): + cmd = "path-attribute {action}".format(**proc) + + if "type" in proc: + cmd += " {type}".format(**proc) + elif "range" in proc: + cmd += " range {start} {end}".format(**proc["range"]) + cmd += " in" + + return cmd + + +class Bgp_globalTemplate(NetworkTemplate): + def __init__(self, lines=None): + super(Bgp_globalTemplate, self).__init__(lines=lines, tmplt=self) + + # fmt: off + PARSERS = [ + { + "name": "as_number", + "getval": re.compile( + r""" + ^router\sbgp\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "router bgp {{ as_number }}", + "result": { + "as_number": "{{ as_number }}", + }, + "shared": True + }, + { + "name": "vrf", + "getval": re.compile( + r""" + \s+vrf + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "vrf {{ vrf }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "vrf": "{{ vrf }}" + } + } + }, + "shared": True, + }, + { + "name": "affinity_group.group_id", + "getval": re.compile( + r""" + \s+affinity-group + \sactivate\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "affinity-group activate {{ affinity_group.group_id }}", + "result": { + "affinity_group": { + "group_id": "{{ group_id }}", + }, + } + }, + { + "name": "bestpath.always_compare_med", + "getval": re.compile( + r""" + \s+bestpath\s(?Palways-compare-med) + $""", re.VERBOSE + ), + "setval": "bestpath always-compare-med", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "always_compare_med": "{{ not not always_compare_med }}", + } + } + } + } + }, + { + "name": "bestpath.as_path.ignore", + "getval": re.compile( + r""" + \s+bestpath\sas-path\s(?Pignore) + $""", re.VERBOSE + ), + "setval": "bestpath as-path ignore", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "as_path": { + "ignore": "{{ not not ignore }}", + } + } + } + } + } + }, + { + "name": "bestpath.as_path.multipath_relax", + "getval": re.compile( + r""" + \s+bestpath\sas-path\s(?Pmultipath-relax) + $""", re.VERBOSE + ), + "setval": "bestpath as-path multipath-relax", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "as_path": { + "multipath_relax": "{{ not not multipath_relax }}", + } + } + } + } + } + }, + { + "name": "bestpath.compare_neighborid", + "getval": re.compile( + r""" + \s+bestpath\s(?Pcompare-neighborid) + $""", re.VERBOSE + ), + "setval": "bestpath compare-neighborid", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "compare_neighborid": "{{ not not compare_neighborid }}", + } + } + } + + } + }, + { + "name": "bestpath.compare_routerid", + "getval": re.compile( + r""" + \s+bestpath\s(?Pcompare-routerid) + $""", re.VERBOSE + ), + "setval": "bestpath compare-routerid", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "compare_routerid": "{{ not not compare_routerid }}", + } + } + } + } + }, + { + "name": "bestpath.cost_community_ignore", + "getval": re.compile( + r""" + \s+bestpath\scost-community\s(?Pignore) + $""", re.VERBOSE + ), + "setval": "bestpath cost-community ignore", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "cost_community_ignore": "{{ not not cost_community_ignore }}", + } + } + } + } + }, + { + "name": "bestpath.igp_metric_ignore", + "getval": re.compile( + r""" + \s+bestpath\sigp-metric\s(?Pignore) + $""", re.VERBOSE + ), + "setval": "bestpath igp-metric ignore", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "igp_metric_ignore": "{{ not not igp_metric_ignore }}", + } + } + } + } + }, + { + "name": "bestpath.med.confed", + "getval": re.compile( + r""" + \s+bestpath\smed\s(?Pconfed) + $""", re.VERBOSE + ), + "setval": "bestpath med confed", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "med": { + "confed": "{{ not not confed }}", + } + } + } + } + } + }, + { + "name": "bestpath.med.missing_as_worst", + "getval": re.compile( + r""" + \s+bestpath\smed\s(?Pmissing-as-worst) + $""", re.VERBOSE + ), + "setval": "bestpath med missing-as-worst", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "med": { + "missing_as_worst": "{{ not not missing_as_worst }}", + } + } + } + } + } + }, + { + "name": "bestpath.med.non_deterministic", + "getval": re.compile( + r""" + \s+bestpath\smed\s(?Pnon-deterministic) + $""", re.VERBOSE + ), + "setval": "bestpath med non-deterministic", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bestpath": { + "med": { + "non_deterministic": "{{ not not non_deterministic }}", + } + } + } + } + } + }, + { + "name": "cluster_id", + "getval": re.compile( + r""" + \s+cluster-id\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "cluster-id {{ cluster_id }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "cluster_id": "{{ cluster_id }}", + } + } + } + }, + { + "name": "confederation.identifier", + "getval": re.compile( + r""" + \s+confederation\sidentifier\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "confederation identifier {{ confederation.identifier }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "confederation": { + "identifier": "{{ identifier }}", + }, + } + } + }, + }, + { + "name": "confederation.peers", + "getval": re.compile( + r""" + \s+confederation\speers\s(?P.*) + $""", re.VERBOSE + ), + "setval": _tmplt_confederation_peers, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "confederation": { + "peers": "{{ peers }}", + }, + } + }, + } + }, + { + "name": "disable_policy_batching", + "getval": re.compile( + r""" + \s+(?Pdisable-policy-batching) + $""", re.VERBOSE + ), + "setval": "disable-policy-batching", + "result": { + "disable_policy_batching": { + "set": "{{ not not disable_policy_batching }}", + }, + } + }, + { + "name": "disable_policy_batching.ipv4.prefix_list", + "getval": re.compile( + r""" + \s+disable-policy-batching\sipv4 + \sprefix-list\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "disable-policy-batching ipv4 prefix-list {{ disable_policy_batching.ipv4.prefix_list }}", + "result": { + "disable_policy_batching": { + "ipv4": { + "prefix_list": "{{ ipv4_prefix_list }}", + } + }, + } + }, + { + "name": "disable_policy_batching.ipv6.prefix_list", + "getval": re.compile( + r""" + \s+disable-policy-batching\sipv6 + \sprefix-list\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "disable-policy-batching ipv6 prefix-list {{ disable_policy_batching.ipv6.prefix_list }}", + "result": { + "disable_policy_batching": { + "ipv6": { + "prefix_list": "{{ ipv6_prefix_list }}", + } + }, + } + }, + { + "name": "disable_policy_batching.nexthop", + "getval": re.compile( + r""" + \s+disable-policy-batching\s(?Pnexthop) + $""", re.VERBOSE + ), + "setval": "disable-policy-batching nexthop", + "result": { + "disable_policy_batching": { + "nexthop": "{{ not not nexthop }}", + }, + } + }, + { + "name": "dynamic_med_interval", + "getval": re.compile( + r""" + \s+dynamic-med-interval\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "dynamic-med-interval {{ dynamic_med_interval }}", + "result": { + "dynamic_med_interval": "{{ dynamic_med_interval }}", + } + }, + { + "name": "enforce_first_as", + "getval": re.compile( + r""" + \s+no\s(?Penforce-first-as) + $""", re.VERBOSE + ), + "setval": "enforce-first-as", + "result": { + "enforce_first_as": "{{ not enforce_first_as }}", + } + }, + { + "name": "enhanced_error", + "getval": re.compile( + r""" + \s+no\s(?Penhanced-error) + $""", re.VERBOSE + ), + "setval": "enhanced-error", + "result": { + "enhanced_error": "{{ not enhanced_error }}", + } + }, + { + "name": "fast_external_fallover", + "getval": re.compile( + r""" + \s+no\s(?Pfast-external-fallover) + $""", re.VERBOSE + ), + "setval": "fast-external-fallover", + "result": { + "fast_external_fallover": "{{ not fast_external_fallover }}", + } + }, + { + "name": "flush_routes", + "getval": re.compile( + r""" + \s+(?Pflush-routes) + $""", re.VERBOSE + ), + "setval": "flush-routes", + "result": { + "flush_routes": "{{ not not flush_routes }}", + } + }, + { + "name": "graceful_restart", + "getval": re.compile( + r""" + \s+no\s(?Pgraceful-restart) + $""", re.VERBOSE + ), + "setval": "graceful-restart", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "set": "{{ not graceful_restart }}", + }, + } + } + } + }, + { + "name": "graceful_restart.restart_time", + "getval": re.compile( + r""" + \s+graceful-restart\srestart-time\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "graceful-restart restart-time {{ graceful_restart.restart_time }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "restart_time": "{{ restart_time }}", + }, + } + } + } + }, + { + "name": "graceful_restart.stalepath_time", + "getval": re.compile( + r""" + \s+graceful-restart\sstalepath-time\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "graceful-restart stalepath-time {{ graceful_restart.stalepath_time }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "stalepath_time": "{{ stalepath_time }}", + }, + } + } + } + }, + { + "name": "graceful_restart.helper", + "getval": re.compile( + r""" + \s+(?Pgraceful-restart-helper) + $""", re.VERBOSE + ), + "setval": "graceful-restart-helper", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "helper": "{{ not not helper }}", + }, + } + } + } + }, + { + "name": "graceful_shutdown.activate", + "getval": re.compile( + r""" + \s+graceful-shutdown + \s(?Pactivate) + (\sroute-map + \s(?P\S+))? + $""", re.VERBOSE + ), + "setval": "graceful-shutdown activate{{ ' route-map ' + graceful_shutdown.activate.route_map if graceful_shutdown.activate.route_map is defined }}", + "result": { + "graceful_shutdown": { + "activate": { + "set": "{{ True if activate is defined and route_map is undefined else None }}", + "route_map": "{{ route_map }}", + } + }, + } + }, + { + "name": "graceful_shutdown.aware", + "getval": re.compile( + r""" + \s+no\sgraceful-shutdown + \s(?Paware) + $""", re.VERBOSE + ), + "setval": "graceful-shutdown aware", + "result": { + "graceful_shutdown": { + "aware": "{{ not aware }}" + }, + } + }, + { + "name": "isolate", + "getval": re.compile( + r""" + \s+(?Pisolate) + (\s(?Pinclude-local))? + $""", re.VERBOSE + ), + "setval": "isolate{{ ' include-local' if isolate.include_local|d(False) is True }}", + "result": { + "isolate": { + "set": "{{ True if isolate is defined and include_local is not defined else None }}", + "include_local": "{{ not not include_local }}", + }, + } + }, + { + "name": "log_neighbor_changes", + "getval": re.compile( + r""" + \s+(?Plog-neighbor-changes) + $""", re.VERBOSE + ), + "setval": "log-neighbor-changes", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "log_neighbor_changes": "{{ not not log_neighbor_changes }}", + } + } + } + }, + { + "name": "maxas_limit", + "getval": re.compile( + r""" + \s+maxas-limit\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "maxas-limit {{ maxas_limit }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "maxas_limit": "{{ maxas_limit }}", + } + } + } + }, + # start neighbor parsers + { + "name": "neighbor_address", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "neighbor {{ neighbor_address }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "neighbor_address": "{{ neighbor_address }}", + } + } + } + } + } + }, + { + "name": "remote_as", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sremote-as\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "remote-as {{ remote_as }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "remote_as": "{{ remote_as }}", + } + } + } + } + } + }, + { + "name": "neighbor_affinity_group.group_id", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \saffinity-group\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "affinity-group {{ neighbor_affinity_group.group_id }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "neighbor_affinity_group": { + "group_id": "{{ group_id }}", + } + } + } + } + } + } + }, + { + "name": "bmp_activate_server", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sbmp-activate-server\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "bmp-activate-server {{ bmp_activate_server }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "bmp_activate_server": "{{ bmp_activate_server }}", + } + } + } + } + } + }, + { + "name": "capability", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \scapability\ssuppress\s(?P4-byte-as) + $""", re.VERBOSE + ), + "setval": "capability suppress 4-byte-as", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "capability": { + "suppress_4_byte_as": "{{ not not suppress_4_byte_as }}", + } + } + } + } + } + } + }, + { + "name": "description", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sdescription\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "description {{ description }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "description": "{{ description }}", + } + } + } + } + } + }, + { + "name": "disable_connected_check", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \s(?Pdisable-connected-check) + $""", re.VERBOSE + ), + "setval": "disable-connected-check", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "disable_connected_check": "{{ not not disable_connected_check }}", + } + } + } + } + } + }, + { + "name": "dont_capability_negotiate", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \s(?Pdont-capability-negotiate) + $""", re.VERBOSE + ), + "setval": "dont-capability-negotiate", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "dont_capability_negotiate": "{{ not not dont_capability_negotiate}}", + } + } + } + } + } + }, + { + "name": "dscp", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sdscp\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "dscp {{ dscp }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "dscp": "{{ dscp }}", + } + } + } + } + } + }, + { + "name": "dynamic_capability", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \s(?Pdynamic-capability) + $""", re.VERBOSE + ), + "setval": "dynamic-capability", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "dynamic_capability": "{{ not not dynamic_capability }}", + } + } + } + } + } + }, + { + "name": "ebgp_multihop", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sebgp-multihop\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "ebgp-multihop {{ ebgp_multihop }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "ebgp_multihop": "{{ ebgp_multihop }}", + } + } + } + } + } + }, + { + "name": "graceful_shutdown", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sgraceful-shutdown + \s(?Pactivate) + (\sroute-map\s(?P\S+))? + $""", re.VERBOSE + ), + "setval": "graceful-shutdown{{ (' route-map ' + graceful_shutdown.route_map) if graceful_shutdown.route_map is defined }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "graceful_shutdown": { + "activate": { + "set": "{{ True if activate is defined and route_map is undefined else None }}", + "route_map": "{{ route_map }}", + }, + } + } + } + } + } + } + }, + { + "name": "inherit.peer", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sinherit + \speer\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "inherit peer {{ inherit.peer }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "inherit": { + "peer": "{{ peer }}", + } + } + } + } + } + } + }, + { + "name": "inherit.peer_session", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sinherit + \speer-session\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "inherit peer-session {{ inherit.peer_session }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "inherit": { + "peer_session": "{{ peer_session }}", + } + } + } + } + } + } + }, + { + "name": "local_as", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \slocal-as\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "local-as {{ local_as }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "local_as": "{{ local_as }}", + } + } + } + } + } + }, + { + "name": "log_neighbor_changes", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \s(?Plog-neighbor-changes) + (\s(?Pdisable))? + $""", re.VERBOSE + ), + "setval": "log-neighbor-changes{{ ' disable' if log_neighbor_changes.disable is defined }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "log_neighbor_changes": { + "set": "{{ True if log_neighbor_changes is defined and disable is undefined }}", + "disable": "{{ not not disable }}", + } + } + } + } + } + } + }, + { + "name": "low_memory", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \slow-memory\s(?Pexempt) + $""", re.VERBOSE + ), + "setval": "low-memory exempt", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "low_memory": { + "exempt": "{{ not not exempt }}", + } + } + } + } + } + } + }, + { + "name": "password", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \spassword\s(?P\d+) + \s(?P\S+) + $""", re.VERBOSE + ), + "setval": "password{{ (' ' + password.encryption|string) if password.encryption is defined }} {{ password.key }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "password": { + "encryption": "{{ encryption }}", + "key": "{{ key }}", + } + } + } + } + } + } + }, + { + "name": "path_attribute", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \spath-attribute\s(?P\S+)\s + (?P\d+)? + (range\s(?P\d+)\s(?P\d+))? + \sin + $""", re.VERBOSE + ), + "setval": _tmplt_path_attribute, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "path_attribute": [ + { + "action": "{{ action }}", + "type": "{{ type if type is defined else None }}", + "range": { + "start": "{{ start if start is defined }}", + "end": "{{ end if end is defined }}" + }, + }, + ] + } + } + } + } + } + }, + { + "name": "peer_type", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \speer-type\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "peer-type {{ neighbor.peer_type }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "peer_type": "{{ peer_type }}", + } + } + } + } + } + }, + { + "name": "remove_private_as", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \s(?Premove-private-as) + (\s(?Pall))? + (\s(?Preplace-as))? + $""", re.VERBOSE + ), + "setval": "remove-private-as", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "remove_private_as": { + "set": "{{ True if remove_private_as is defined and replace_as is undefined and all is undefined else None }}", + "replace_as": "{{ not not replace_as }}", + "all": "{{ not not all }}", + } + } + } + } + } + } + }, + { + "name": "shutdown", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \s(?Pshutdown) + $""", re.VERBOSE + ), + "setval": "shutdown", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "shutdown": "{{ not not shutdown }}", + } + } + } + } + } + }, + { + "name": "timers", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \stimers\s(?P\d+)\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "shutdown", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "timers": { + "keepalive": "{{ keepalive }}", + "holdtime": "{{ holdtime }}", + } + } + } + } + } + } + }, + { + "name": "transport", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \stransport\sconnection-mode + \s(?Ppassive) + $""", re.VERBOSE + ), + "setval": "transport connection-mode passive", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "transport": { + "connection_mode": { + "passive": "{{ not not passive }}", + } + } + } + } + } + } + } + }, + { + "name": "ttl_security", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \sttl-security\shops\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "ttl-security hops {{ ttl_security.hops }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "ttl_security": { + "hops": "{{ hops }}", + } + } + } + } + } + } + }, + { + "name": "update_source", + "getval": re.compile( + r""" + \s+neighbor\s(?P\S+) + \supdate-source\s(?P\S+) + $""", re.VERBOSE + ), + "setval": "update-source {{ update_source }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbors": { + "{{ neighbor_address }}": { + "update_source": "{{ update_source }}", + } + } + } + } + } + }, + # end neighbor parsers + { + "name": "neighbor_down.fib_accelerate", + "getval": re.compile( + r""" + \s+neighbor-down\s(?Pfib-accelerate) + $""", re.VERBOSE + ), + "setval": "neighbor-down fib-accelerate", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "neighbor_down": { + "fib_accelerate": "{{ not not fib_accelerate }}", + } + } + } + } + }, + { + "name": "nexthop.suppress_default_resolution", + "getval": re.compile( + r""" + \s+nexthop + \s(?Psuppress-default-resolution) + $""", re.VERBOSE + ), + "setval": "nexthop suppress-default-resolution", + "result": { + "nexthop": { + "suppress_default_resolution": "{{ not not suppress_default_resolution }}", + }, + } + }, + { + "name": "reconnect_interval", + "getval": re.compile( + r""" + \s+reconnect-interval + \s(?P\d+) + $""", re.VERBOSE + ), + "setval": "reconnect-interval {{ reconnect_interval }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "reconnect_interval": "{{ reconnect_interval }}", + } + } + } + }, + { + "name": "router_id", + "getval": re.compile( + r""" + \s+router-id + \s(?P\S+) + $""", re.VERBOSE + ), + "setval": "router-id {{ router_id }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "router_id": "{{ router_id }}", + } + } + } + }, + { + "name": "shutdown", + "getval": re.compile( + r""" + \s+(?Pshutdown) + $""", re.VERBOSE + ), + "setval": "shutdown", + "result": { + "shutdown": "{{ not not shutdown }}", + } + }, + { + "name": "suppress_fib_pending", + "getval": re.compile( + r""" + \s+no\s(?Psuppress-fib-pending) + $""", re.VERBOSE + ), + "setval": "suppress-fib-pending", + "result": { + "suppress_fib_pending": "{{ not suppress_fib_pending }}", + } + }, + { + "name": "timers.bestpath_limit", + "getval": re.compile( + r""" + \s+timers\sbestpath-limit + \s(?P\d+) + (\s(?Palways))? + $""", re.VERBOSE + ), + "setval": "timers bestpath-limit {{ timers.bestpath_limit.timeout }}{{ ' always' if timers.bestpath_limit.timeout is defined }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "bestpath_limit": { + "timeout": "{{ timeout }}", + "always": "{{ not not always }}", + } + } + } + } + } + }, + { + "name": "timers.bgp", + "getval": re.compile( + r""" + \s+timers\sbgp + \s(?P\d+) + (\s(?P\d+))? + $""", re.VERBOSE + ), + "setval": "timers bgp {{ timers.bgp.keepalive }} {{ timers.bgp.holdtime }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "bgp": { + "keepalive": "{{ keepalive }}", + "holdtime": "{{ holdtime }}", + } + } + } + } + } + }, + { + "name": "timers.prefix_peer_timeout", + "getval": re.compile( + r""" + \s+timers + \sprefix-peer-timeout\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "timers prefix-peer-timeout {{ timers.prefix_peer_timeout }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "prefix_peer_timeout": "{{ prefix_peer_timeout }}", + } + } + } + } + }, + { + "name": "timers.prefix_peer_wait", + "getval": re.compile( + r""" + \s+timers + \sprefix-peer-wait\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "timers prefix-peer-wait {{ timers.prefix_peer_wait }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "prefix_peer_wait": "{{ prefix_peer_wait }}", + } + } + } + } + }, + { + "name": "fabric_soo", + "getval": re.compile( + r""" + \s+fabric-soo + \s(?P\S+) + $""", re.VERBOSE + ), + "setval": "fabric-soo {{ fabric_soo }}", + "result": { + "fabric_soo": "{{ fabric_soo }}", + } + }, + { + "name": "rd", + "getval": re.compile( + r""" + \s+rd\s(?Pdual) + (\sid\s(?P\d+))? + $""", re.VERBOSE + ), + "setval": "rd dual{{' id ' + rd.id if rd.id is defined }}", + "result": { + "rd": { + "dual": "{{ not not dual }}", + "id": "{{ id }}", + } + } + }, + # VRF only + { + "name": "allocate_index", + "getval": re.compile( + r""" + \s+allocate-index\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "allocate-index {{ allocate_index }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "allocate_index": "{{ allocate_index }}", + } + }, + } + }, + # VRF only + { + "name": "local_as", + "getval": re.compile( + r""" + \s+local-as\s(?P\d+) + $""", re.VERBOSE + ), + "setval": "local-as {{ local_as }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "local_as": "{{ local_as }}", + } + } + } + }, + ] + # fmt: on diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospf_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospf_interfaces.py new file mode 100644 index 00000000..58575994 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospf_interfaces.py @@ -0,0 +1,505 @@ +# -*- 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 Ospf_interfaces 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.network_template import ( + NetworkTemplate, +) + + +def _tmplt_authentication(data): + auth = data.get("authentication") + cmd = "ip ospf authentication" + + if auth.get("enable") is False: + cmd = "no " + cmd + else: + if auth.get("message_digest"): + cmd += " message-digest" + elif auth.get("null_auth"): + cmd += " null" + return cmd + + +class Ospf_interfacesTemplate(NetworkTemplate): + def __init__(self, lines=None): + super(Ospf_interfacesTemplate, self).__init__(lines=lines, tmplt=self) + + # fmt: off + PARSERS = [ + { + "name": "interface", + "getval": re.compile(r''' + ^interface + \s(?P\S+)$''', re.VERBOSE), + "setval": "interface {{ name }}", + "result": { + "{{ name }}": { + "name": "{{ name }}", + "address_family": {}, + }, + }, + "shared": True, + }, + { + "name": "area", + "getval": re.compile( + r""" + \s+(?Pip|ipv6) + \srouter\s(ospf|ospfv3) + \s(?P\S+) + \sarea\s(?P\S+) + (\s(?Psecondaries\snone))?$""", + re.VERBOSE, + ), + "setval": "{{ 'ip' if afi == 'ipv4' else 'ipv6' }} " + "router {{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "{{ process_id }} area {{ area.area_id }}{{ ' secondaries none' if area.secondaries|default('True') == False}}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ 'ipv4' if afi == 'ip' else 'ipv6' }}", + "processes": { + "{{ process_id }}": { + "process_id": "{{ process_id }}", + "area": { + "area_id": "{{ area_id }}", + "secondaries": "{{ False if secondaries is defined else None }}", + }, + } + } + }, + } + } + } + }, + { + "name": "processes_multi_areas", + "getval": re.compile( + r""" + \s+(?Pip|ipv6) + \srouter\s(ospf|ospfv3) + \s(?P\S+) + \smulti-area\s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip' if afi == 'ipv4' else 'ipv6' }} " + "router {{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "{{ process_id }} multi-area {{ area }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ 'ipv4' if afi == 'ip' else 'ipv6' }}", + "processes": { + "{{ process_id }}": { + "process_id": "{{ process_id }}", + "multi_areas": [ + "{{ area }}", + ], + } + } + }, + } + } + } + }, + { + "name": "multi_areas", + "getval": re.compile( + r""" + \s+(?Pip|ipv6) + \srouter\s(ospf|ospfv3) + \smulti-area\s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip' if afi == 'ipv4' else 'ipv6' }} " + "router {{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "multi-area {{ area }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ 'ipv4' if afi == 'ip' else 'ipv6' }}", + "multi_areas": [ + "{{ area }}", + ] + }, + } + } + } + }, + { + "name": "authentication", + "getval": re.compile( + r""" + \s+(?Pip|ipv6) + \s(ospf|ospfv3) + \s(?Pauthentication) + (\s(?P(message-digest|null)))?$""", + re.VERBOSE, + ), + "setval": _tmplt_authentication, + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ 'ipv4' if afi == 'ip' else 'ipv6' }}", + "authentication": { + "enable": "{{ True if authentication is defined and opt is undefined }}", + "message_digest": "{{ True if opt == 'message-digest' else None }}", + "null_auth": "{{ True if opt == 'null' else None }}", + } + }, + } + } + } + }, + { + "name": "authentication.key_chain", + "getval": re.compile( + r""" + \s+(?Pip) + \sospf + \s(?Pauthentication) + \skey-chain\s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "ip ospf authentication key-chain {{ authentication.key_chain }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ afi|replace('ip', 'ipv4') }}", + "authentication": { + "key_chain": "{{ key_chain }}", + } + }, + } + } + } + }, + { + "name": "authentication_key", + "getval": re.compile( + r""" + \s+(?Pip) + \sospf + \sauthentication-key + \s(?P\d) + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "ip ospf authentication-key " + "{{ authentication_key.encryption }} {{ authentication_key.key }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ afi|replace('ip', 'ipv4') }}", + "authentication_key": { + "encryption": "{{ encryption }}", + "key": "{{ key }}", + } + }, + } + } + } + }, + { + "name": "message_digest_key", + "getval": re.compile( + r""" + \s+(?Pip) + \sospf + \smessage-digest-key + \s(?P\d+) + \smd5 + \s(?P\d) + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "ip ospf " + "message-digest-key {{ message_digest_key.key_id }} " + "md5 {{ message_digest_key.encryption|default('') }} {{ message_digest_key.key }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi }}": { + "afi": "{{ afi|replace('ip', 'ipv4') }}", + "message_digest_key": { + "key_id": "{{ key_id }}", + "encryption": "{{ encryption }}", + "key": "{{ key }}", + } + }, + } + } + } + }, + { + "name": "cost", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \scost\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "cost {{ cost }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "cost": "{{ cost }}", + }, + } + } + } + }, + { + "name": "dead_interval", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \sdead-interval\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "dead-interval {{ dead_interval }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "dead_interval": "{{ dead_interval }}", + }, + } + } + } + }, + { + "name": "hello_interval", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \shello-interval\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "hello-interval {{ hello_interval }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "hello_interval": "{{ hello_interval }}", + }, + } + } + } + }, + { + "name": "instance", + "getval": re.compile( + r""" + \s+(ospf|ospfv3) + \sinstance\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "ospfv3 instance {{ instance }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "ipv6", + "instance": "{{ instance }}", + }, + } + } + } + }, + { + "name": "mtu_ignore", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \s(?Pmtu-ignore)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "mtu-ignore", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "mtu_ignore": "{{ not not mtu_ignore }}", + }, + } + } + } + }, + { + "name": "network", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \snetwork\s(?P(broadcast|point-to-point))$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "network {{ network }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "network": "{{ network }}", + }, + } + } + } + }, + { + "name": "passive_interface", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \s(?Ppassive-interface)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "passive-interface", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "passive_interface": "{{ not not passive_interface }}", + }, + } + } + } + }, + { + "name": "priority", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \spriority\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "priority {{ priority }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "priority": "{{ priority }}", + }, + } + } + } + }, + { + "name": "retransmit_interval", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \sretransmit-interval\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "retransmit-interval {{ retransmit_interval }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "retransmit_interval": "{{ retransmit_interval }}", + }, + } + } + } + }, + { + "name": "shutdown", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \s(?Pshutdown)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "shutdown", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "shutdown": "{{ not not shutdown }}", + }, + } + } + } + }, + { + "name": "transmit_delay", + "getval": re.compile( + r""" + \s+(?Pip)? + \s(ospf|ospfv3) + \stransmit-delay\s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "{{ 'ip ' if afi == 'ipv4' else '' }}" + "{{ 'ospf' if afi == 'ipv4' else 'ospfv3' }} " + "transmit-delay {{ transmit_delay }}", + "result": { + "{{ name }}": { + "address_family": { + "{{ afi|d('ipv6') }}": { + "afi": "{{ 'ipv4' if afi is defined else 'ipv6' }}", + "transmit_delay": "{{ transmit_delay }}", + }, + } + } + } + }, + ] + # fmt: on diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv2.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv2.py new file mode 100644 index 00000000..8aaf41a5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv2.py @@ -0,0 +1,1105 @@ +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network_template import ( + NetworkTemplate, +) + + +def _tmplt_area_range(arange): + command = "area {area} range {range}".format(**arange) + if arange.get("not_advertise") is True: + command += " not-advertise" + if "cost" in arange: + command += " cost {cost}".format(**arange) + return command + + +def _tmplt_default_information(proc): + command = "default-information originate" + if ( + "always" in proc["default_information"] + and proc["default_information"]["always"] + ): + command += " always" + if "route_map" in proc["default_information"]: + command += " route-map" + command += " {default_information[route_map]}".format(**proc) + return command + + +def _tmplt_log_adjacency_changes(proc): + command = "log-adjacency-changes" + if proc.get("log_adjacency_changes").get("detail", False) is True: + command += " detail" + return command + + +def _tmplt_area_authentication(area): + command = "area {area_id} authentication".format(**area) + if area.get("authentication", {}).get("message_digest"): + command += " message-digest" + return command + + +def _tmplt_max_lsa(proc): + max_lsa = proc["max_lsa"] + command = "max-lsa {max_non_self_generated_lsa}".format(**max_lsa) + if max_lsa.get("threshold"): + command += " {threshold}".format(**max_lsa) + if max_lsa.get("warning_only"): + command += " warning-only" + if max_lsa.get("ignore_time"): + command += " ignore-time {ignore_time}".format(**max_lsa) + if max_lsa.get("ignore_count"): + command += " ignore-count {ignore_count}".format(**max_lsa) + if max_lsa.get("reset_time"): + command += " reset-time {reset_time}".format(**max_lsa) + return command + + +def _tmplt_default_information(proc): + default_information = proc["default_information"]["originate"] + command = "default-information originate" + + if default_information.get("set") is False: + command = "no {0}".format(command) + else: + if default_information.get("always"): + command += " always" + if default_information.get("route_map"): + command += " route-map {route_map}".format(**default_information) + + return command + + +def _tmplt_table_map(proc): + table_map = proc["table_map"] + command = "table-map" + + if table_map.get("name"): + command += " {name}".format(**table_map) + if table_map.get("filter"): + command += " filter" + + return command + + +def _tmplt_max_metric(proc): + max_metric = proc["max_metric"] + command = "max-metric router-lsa" + + if max_metric.get("router_lsa", {}).get("set") is False: + command = "no {0}".format(command) + else: + external_lsa = max_metric.get("router_lsa", {}).get("external_lsa", {}) + include_stub = max_metric.get("router_lsa", {}).get("include_stub", {}) + on_startup = max_metric.get("router_lsa", {}).get("on_startup", {}) + summary_lsa = max_metric.get("router_lsa", {}).get("summary_lsa", {}) + if external_lsa: + command += " external-lsa" + if external_lsa.get("max_metric_value"): + command += " {max_metric_value}".format(**external_lsa) + if include_stub: + command += " include-stub" + if on_startup: + command += " on-startup" + if on_startup.get("wait_period"): + command += " {wait_period}".format(**on_startup) + if on_startup.get("wait_for_bgp_asn"): + command += " wait-for bgp {wait_for_bgp_asn}".format( + **on_startup + ) + if summary_lsa: + command += " summary-lsa" + if summary_lsa.get("max_metric_value"): + command += " {max_metric_value}".format(**summary_lsa) + + return command + + +def _tmplt_area_nssa(area): + nssa = area["nssa"] + command = "area {area_id} nssa".format(**area) + if nssa.get("set") is False: + command = "no {0}".format(command) + else: + for attrib in [ + "no_summary", + "no_redistribution", + "default_information_originate", + ]: + if nssa.get(attrib): + command += " {0}".format(attrib.replace("_", "-")) + return command + + +def _tmplt_area_nssa_translate(area): + translate = area["nssa"]["translate"]["type7"] + command = "area {area_id} nssa translate type7".format(**area) + for attrib in ["always", "never", "supress_fa"]: + if translate.get(attrib): + command += " {0}".format(attrib.replace("_", "-")) + return command + + +def _tmplt_area_ranges(arange): + command = "area {area_id} range {prefix}".format(**arange) + if arange.get("not_advertise") is True: + command += " not-advertise" + if "cost" in arange: + command += " cost {cost}".format(**arange) + return command + + +def _tmplt_area_ranges(arange): + command = "area {area_id} range {prefix}".format(**arange) + if arange.get("not_advertise") is True: + command += " not-advertise" + if "cost" in arange: + command += " cost {cost}".format(**arange) + return command + + +def _tmplt_summary_address(proc): + command = "summary-address {prefix}".format(**proc) + if proc.get("tag"): + command += " tag {tag}".format(**proc) + elif proc.get("not_advertise"): + command += " not-advertise" + return command + + +def _tmplt_area_stub(area): + stub = area["stub"] + command = "area {area_id} stub".format(**area) + if stub.get("set") is False: + command = "no {0}".format(command) + elif stub.get("no_summary"): + command += " no-summary" + return command + + +def _tmplt_redistribute(redis): + command = "redistribute {protocol}".format(**redis) + if redis.get("id"): + command += " {id}".format(**redis) + if redis.get("route_map"): + command += " route-map {route_map}".format(**redis) + return command + + +def _tmplt_capability_vrf_lite(proc): + command = "capability vrf-lite" + vrf_lite = proc["capability"]["vrf_lite"] + if vrf_lite.get("set") is False: + command = "no {0}".format(command) + else: + if vrf_lite.get("evpn"): + command += " evpn" + return command + + +class Ospfv2Template(NetworkTemplate): + def __init__(self, lines=None): + super(Ospfv2Template, self).__init__(lines=lines, tmplt=self) + + # fmt: off + PARSERS = [ + { + "name": "vrf", + "getval": re.compile( + r""" + \s+vrf + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "vrf {{ vrf }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "vrf": "{{ vrf }}" + } + } + }, + "shared": True, + }, + { + "name": "bfd", + "getval": re.compile( + r""" + \s+(?Pbfd)$""", + re.VERBOSE, + ), + "setval": "bfd", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bfd": "{{ not not bfd }}" + } + } + }, + }, + { + "name": "process_id", + "getval": re.compile( + r""" + ospf(?:v3)*\s + (?P\S+)""", + re.VERBOSE, + ), + "setval": "router ospf {{ process_id }}", + "result": { + "process_id": "{{ process_id }}", + }, + "shared": True, + }, + { + "name": "down_bit_ignore", + "getval": re.compile( + r""" + \s+(?Pdown-bit-ignore)$""", + re.VERBOSE, + ), + "setval": "down-bit-ignore", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "down_bit_ignore": "{{ not not down_bit_ignore }}", + } + } + }, + }, + { + "name": "capability.vrf_lite", + "getval": re.compile( + r""" + \s+capability + \s(?Pvrf-lite) + \s*(?Pevpn)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_capability_vrf_lite, + "remval": "capability vrf-lite", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "capability": { + "vrf_lite": { + "set": "{{ True if vrf_lite is defined and evpn is undefined else None }}", + "evpn": "{{ not not evpn }}", + } + } + } + } + }, + }, + { + "name": "auto_cost", + "getval": re.compile( + r""" + \s+auto-cost\sreference-bandwidth\s + (?P\d+)\s(?P\S+)$""", + re.VERBOSE, + ), + "setval": ( + "auto-cost reference-bandwidth" + " {{ auto_cost.reference_bandwidth }}" + " {{ auto_cost.unit }}" + ), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "auto_cost": { + "reference_bandwidth": "{{ acrb }}", + "unit": "{{ unit }}", + } + } + } + }, + }, + { + "name": "flush_routes", + "getval": re.compile( + r""" + \s+(?Pflush-routes)$""", + re.VERBOSE, + ), + "setval": "flush-routes", + "result": { + "flush_routes": "{{ not not flush_routes }}" + }, + }, + { + "name": "graceful_restart.set", + "getval": re.compile( + r""" + \s+(?Pno\sgraceful-restart) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart", + "remval": "no graceful-restart", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "set": "{{ not graceful_restart }}" + } + } + } + }, + }, + { + "name": "graceful_restart.helper_disable", + "getval": re.compile( + r""" + \s+graceful-restart + \s+(?Phelper-disable) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart helper-disable", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "helper_disable": "{{ not not helper_disable }}", + } + } + } + }, + }, + { + "name": "graceful_restart.grace_period", + "getval": re.compile( + r""" + \s+graceful-restart + \s+grace-period + \s+(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart helper-disable", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "grace_period": "{{ grace_period }}", + } + } + } + }, + }, + { + "name": "isolate", + "getval": re.compile( + r""" + \s+(?Pisolate)$""", + re.VERBOSE, + ), + "setval": "isolate", + "result": {"isolate": "{{ not not isolate }}"}, + }, + { + "name": "log_adjacency_changes", + "getval": re.compile( + r""" + \s+(?Plog-adjacency-changes) + \s*(?Pdetail)*$""", + re.VERBOSE, + ), + "setval": _tmplt_log_adjacency_changes, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "log_adjacency_changes": { + "log": "{{ True if log is defined and detail is undefined else None }}", + "detail": "{{ True if detail is defined else None }}", + } + } + } + }, + }, + { + "name": "max_lsa", + "getval": re.compile( + r""" + \s+max-lsa + \s(?P\d+) + \s*(?P\d*) + \s*(?Pwarning-only)* + \s*(ignore-time)*\s*(?P\d*) + \s*(ignore-count)*\s*(?P\d*) + \s*(reset-time)*\s*(?P\d*) + $""", + re.VERBOSE, + ), + "setval": _tmplt_max_lsa, + "remval": "max-lsa {{ max_lsa.max_non_self_generated_lsa }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "max_lsa": { + "max_non_self_generated_lsa": "{{ max_gen_lsa }}", + "threshold": "{{ threshold }}", + "ignore_time": "{{ ig_time }}", + "ignore_count": "{{ ig_count }}", + "reset_time": "{{ rst_time }}", + "warning_only": "{{ not not warning_only }}", + } + } + } + }, + }, + { + "name": "mpls.traffic_eng.areas", + "getval": re.compile( + r""" + \s+mpls\straffic-eng\sarea + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": ("mpls traffic-eng area {{ area_id }}"), + "result": { + "mpls": { + "traffic_eng": { + "areas": [ + { + "area_id": "{{ area_id }}", + } + ] + } + } + }, + }, + { + "name": "mpls.traffic_eng.router_id", + "getval": re.compile( + r""" + \s+mpls\straffic-eng\srouter-id + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": ( + "mpls traffic-eng router-id" " {{ mpls.traffic_eng.router_id }}" + ), + "result": {"mpls": {"traffic_eng": {"router_id": "{{ router_id }}"}}}, + }, + { + "name": "mpls.traffic_eng.multicast_intact", + "getval": re.compile( + r""" + \s+mpls\straffic-eng + \s(?Pmulticast-intact) + $""", + re.VERBOSE, + ), + "setval": ("mpls traffic-eng multicast-intact"), + "result": { + "mpls": { + "traffic_eng": { + "multicast_intact": "{{ not not multicast_intact }}" + } + } + }, + }, + { + "name": "name_lookup", + "getval": re.compile( + r""" + \s+(?Pname-lookup) + $""", + re.VERBOSE, + ), + "setval": ("name-lookup"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "name_lookup": "{{ not not name_lookup }}" + } + } + }, + }, + { + "name": "passive_interface.default", + "getval": re.compile( + r""" + \s+passive-interface + \s+(?Pdefault) + $""", + re.VERBOSE, + ), + "setval": ("passive-interface default"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "passive_interface": {"default": "{{ not not default }}"} + } + } + }, + }, + { + "name": "rfc1583compatibility", + "getval": re.compile( + r""" + \s+(?Prfc1583compatibility)$""", + re.VERBOSE, + ), + "setval": ("rfc1583compatibility"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "rfc1583compatibility": "{{ not not rfc }}" + } + } + }, + }, + { + "name": "router_id", + "getval": re.compile( + r""" + \s+router-id + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": ("router-id" " {{ router_id }}"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "router_id": "{{ router_id }}" + } + } + }, + }, + { + "name": "shutdown", + "getval": re.compile( + r""" + \s+(?Pshutdown)$""", + re.VERBOSE, + ), + "setval": ("shutdown"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "shutdown": "{{ not not shutdown }}" + } + } + }, + }, + { + "name": "default_information.originate", + "getval": re.compile( + r""" + \s+default-information + \s(?Poriginate) + \s*(?Palways)* + \s*(route-map)* + \s*(?P\S+)*$""", + re.VERBOSE, + ), + "setval": _tmplt_default_information, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "default_information": { + "originate": { + "set": "{{ True if originate is defined and always is undefined and route_map is undefined else None }}", + "always": "{{ not not always }}", + "route_map": "{{ route_map }}", + } + } + } + } + }, + }, + { + "name": "default_metric", + "getval": re.compile( + r""" + \s+default-metric + \s(?P\d+)$""", + re.VERBOSE, + ), + "setval": ("default-metric {{ default_metric }}"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "default_metric": "{{ default_metric }}" + } + } + }, + }, + { + "name": "distance", + "getval": re.compile( + r""" + \s+distance + \s(?P\d+)$""", + re.VERBOSE, + ), + "setval": ("distance {{ distance }}"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "distance": "{{ distance }}" + } + } + }, + }, + { + "name": "table_map", + "getval": re.compile( + r""" + \s+table-map + \s(?P\S+) + \s*(?Pfilter)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_table_map, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "table_map": { + "name": "{{ rmap }}", + "filter": "{{ not not filter }}", + } + } + } + }, + }, + { + "name": "timers.lsa_arrival", + "getval": re.compile( + r""" + \s+timers + \slsa-arrival + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": ("timers lsa-arrival {{ timers.lsa_arrival }}"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "lsa_arrival": "{{ lsa_arrival_val }}" + } + } + } + }, + }, + { + "name": "timers.lsa_group_pacing", + "getval": re.compile( + r""" + \s+timers + \slsa-group-pacing + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "timers lsa-group-pacing {{ timers.lsa_group_pacing }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "lsa_group_pacing": "{{ lsa_group_pacing }}" + } + } + } + }, + }, + { + "name": "timers.throttle.lsa", + "getval": re.compile( + r""" + \s+timers\sthrottle\slsa + \s(?P\d+) + \s(?P\d+) + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "timers throttle lsa {{ timers.throttle.lsa.start_interval }}" + " {{ timers.throttle.lsa.hold_interval }}" + " {{ timers.throttle.lsa.max_interval }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "throttle": { + "lsa": { + "start_interval": "{{ start }}", + "hold_interval": "{{ hold }}", + "max_interval": "{{ max }}", + } + } + } + } + } + }, + }, + { + "name": "timers.throttle.spf", + "getval": re.compile( + r""" + \s+timers\sthrottle\sspf + \s(?P\d+) + \s(?P\d+) + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "timers throttle spf {{ timers.throttle.spf.initial_spf_delay }}" + " {{ timers.throttle.spf.min_hold_time }}" + " {{ timers.throttle.spf.max_wait_time }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "throttle": { + "spf": { + "initial_spf_delay": "{{ initial }}", + "min_hold_time": "{{ min }}", + "max_wait_time": "{{ max }}", + } + } + } + } + } + }, + }, + { + "name": "area.default_cost", + "getval": re.compile( + r""" + \s+area\s(?P\S+)\s + default-cost\s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "area {{ area_id }} default-cost {{ default_cost }}", + "compval": "default_cost", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "default_cost": "{{ default_cost|int }}", + } + } + } + } + }, + }, + { + "name": "area.authentication", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \s(?Pauthentication) + \s*(?Pmessage-digest)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_authentication, + "remval": "area {{ area_id }} authentication", + "compval": "authentication", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "authentication": { + "set": "{{ True if auth is defined and md is undefined }}", + "message_digest": "{{ True if md is defined else False }}" + }, + } + } + } + } + }, + }, + { + "name": "area.filter_list", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \sfilter-list + \sroute-map\s(?P\S+) + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "area {{ area_id }} filter-list route-map {{ route_map }} {{ direction }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "filter_list": [ + { + "route_map": "{{ rmap }}", + "direction": "{{ dir }}", + }, + ], + } + } + } + } + }, + }, + { + "name": "redistribute", + "getval": re.compile( + r""" + \s+redistribute + \s(?P\S+) + \s*(?P\S+)* + \sroute-map\s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": _tmplt_redistribute, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "redistribute": [ + { + "protocol": "{{ protocol }}", + "id": "{{ id }}", + "route_map": "{{ rmap }}", + }, + ] + } + } + }, + }, + { + "name": "area.nssa", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \s(?Pnssa) + \s*(?Pno-summary)* + \s*(?Pno-redistribution)* + \s*(?Pdefault-information-originate)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_nssa, + "remval": "area {{ area_id }} nssa", + "compval": "nssa", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "nssa": { + "set": "{{ True if nssa is defined and no_sum is undefined and no_redis is undefined and def_info is undefined }}", + "no_summary": "{{ not not no_sum }}", + "no_redistribution": "{{ not not no_redis }}", + "default_information_originate": "{{ not not def_info }}", + }, + } + } + } + } + }, + }, + { + "name": "area.nssa.translate", + "getval": re.compile( + r""" + \s+area\s(?P\S+)\snssa + \stranslate + \stype7 + \s(?Palways|never) + \s*(?Psupress-fa)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_nssa_translate, + "compval": "nssa.translate", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "nssa": { + "translate": { + "type7": { + "always": '{{ True if choice == "always" else None }}', + "never": '{{ True if choice == "never" else None }}', + "supress_fa": "{{ not not supress_fa }}", + } + } + }, + } + } + } + } + }, + }, + { + "name": "area.ranges", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \srange\s(?P\S+) + \s*(cost)*\s*(?P\d+)* + \s*(?Pnot-advertise)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_ranges, + "remval": "area {{ area_id }} range {{ prefix }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "ranges": [ + { + "prefix": "{{ prefix }}", + "cost": "{{ cost }}", + "not_advertise": "{{ not not not_adver }}", + }, + ], + } + } + } + } + }, + }, + { + "name": "summary_address", + "getval": re.compile( + r""" + \s+summary-address + \s(?P\S+) + \s*(?Pnot-advertise)* + \s*(tag)*\s*(?P\d+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_summary_address, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "summary_address": [ + { + "prefix": "{{ prefix }}", + "not_advertise": "{{ not not not_adver }}", + "tag": "{{ tag }}", + }, + ] + } + } + }, + }, + { + "name": "area.stub", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \s(?Pstub) + \s*(?Pno-summary)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_stub, + "remval": "area {{ area_id }} stub", + "compval": "stub", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "stub": { + "set": "{{ True if stub is defined and no_summary is undefined else None }}", + "no_summary": "{{ not not no_summary }}", + }, + } + } + } + } + }, + }, + { + "name": "maximum_paths", + "getval": re.compile( + r""" + \s+maximum-paths + \s(?P\d+)$""", + re.VERBOSE, + ), + "setval": ("maximum-paths {{ maximum_paths }}"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': {"maximum_paths": "{{ maximum_paths }}"} + } + }, + }, + { + "name": "max_metric", + "getval": re.compile( + r""" + \s+max-metric + \s+(?Prouter-lsa) + \s*(?Pexternal-lsa)* + \s*(?P\d+)* + \s*(?Pinclude-stub)* + \s*(?Pon-startup)* + \s*(?P\d+)* + \s*(wait-for\sbgp)* + \s*(?P\d+)* + \s*(?Psummary-lsa)* + \s*(?P\d+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_max_metric, + "remval": "max-metric router-lsa", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "max_metric": { + "router_lsa": { + "set": "{{ True if router_lsa is defined and external_lsa is undefined else None }}", + "external_lsa": { + "set": "{{ True if external_lsa is defined and max_metric_value is undefined else None }}", + "max_metric_value": "{{ max_metric_value }}", + }, + "include_stub": "{{ not not include_stub }}", + "on_startup": { + "set": "{{ True if on_startup is defined and (wait_period and bgp_asn) is undefined else None }}", + "wait_period": "{{ wait_period }}", + "wait_for_bgp_asn": "{{ bgp_asn }}", + }, + "summary_lsa": { + "set": "{{ True if summary_lsa is defined and sum_lsa_max_metric_value is undefined else None }}", + "max_metric_value": "{{ sum_lsa_max_metric_value }}", + }, + } + } + } + } + }, + }, + ] + # fmt: on diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv3.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv3.py new file mode 100644 index 00000000..f2bd7cad --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/rm_templates/ospfv3.py @@ -0,0 +1,951 @@ +# -*- 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 Ospfv3 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.network_template import ( + NetworkTemplate, +) + + +def _tmplt_area_nssa(area): + nssa = area["nssa"] + command = "area {area_id} nssa".format(**area) + if nssa.get("set") is False: + command = "no {0}".format(command) + else: + for attrib in [ + "no_summary", + "no_redistribution", + "default_information_originate", + ]: + if nssa.get(attrib): + command += " {0}".format(attrib.replace("_", "-")) + if nssa.get("route_map"): + command += " route-map {route_map}".format(**nssa) + return command + + +def _tmplt_area_nssa_translate(area): + translate = area["nssa"]["translate"]["type7"] + command = "area {area_id} nssa translate type7".format(**area) + for attrib in ["always", "never", "supress_fa"]: + if translate.get(attrib): + command += " {0}".format(attrib.replace("_", "-")) + return command + + +def _tmplt_area_stub(area): + stub = area["stub"] + command = "area {area_id} stub".format(**area) + if stub.get("set") is False: + command = "no {0}".format(command) + elif stub.get("no_summary"): + command += " no-summary" + return command + + +def _tmplt_log_adjacency_changes(proc): + command = "log-adjacency-changes" + if proc.get("log_adjacency_changes").get("detail", False) is True: + command += " detail" + return command + + +def _tmplt_max_lsa(proc): + max_lsa = proc["max_lsa"] + command = "max-lsa {max_non_self_generated_lsa}".format(**max_lsa) + if max_lsa.get("threshold"): + command += " {threshold}".format(**max_lsa) + if max_lsa.get("warning_only"): + command += " warning-only" + if max_lsa.get("ignore_time"): + command += " ignore-time {ignore_time}".format(**max_lsa) + if max_lsa.get("ignore_count"): + command += " ignore-count {ignore_count}".format(**max_lsa) + if max_lsa.get("reset_time"): + command += " reset-time {reset_time}".format(**max_lsa) + return command + + +def _tmplt_max_metric(proc): + max_metric = proc["max_metric"] + command = "max-metric router-lsa" + + if max_metric.get("router_lsa", {}).get("set") is False: + command = "no {0}".format(command) + else: + external_lsa = max_metric.get("router_lsa", {}).get("external_lsa", {}) + stub_prefix_lsa = max_metric.get("router_lsa", {}).get( + "stub_prefix_lsa", {} + ) + on_startup = max_metric.get("router_lsa", {}).get("on_startup", {}) + inter_area_prefix_lsa = max_metric.get("router_lsa", {}).get( + "inter_area_prefix_lsa", {} + ) + if external_lsa: + command += " external-lsa" + if external_lsa.get("max_metric_value"): + command += " {max_metric_value}".format(**external_lsa) + if stub_prefix_lsa: + command += " stub-prefix-lsa" + if on_startup: + command += " on-startup" + if on_startup.get("wait_period"): + command += " {wait_period}".format(**on_startup) + if on_startup.get("wait_for_bgp_asn"): + command += " wait-for bgp {wait_for_bgp_asn}".format( + **on_startup + ) + if inter_area_prefix_lsa: + command += " inter-area-prefix-lsa" + if inter_area_prefix_lsa.get("max_metric_value"): + command += " {max_metric_value}".format( + **inter_area_prefix_lsa + ) + + return command + + +def _tmplt_area_ranges(arange): + command = "area {area_id} range {prefix}".format(**arange) + if arange.get("not_advertise") is True: + command += " not-advertise" + if "cost" in arange: + command += " cost {cost}".format(**arange) + return command + + +def _tmplt_default_information(proc): + default_information = proc["default_information"]["originate"] + command = "default-information originate" + + if default_information.get("set") is False: + command = "no {0}".format(command) + else: + if default_information.get("always"): + command += " always" + if default_information.get("route_map"): + command += " route-map {route_map}".format(**default_information) + + return command + + +def _tmplt_redistribute(redis): + command = "redistribute {protocol}".format(**redis) + if redis.get("id"): + command += " {id}".format(**redis) + command += " route-map {route_map}".format(**redis) + return command + + +def _tmplt_summary_address(proc): + command = "summary-address {prefix}".format(**proc) + if proc.get("tag"): + command += " tag {tag}".format(**proc) + elif proc.get("not_advertise"): + command += " not-advertise" + return command + + +def _tmplt_table_map(proc): + table_map = proc["table_map"] + command = "table-map {name}".format(**table_map) + if table_map.get("filter"): + command += " filter" + + return command + + +class Ospfv3Template(NetworkTemplate): + def __init__(self, lines=None): + super(Ospfv3Template, self).__init__(lines=lines, tmplt=self) + + # fmt: off + PARSERS = [ + { + "name": "vrf", + "getval": re.compile( + r""" + \s+vrf + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "vrf {{ vrf }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "vrf": "{{ vrf }}" + } + } + }, + "shared": True, + }, + { + "name": "process_id", + "getval": re.compile( + r""" + ospfv3 + \s(?P\S+)""", + re.VERBOSE, + ), + "setval": "router ospfv3 {{ process_id }}", + "result": { + "process_id": "{{ process_id }}", + }, + "shared": True, + }, + { + "name": "router_id", + "getval": re.compile( + r""" + \s+router-id + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "router-id {{ router_id }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "router_id": "{{ router_id }}" + } + } + }, + }, + { + "name": "address_family", + "getval": re.compile( + r""" + \s+address-family + \s(?P\S+) + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "address-family {{ afi }} {{ safi }}", + "result": { + "address_family": { + "afi": "{{ afi }}", + "safi": "{{ safi }}", + } + }, + 'shared': True, + }, + { + "name": "area.default_cost", + "getval": re.compile( + r""" + \s+area\s(?P\S+)\s + default-cost\s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "area {{ area_id }} default-cost {{ default_cost }}", + "compval": "default_cost", + "result": { + 'address_family': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "default_cost": "{{ default_cost|int }}", + } + } + } + }, + }, + { + "name": "area.filter_list", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \sfilter-list + \sroute-map\s(?P\S+) + \s(?P\S+)$""", + re.VERBOSE, + ), + "setval": "area {{ area_id }} filter-list route-map {{ route_map }} {{ direction }}", + "result": { + 'address_family': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "filter_list": [ + { + "route_map": "{{ rmap }}", + "direction": "{{ dir }}", + }, + ], + } + } + } + }, + }, + { + "name": "area.ranges", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \srange\s(?P\S+) + \s*(cost)*\s*(?P\d+)* + \s*(?Pnot-advertise)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_ranges, + "remval": "area {{ area_id }} range {{ prefix }}", + "result": { + "address_family": { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "ranges": [ + { + "prefix": "{{ prefix }}", + "cost": "{{ cost }}", + "not_advertise": "{{ not not not_adver }}", + }, + ], + } + } + } + }, + }, + { + "name": "default_information.originate", + "getval": re.compile( + r""" + \s+default-information + \s(?Poriginate) + \s*(?Palways)* + \s*(route-map)* + \s*(?P\S+)*$""", + re.VERBOSE, + ), + "setval": _tmplt_default_information, + "result": { + "address_family": { + "default_information": { + "originate": { + "set": "{{ True if originate is defined and always is undefined and route_map is undefined else None }}", + "always": "{{ not not always }}", + "route_map": "{{ route_map }}", + } + } + } + }, + }, + { + "name": "distance", + "getval": re.compile( + r""" + \s+distance + \s(?P\d+)$""", + re.VERBOSE, + ), + "setval": "distance {{ distance }}", + "result": { + "address_family": { + "distance": "{{ distance }}" + } + }, + }, + { + "name": "maximum_paths", + "getval": re.compile( + r""" + \s+maximum-paths + \s(?P\d+)$""", + re.VERBOSE, + ), + "setval": ("maximum-paths {{ maximum_paths }}"), + "result": { + "address_family": { + "maximum_paths": "{{ maximum_paths }}" + } + }, + }, + { + "name": "redistribute", + "getval": re.compile( + r""" + \s+redistribute + \s(?P\S+) + \s*(?P\S+)* + \sroute-map\s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": _tmplt_redistribute, + "result": { + "address_family": { + "redistribute": [ + { + "protocol": "{{ protocol }}", + "id": "{{ id }}", + "route_map": "{{ rmap }}", + }, + ] + } + }, + }, + { + "name": "summary_address", + "getval": re.compile( + r""" + \s+summary-address + \s(?P\S+) + \s*(?Pnot-advertise)* + \s*(tag)*\s*(?P\d+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_summary_address, + "result": { + "address_family": { + "summary_address": [ + { + "prefix": "{{ prefix }}", + "not_advertise": "{{ not not not_adver }}", + "tag": "{{ tag }}", + }, + ] + } + }, + }, + { + "name": "table_map", + "getval": re.compile( + r""" + \s+table-map + \s(?P\S+) + \s*(?Pfilter)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_table_map, + "result": { + "address_family": { + "table_map": { + "name": "{{ rmap }}", + "filter": "{{ not not filter }}", + } + } + }, + }, + { + "name": "timers.throttle.spf", + "getval": re.compile( + r""" + \s+timers\sthrottle\sspf + \s(?P\d+) + \s(?P\d+) + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "timers throttle spf {{ timers.throttle.spf.initial_spf_delay }}" + " {{ timers.throttle.spf.min_hold_time }}" + " {{ timers.throttle.spf.max_wait_time }}", + "result": { + "address_family": { + "timers": { + "throttle": { + "spf": { + "initial_spf_delay": "{{ initial }}", + "min_hold_time": "{{ min }}", + "max_wait_time": "{{ max }}", + } + } + } + } + }, + }, + { + "name": "area.nssa", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \s(?Pnssa) + \s*(?Pno-summary)* + \s*(?Pno-redistribution)* + \s*(?Pdefault-information-originate)* + \s*(route-map)*\s*(?P\S+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_nssa, + "remval": "area {{ area_id }} nssa", + "compval": "nssa", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "nssa": { + "set": "{{ True if nssa is defined and no_sum is undefined and no_redis is undefined and \ + def_info is undefined and rmap is undefined }}", + "no_summary": "{{ not not no_sum }}", + "no_redistribution": "{{ not not no_redis }}", + "default_information_originate": "{{ not not def_info }}", + "route_map": "{{ rmap }}", + }, + } + } + } + } + }, + }, + { + "name": "area.nssa.translate", + "getval": re.compile( + r""" + \s+area\s(?P\S+)\snssa + \stranslate + \stype7 + \s(?Palways|never) + \s*(?Psupress-fa)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_nssa_translate, + "compval": "nssa.translate", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "nssa": { + "translate": { + "type7": { + "always": '{{ True if choice == "always" else None }}', + "never": '{{ True if choice == "never" else None }}', + "supress_fa": "{{ not not supress_fa }}", + } + } + }, + } + } + } + } + }, + }, + { + "name": "area.stub", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \s(?Pstub) + \s*(?Pno-summary)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_area_stub, + "remval": "area {{ area_id }} stub", + "compval": "stub", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "stub": { + "set": "{{ True if stub is defined and no_summary is undefined else None }}", + "no_summary": "{{ not not no_summary }}", + }, + } + } + } + } + }, + }, + { + "name": "area.virtual_link", + "getval": re.compile( + r""" + \s+area\s(?P\S+) + \svirtual-link + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": "area {{ area_id }} virtual-link {{ virtual_link }}", + "compval": "virtual_link", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "areas": { + "{{ area_id }}": { + "area_id": "{{ area_id }}", + "virtual_link": "{{ virtual_link }}", + }, + } + } + } + }, + }, + { + "name": "auto_cost", + "getval": re.compile( + r""" + \s+auto-cost\sreference-bandwidth\s + (?P\d+)\s(?P\S+)$""", + re.VERBOSE, + ), + "setval": ( + "auto-cost reference-bandwidth" + " {{ auto_cost.reference_bandwidth }}" + " {{ auto_cost.unit }}" + ), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "auto_cost": { + "reference_bandwidth": "{{ acrb }}", + "unit": "{{ unit }}", + } + } + } + }, + }, + { + "name": "flush_routes", + "getval": re.compile( + r""" + \s+(?Pflush-routes)$""", + re.VERBOSE, + ), + "setval": "flush-routes", + "result": { + "flush_routes": "{{ not not flush_routes }}" + }, + }, + { + "name": "graceful_restart.set", + "getval": re.compile( + r""" + \s+(?Pno\sgraceful-restart) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart", + "remval": "no graceful-restart", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "set": "{{ not graceful_restart }}" + } + } + } + }, + }, + { + "name": "graceful_restart.helper_disable", + "getval": re.compile( + r""" + \s+graceful-restart + \s+(?Phelper-disable) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart helper-disable", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "helper_disable": "{{ not not helper_disable }}", + } + } + } + }, + }, + { + "name": "graceful_restart.grace_period", + "getval": re.compile( + r""" + \s+graceful-restart + \s+grace-period + \s+(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart grace-period {{ graceful_restart.grace_period }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "grace_period": "{{ grace_period }}", + } + } + } + }, + }, + { + "name": "graceful_restart.planned_only", + "getval": re.compile( + r""" + \s+no + \s+graceful-restart + \s+(?Pplanned-only) + $""", + re.VERBOSE, + ), + "setval": "graceful-restart planned-only", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "graceful_restart": { + "planned_only": "{{ not planned_only }}", + } + } + } + }, + }, + { + "name": "isolate", + "getval": re.compile( + r""" + \s+(?Pisolate)$""", + re.VERBOSE, + ), + "setval": "isolate", + "result": {"isolate": "{{ not not isolate }}"}, + }, + { + "name": "log_adjacency_changes", + "getval": re.compile( + r""" + \s+(?Plog-adjacency-changes) + \s*(?Pdetail)*$""", + re.VERBOSE, + ), + "setval": _tmplt_log_adjacency_changes, + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "log_adjacency_changes": { + "log": "{{ True if log is defined and detail is undefined else None }}", + "detail": "{{ True if detail is defined else None }}", + } + } + } + }, + }, + { + + "name": "max_lsa", + "getval": re.compile( + r""" + \s+max-lsa + \s(?P\d+) + \s*(?P\d*) + \s*(?Pwarning-only)* + \s*(ignore-time)*\s*(?P\d*) + \s*(ignore-count)*\s*(?P\d*) + \s*(reset-time)*\s*(?P\d*) + $""", + re.VERBOSE, + ), + "setval": _tmplt_max_lsa, + "remval": "max-lsa {{ max_lsa.max_non_self_generated_lsa }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "max_lsa": { + "max_non_self_generated_lsa": "{{ max_gen_lsa }}", + "threshold": "{{ threshold }}", + "ignore_time": "{{ ig_time }}", + "ignore_count": "{{ ig_count }}", + "reset_time": "{{ rst_time }}", + "warning_only": "{{ not not warning_only }}", + } + } + } + }, + }, + { + "name": "max_metric", + "getval": re.compile( + r""" + \s+max-metric + \s+(?Prouter-lsa) + \s*(?Pexternal-lsa)* + \s*(?P\d+)* + \s*(?Pstub-prefix-lsa)* + \s*(?Pon-startup)* + \s*(?P\d+)* + \s*(wait-for\sbgp)* + \s*(?P\d+)* + \s*(?Pinter-area-prefix-lsa)* + \s*(?P\d+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_max_metric, + "remval": "max-metric router-lsa", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "max_metric": { + "router_lsa": { + "set": "{{ True if router_lsa is defined and (external_lsa is undefined) and (inter_area_prefix_lsa is undefined) and \ + (stub_prefix_lsa is undefined) and (on_startup is undefined) else None }}", + "external_lsa": { + "set": "{{ True if external_lsa is defined and max_metric_value is undefined else None }}", + "max_metric_value": "{{ max_metric_value }}", + }, + "stub_prefix_lsa": "{{ not not stub_prefix_lsa }}", + "on_startup": { + "set": "{{ True if on_startup is defined and (wait_period and bgp_asn) is undefined else None }}", + "wait_period": "{{ wait_period }}", + "wait_for_bgp_asn": "{{ bgp_asn }}", + }, + "inter_area_prefix_lsa": { + "set": "{{ True if inter_area_prefix_lsa is defined and max_metric_summary_lsa is undefined else None }}", + "max_metric_value": "{{ max_metric_summary_lsa }}", + }, + } + } + } + } + }, + }, + { + "name": "name_lookup", + "getval": re.compile( + r""" + \s+(?Pname-lookup) + $""", + re.VERBOSE, + ), + "setval": ("name-lookup"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "name_lookup": "{{ not not name_lookup }}" + } + } + }, + }, + { + "name": "passive_interface.default", + "getval": re.compile( + r""" + \s+passive-interface + \s+(?Pdefault) + $""", + re.VERBOSE, + ), + "setval": ("passive-interface default"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "passive_interface": {"default": "{{ not not default }}"} + } + } + }, + }, + { + "name": "shutdown", + "getval": re.compile( + r""" + \s+(?Pshutdown)$""", + re.VERBOSE, + ), + "setval": ("shutdown"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "shutdown": "{{ not not shutdown }}" + } + } + }, + }, + { + "name": "timers.lsa_arrival", + "getval": re.compile( + r""" + \s+timers + \slsa-arrival + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": ("timers lsa-arrival {{ timers.lsa_arrival }}"), + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "lsa_arrival": "{{ lsa_arrival_val }}" + } + } + } + }, + }, + { + "name": "timers.lsa_group_pacing", + "getval": re.compile( + r""" + \s+timers + \slsa-group-pacing + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "timers lsa-group-pacing {{ timers.lsa_group_pacing }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "lsa_group_pacing": "{{ lsa_group_pacing }}" + } + } + } + }, + }, + { + "name": "timers.throttle.lsa", + "getval": re.compile( + r""" + \s+timers\sthrottle\slsa + \s(?P\d+) + \s(?P\d+) + \s(?P\d+) + $""", + re.VERBOSE, + ), + "setval": "timers throttle lsa {{ timers.throttle.lsa.start_interval }}" + " {{ timers.throttle.lsa.hold_interval }}" + " {{ timers.throttle.lsa.max_interval }}", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "timers": { + "throttle": { + "lsa": { + "start_interval": "{{ start }}", + "hold_interval": "{{ hold }}", + "max_interval": "{{ max }}", + } + } + } + } + } + }, + }, + ] + # fmt: on diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/telemetry.py new file mode 100644 index 00000000..371de062 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/telemetry/telemetry.py @@ -0,0 +1,276 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The nxos telemetry utility library +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import re +from copy import deepcopy + + +def get_module_params_subsection(module_params, tms_config, resource_key=None): + """ + Helper method to get a specific module_params subsection + """ + mp = {} + if tms_config == "TMS_GLOBAL": + relevant_keys = [ + "certificate", + "compression", + "source_interface", + "vrf", + ] + for key in relevant_keys: + mp[key] = module_params[key] + + if tms_config == "TMS_DESTGROUP": + mp["destination_groups"] = [] + for destgrp in module_params["destination_groups"]: + if destgrp["id"] == resource_key: + mp["destination_groups"].append(destgrp) + + if tms_config == "TMS_SENSORGROUP": + mp["sensor_groups"] = [] + for sensor in module_params["sensor_groups"]: + if sensor["id"] == resource_key: + mp["sensor_groups"].append(sensor) + + if tms_config == "TMS_SUBSCRIPTION": + mp["subscriptions"] = [] + for sensor in module_params["subscriptions"]: + if sensor["id"] == resource_key: + mp["subscriptions"].append(sensor) + + return mp + + +def valiate_input(playvals, type, module): + """ + Helper method to validate playbook values for destination groups + """ + if type == "destination_groups": + if not playvals.get("id"): + msg = "Invalid playbook value: {0}.".format(playvals) + msg += " Parameter under is required" + module.fail_json(msg=msg) + if playvals.get("destination") and not isinstance( + playvals["destination"], dict + ): + msg = "Invalid playbook value: {0}.".format(playvals) + msg += " Parameter under must be a dict" + module.fail_json(msg=msg) + if not playvals.get("destination") and len(playvals) > 1: + msg = "Invalid playbook value: {0}.".format(playvals) + msg += " Playbook entry contains unrecongnized parameters." + msg += " Make sure keys under are specified as follows:" + msg += " destination: {ip: , port: , protocol: , encoding: }}" + module.fail_json(msg=msg) + + if type == "sensor_groups": + if not playvals.get("id"): + msg = "Invalid playbook value: {0}.".format(playvals) + msg += " Parameter under is required" + module.fail_json(msg=msg) + if playvals.get("path") and "name" not in playvals["path"].keys(): + msg = "Invalid playbook value: {0}.".format(playvals) + msg += ( + " Parameter under requires key" + ) + module.fail_json(msg=msg) + + +def get_instance_data(key, cr_key, cr, existing_key): + """ + Helper method to get instance data used to populate list structure in config + fact dictionary + """ + data = {} + if existing_key is None: + instance = None + else: + instance = cr._ref[cr_key]["existing"][existing_key] + + patterns = { + "destination_groups": r"destination-group (\d+)", + "sensor_groups": r"sensor-group (\d+)", + "subscriptions": r"subscription (\d+)", + } + if key in patterns.keys(): + m = re.search(patterns[key], cr._ref["_resource_key"]) + instance_key = m.group(1) + data = {"id": instance_key, cr_key: instance} + + # Remove None values + data = dict((k, v) for k, v in data.items() if v is not None) + return data + + +def cr_key_lookup(key, mo): + """ + Helper method to get instance key value for Managed Object (mo) + """ + cr_keys = [key] + if key == "destination_groups" and mo == "TMS_DESTGROUP": + cr_keys = ["destination"] + elif key == "sensor_groups" and mo == "TMS_SENSORGROUP": + cr_keys = ["data_source", "path"] + elif key == "subscriptions" and mo == "TMS_SUBSCRIPTION": + cr_keys = ["destination_group", "sensor_group"] + + return cr_keys + + +def normalize_data(cmd_ref): + """ Normalize playbook values and get_exisiting data """ + + playval = cmd_ref._ref.get("destination").get("playval") + existing = cmd_ref._ref.get("destination").get("existing") + + dest_props = ["protocol", "encoding"] + if playval: + for prop in dest_props: + for key in playval.keys(): + playval[key][prop] = playval[key][prop].lower() + if existing: + for key in existing.keys(): + for prop in dest_props: + existing[key][prop] = existing[key][prop].lower() + + +def remove_duplicate_context(cmds): + """ Helper method to remove duplicate telemetry context commands """ + if not cmds: + return cmds + feature_indices = [ + i for i, x in enumerate(cmds) if x == "feature telemetry" + ] + telemetry_indices = [i for i, x in enumerate(cmds) if x == "telemetry"] + if len(feature_indices) == 1 and len(telemetry_indices) == 1: + return cmds + if len(feature_indices) == 1 and not telemetry_indices: + return cmds + if len(telemetry_indices) == 1 and not feature_indices: + return cmds + if feature_indices and feature_indices[-1] > 1: + cmds.pop(feature_indices[-1]) + return remove_duplicate_context(cmds) + if telemetry_indices and telemetry_indices[-1] > 1: + cmds.pop(telemetry_indices[-1]) + return remove_duplicate_context(cmds) + + +def get_setval_path(module_or_path_data): + """ Build setval for path parameter based on playbook inputs + Full Command: + - path {name} depth {depth} query-condition {query_condition} filter-condition {filter_condition} + Required: + - path {name} + Optional: + - depth {depth} + - query-condition {query_condition}, + - filter-condition {filter_condition} + """ + if isinstance(module_or_path_data, dict): + path = module_or_path_data + else: + path = module_or_path_data.params["config"]["sensor_groups"][0].get( + "path" + ) + if path is None: + return path + + setval = "path {name}" + if "depth" in path.keys(): + if path.get("depth") != "None": + setval = setval + " depth {depth}" + if "query_condition" in path.keys(): + if path.get("query_condition") != "None": + setval = setval + " query-condition {query_condition}" + if "filter_condition" in path.keys(): + if path.get("filter_condition") != "None": + setval = setval + " filter-condition {filter_condition}" + + return setval + + +def remove_duplicate_commands(commands_list): + # Remove any duplicate commands. + # pylint: disable=unnecessary-lambda + return sorted(set(commands_list), key=lambda x: commands_list.index(x)) + + +def massage_data(have_or_want): + # Massage non global into a data structure that is indexed by id and + # normalized for destination_groups, sensor_groups and subscriptions. + data = deepcopy(have_or_want) + massaged = {} + massaged["destination_groups"] = {} + massaged["sensor_groups"] = {} + massaged["subscriptions"] = {} + from pprint import pprint + + for subgroup in ["destination_groups", "sensor_groups", "subscriptions"]: + for item in data.get(subgroup, []): + id = str(item.get("id")) + if id not in massaged[subgroup].keys(): + massaged[subgroup][id] = [] + item.pop("id") + if not item: + item = None + else: + if item.get("destination"): + if item.get("destination").get("port"): + item["destination"]["port"] = str( + item["destination"]["port"] + ) + if item.get("destination").get("protocol"): + item["destination"]["protocol"] = item["destination"][ + "protocol" + ].lower() + if item.get("destination").get("encoding"): + item["destination"]["encoding"] = item["destination"][ + "encoding" + ].lower() + if item.get("path"): + for key in [ + "filter_condition", + "query_condition", + "depth", + ]: + if item.get("path").get(key) == "None": + del item["path"][key] + if item.get("path").get("depth") is not None: + item["path"]["depth"] = str(item["path"]["depth"]) + if item.get("destination_group"): + item["destination_group"] = str(item["destination_group"]) + if item.get("sensor_group"): + if item.get("sensor_group").get("id"): + item["sensor_group"]["id"] = str( + item["sensor_group"]["id"] + ) + if item.get("sensor_group").get("sample_interval"): + item["sensor_group"]["sample_interval"] = str( + item["sensor_group"]["sample_interval"] + ) + if item.get("destination_group") and item.get("sensor_group"): + item_copy = deepcopy(item) + del item_copy["sensor_group"] + del item["destination_group"] + massaged[subgroup][id].append(item_copy) + massaged[subgroup][id].append(item) + continue + if item.get("path") and item.get("data_source"): + item_copy = deepcopy(item) + del item_copy["data_source"] + del item["path"] + massaged[subgroup][id].append(item_copy) + massaged[subgroup][id].append(item) + continue + massaged[subgroup][id].append(item) + return massaged diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/utils.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/utils.py new file mode 100644 index 00000000..d2da0aa6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/module_utils/network/nxos/utils/utils.py @@ -0,0 +1,145 @@ +from __future__ import absolute_import, division, print_function + +__metaclass__ = type +import socket + +from ansible.module_utils.six import iteritems + + +def search_obj_in_list(name, lst, identifier): + for o in lst: + if o[identifier] == name: + return o + return None + + +def flatten_dict(x): + result = {} + if not isinstance(x, dict): + return result + + for key, value in iteritems(x): + if isinstance(value, dict): + result.update(flatten_dict(value)) + else: + result[key] = value + + return result + + +def validate_ipv4_addr(address): + address = address.split("/")[0] + try: + socket.inet_aton(address) + except socket.error: + return False + return address.count(".") == 3 + + +def validate_ipv6_addr(address): + address = address.split("/")[0] + try: + socket.inet_pton(socket.AF_INET6, address) + except socket.error: + return False + return True + + +def normalize_interface(name): + """Return the normalized interface name + """ + if not name: + return + + def _get_number(name): + digits = "" + for char in name: + if char.isdigit() or char in "/.": + digits += char + return digits + + if name.lower().startswith("et"): + if_type = "Ethernet" + elif name.lower().startswith("vl"): + if_type = "Vlan" + elif name.lower().startswith("lo"): + if_type = "loopback" + elif name.lower().startswith("po"): + if_type = "port-channel" + elif name.lower().startswith("nv"): + if_type = "nve" + else: + if_type = None + + number_list = name.split(" ") + if len(number_list) == 2: + number = number_list[-1].strip() + else: + number = _get_number(name) + + if if_type: + proper_interface = if_type + number + else: + proper_interface = name + + return proper_interface + + +def get_interface_type(interface): + """Gets the type of interface + """ + if interface.upper().startswith("ET"): + return "ethernet" + elif interface.upper().startswith("VL"): + return "svi" + elif interface.upper().startswith("LO"): + return "loopback" + elif interface.upper().startswith("MG"): + return "management" + elif interface.upper().startswith("MA"): + return "management" + elif interface.upper().startswith("PO"): + return "portchannel" + elif interface.upper().startswith("NV"): + return "nve" + else: + return "unknown" + + +def remove_rsvd_interfaces(interfaces): + """Exclude reserved interfaces from user management + """ + if not interfaces: + return [] + return [ + i for i in interfaces if get_interface_type(i["name"]) != "management" + ] + + +def vlan_range_to_list(vlans): + result = [] + if vlans: + for part in vlans.split(","): + if part == "none": + break + if "-" in part: + a, b = part.split("-") + a, b = int(a), int(b) + result.extend(range(a, b + 1)) + else: + a = int(part) + result.append(a) + return numerical_sort(result) + return result + + +def numerical_sort(string_int_list): + """Sorts list of integers that are digits in numerical order. + """ + + as_int_list = [] + + for vlan in string_int_list: + as_int_list.append(int(vlan)) + as_int_list.sort() + return as_int_list diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server.py new file mode 100644 index 00000000..bfb33fd1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server.py @@ -0,0 +1,364 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_aaa_server +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages AAA server global configuration. +description: +- Manages AAA server global configuration +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- The server_type parameter is always required. +- If encrypt_type is not supplied, the global AAA server key will be stored as encrypted + (type 7). +- Changes to the global AAA server key with encrypt_type=0 are not idempotent. +- state=default will set the supplied parameters to their default values. The parameters + that you want to default must also be set to default. If global_key=default, the + global key will be removed. +options: + server_type: + description: + - The server type is either radius or tacacs. + required: true + choices: + - radius + - tacacs + type: str + global_key: + description: + - Global AAA shared secret or keyword 'default'. + type: str + encrypt_type: + description: + - The state of encryption applied to the entered global key. O clear text, 7 encrypted. + Type-6 encryption is not supported. + choices: + - '0' + - '7' + type: str + deadtime: + description: + - Duration for which a non-reachable AAA server is skipped, in minutes or keyword + 'default. Range is 1-1440. Device default is 0. + type: str + server_timeout: + description: + - Global AAA server timeout period, in seconds or keyword 'default. Range is 1-60. + Device default is 5. + type: str + directed_request: + description: + - Enables direct authentication requests to AAA server or keyword 'default' Device + default is disabled. + choices: + - enabled + - disabled + - default + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - default + type: str +""" + +EXAMPLES = """ +# Radius Server Basic settings +- name: Radius Server Basic settings + cisco.nxos.nxos_aaa_server: + server_type: radius + server_timeout: 9 + deadtime: 20 + directed_request: enabled + +# Tacacs Server Basic settings +- name: Tacacs Server Basic settings + cisco.nxos.nxos_aaa_server: + server_type: tacacs + server_timeout: 8 + deadtime: 19 + directed_request: disabled + +# Setting Global Key +- name: AAA Server Global Key + cisco.nxos.nxos_aaa_server: + server_type: radius + global_key: test_key +""" + +RETURN = """ +commands: + description: command sent to the device + returned: always + type: list + sample: ["radius-server deadtime 22", "radius-server timeout 11", + "radius-server directed-request"] +""" +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +PARAM_TO_DEFAULT_KEYMAP = { + "server_timeout": "5", + "deadtime": "0", + "directed_request": "disabled", +} + + +def execute_show_command(command, module): + command = {"command": command, "output": "text"} + + return run_commands(module, command) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_aaa_server_info(server_type, module): + aaa_server_info = {} + server_command = "show {0}-server".format(server_type) + request_command = "show {0}-server directed-request".format(server_type) + global_key_command = "show run | sec {0}".format(server_type) + aaa_regex = r".*{0}-server\skey\s\d\s+(?P\S+).*".format(server_type) + + server_body = execute_show_command(server_command, module)[0] + + split_server = server_body.splitlines() + + for line in split_server: + if line.startswith("timeout"): + aaa_server_info["server_timeout"] = line.split(":")[1] + + elif line.startswith("deadtime"): + aaa_server_info["deadtime"] = line.split(":")[1] + + request_body = execute_show_command(request_command, module)[0] + + if bool(request_body): + aaa_server_info["directed_request"] = request_body.replace("\n", "") + else: + aaa_server_info["directed_request"] = "disabled" + + key_body = execute_show_command(global_key_command, module)[0] + + try: + match_global_key = re.match(aaa_regex, key_body, re.DOTALL) + group_key = match_global_key.groupdict() + aaa_server_info["global_key"] = group_key["key"].replace('"', "") + except (AttributeError, TypeError): + aaa_server_info["global_key"] = None + + return aaa_server_info + + +def config_aaa_server(params, server_type): + cmds = [] + + deadtime = params.get("deadtime") + server_timeout = params.get("server_timeout") + directed_request = params.get("directed_request") + encrypt_type = params.get("encrypt_type", "7") + global_key = params.get("global_key") + + if deadtime is not None: + cmds.append("{0}-server deadtime {1}".format(server_type, deadtime)) + + if server_timeout is not None: + cmds.append( + "{0}-server timeout {1}".format(server_type, server_timeout) + ) + + if directed_request is not None: + if directed_request == "enabled": + cmds.append("{0}-server directed-request".format(server_type)) + elif directed_request == "disabled": + cmds.append("no {0}-server directed-request".format(server_type)) + + if global_key is not None: + cmds.append( + "{0}-server key {1} {2}".format( + server_type, encrypt_type, global_key + ) + ) + + return cmds + + +def default_aaa_server(existing, params, server_type): + cmds = [] + + deadtime = params.get("deadtime") + server_timeout = params.get("server_timeout") + directed_request = params.get("directed_request") + global_key = params.get("global_key") + existing_key = existing.get("global_key") + + if ( + deadtime is not None + and existing.get("deadtime") != PARAM_TO_DEFAULT_KEYMAP["deadtime"] + ): + cmds.append("no {0}-server deadtime 1".format(server_type)) + + if ( + server_timeout is not None + and existing.get("server_timeout") + != PARAM_TO_DEFAULT_KEYMAP["server_timeout"] + ): + cmds.append("no {0}-server timeout 1".format(server_type)) + + if ( + directed_request is not None + and existing.get("directed_request") + != PARAM_TO_DEFAULT_KEYMAP["directed_request"] + ): + cmds.append("no {0}-server directed-request".format(server_type)) + + if global_key is not None and existing_key is not None: + cmds.append( + "no {0}-server key 7 {1}".format(server_type, existing_key) + ) + + return cmds + + +def main(): + argument_spec = dict( + server_type=dict( + type="str", choices=["radius", "tacacs"], required=True + ), + global_key=dict(type="str", no_log=True), + encrypt_type=dict(type="str", choices=["0", "7"]), + deadtime=dict(type="str"), + server_timeout=dict(type="str"), + directed_request=dict( + type="str", choices=["enabled", "disabled", "default"] + ), + state=dict(choices=["default", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + server_type = module.params["server_type"] + global_key = module.params["global_key"] + encrypt_type = module.params["encrypt_type"] + deadtime = module.params["deadtime"] + server_timeout = module.params["server_timeout"] + directed_request = module.params["directed_request"] + state = module.params["state"] + + if encrypt_type and not global_key: + module.fail_json(msg="encrypt_type must be used with global_key.") + + args = dict( + server_type=server_type, + global_key=global_key, + encrypt_type=encrypt_type, + deadtime=deadtime, + server_timeout=server_timeout, + directed_request=directed_request, + ) + + proposed = dict((k, v) for k, v in args.items() if v is not None) + + existing = get_aaa_server_info(server_type, module) + + commands = [] + if state == "present": + if deadtime: + try: + if int(deadtime) < 0 or int(deadtime) > 1440: + raise ValueError + except ValueError: + module.fail_json( + msg="deadtime must be an integer between 0 and 1440" + ) + + if server_timeout: + try: + if int(server_timeout) < 1 or int(server_timeout) > 60: + raise ValueError + except ValueError: + module.fail_json( + msg="server_timeout must be an integer between 1 and 60" + ) + + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = config_aaa_server(delta, server_type) + if command: + commands.append(command) + + elif state == "default": + for key, value in proposed.items(): + if key != "server_type" and value != "default": + module.fail_json( + msg='Parameters must be set to "default"' + "when state=default" + ) + command = default_aaa_server(existing, proposed, server_type) + if command: + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server_host.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server_host.py new file mode 100644 index 00000000..7949ca28 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_aaa_server_host.py @@ -0,0 +1,383 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_aaa_server_host +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages AAA server host-specific configuration. +description: +- Manages AAA server host-specific configuration. +version_added: 1.0.0 +author: Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Changes to the host key (shared secret) are not idempotent for type 0. +- If C(state=absent) removes the whole host configuration. +options: + server_type: + description: + - The server type is either radius or tacacs. + required: true + choices: + - radius + - tacacs + type: str + address: + description: + - Address or name of the radius or tacacs host. + required: true + type: str + key: + description: + - Shared secret for the specified host or keyword 'default'. + type: str + encrypt_type: + description: + - The state of encryption applied to the entered key. O for clear text, 7 for + encrypted. Type-6 encryption is not supported. + choices: + - '0' + - '7' + type: str + host_timeout: + description: + - Timeout period for specified host, in seconds or keyword 'default. Range is + 1-60. + type: str + auth_port: + description: + - Alternate UDP port for RADIUS authentication or keyword 'default'. + type: str + acct_port: + description: + - Alternate UDP port for RADIUS accounting or keyword 'default'. + type: str + tacacs_port: + description: + - Alternate TCP port TACACS Server or keyword 'default'. + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" +EXAMPLES = """ +# Radius Server Host Basic settings +- name: Radius Server Host Basic settings + cisco.nxos.nxos_aaa_server_host: + state: present + server_type: radius + address: 1.2.3.4 + acct_port: 2084 + host_timeout: 10 + +# Radius Server Host Key Configuration +- name: Radius Server Host Key Configuration + cisco.nxos.nxos_aaa_server_host: + state: present + server_type: radius + address: 1.2.3.4 + key: hello + encrypt_type: 7 + +# TACACS Server Host Configuration +- name: Tacacs Server Host Configuration + cisco.nxos.nxos_aaa_server_host: + state: present + server_type: tacacs + tacacs_port: 89 + host_timeout: 10 + address: 5.6.7.8 + +""" + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"address": "1.2.3.4", "auth_port": "2084", + "host_timeout": "10", "server_type": "radius"} +existing: + description: + - k/v pairs of existing configuration + returned: always + type: dict + sample: {} +end_state: + description: k/v pairs of configuration after module execution + returned: always + type: dict + sample: {"address": "1.2.3.4", "auth_port": "2084", + "host_timeout": "10", "server_type": "radius"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["radius-server host 1.2.3.4 auth-port 2084 timeout 10"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + device_info = get_capabilities(module) + network_api = device_info.get("network_api", "nxapi") + + if network_api == "cliconf": + cmds = [command] + body = run_commands(module, cmds) + elif network_api == "nxapi": + cmds = {"command": command, "output": "text"} + body = run_commands(module, cmds) + + return body + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_aaa_host_info(module, server_type, address): + aaa_host_info = {} + command = "show run | inc {0}-server.host.{1}".format(server_type, address) + + body = execute_show_command(command, module)[0] + if body: + try: + if "radius" in body: + pattern = ( + r"\S+ host \S+(?:\s+key 7\s+(\S+))?(?:\s+auth-port (\d+))?" + r"(?:\s+acct-port (\d+))?(?:\s+authentication)?" + r"(?:\s+accounting)?(?:\s+timeout (\d+))?" + ) + match = re.search(pattern, body) + aaa_host_info["key"] = match.group(1) + if aaa_host_info["key"]: + aaa_host_info["key"] = aaa_host_info["key"].replace( + '"', "" + ) + aaa_host_info["encrypt_type"] = "7" + aaa_host_info["auth_port"] = match.group(2) + aaa_host_info["acct_port"] = match.group(3) + aaa_host_info["host_timeout"] = match.group(4) + elif "tacacs" in body: + pattern = ( + r"\S+ host \S+(?:\s+key 7\s+(\S+))?(?:\s+port (\d+))?" + r"(?:\s+timeout (\d+))?" + ) + match = re.search(pattern, body) + aaa_host_info["key"] = match.group(1) + if aaa_host_info["key"]: + aaa_host_info["key"] = aaa_host_info["key"].replace( + '"', "" + ) + aaa_host_info["encrypt_type"] = "7" + aaa_host_info["tacacs_port"] = match.group(2) + aaa_host_info["host_timeout"] = match.group(3) + + aaa_host_info["server_type"] = server_type + aaa_host_info["address"] = address + except TypeError: + return {} + else: + return {} + + return aaa_host_info + + +def config_aaa_host(server_type, address, params, existing): + cmds = [] + cmd_str = "{0}-server host {1}".format(server_type, address) + cmd_no_str = "no " + cmd_str + + key = params.get("key") + enc_type = params.get("encrypt_type", "") + + defval = False + nondef = False + + if key: + if key != "default": + cmds.append(cmd_str + " key {0} {1}".format(enc_type, key)) + else: + cmds.append(cmd_no_str + " key 7 {0}".format(existing.get("key"))) + + locdict = { + "auth_port": "auth-port", + "acct_port": "acct-port", + "tacacs_port": "port", + "host_timeout": "timeout", + } + + # platform CLI needs the keywords in the following order + for key in ["auth_port", "acct_port", "tacacs_port", "host_timeout"]: + item = params.get(key) + if item: + if item != "default": + cmd_str += " {0} {1}".format(locdict.get(key), item) + nondef = True + else: + cmd_no_str += " {0} 1".format(locdict.get(key)) + defval = True + if defval: + cmds.append(cmd_no_str) + if nondef or not existing: + cmds.append(cmd_str) + + return cmds + + +def main(): + argument_spec = dict( + server_type=dict(choices=["radius", "tacacs"], required=True), + address=dict(type="str", required=True), + key=dict(type="str"), + encrypt_type=dict(type="str", choices=["0", "7"]), + host_timeout=dict(type="str"), + auth_port=dict(type="str"), + acct_port=dict(type="str"), + tacacs_port=dict(type="str"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + server_type = module.params["server_type"] + address = module.params["address"] + key = module.params["key"] + encrypt_type = module.params["encrypt_type"] + host_timeout = module.params["host_timeout"] + auth_port = module.params["auth_port"] + acct_port = module.params["acct_port"] + tacacs_port = module.params["tacacs_port"] + state = module.params["state"] + + args = dict( + server_type=server_type, + address=address, + key=key, + encrypt_type=encrypt_type, + host_timeout=host_timeout, + auth_port=auth_port, + acct_port=acct_port, + tacacs_port=tacacs_port, + ) + + proposed = dict((k, v) for k, v in args.items() if v is not None) + changed = False + + if encrypt_type and not key: + module.fail_json(msg="encrypt_type must be used with key") + + if tacacs_port and server_type != "tacacs": + module.fail_json( + msg="tacacs_port can only be used with server_type=tacacs" + ) + + if (auth_port or acct_port) and server_type != "radius": + module.fail_json( + msg="auth_port and acct_port can only be used" + "when server_type=radius" + ) + + existing = get_aaa_host_info(module, server_type, address) + end_state = existing + + commands = [] + delta = {} + if state == "present": + if not existing: + delta = proposed + else: + for key, value in proposed.items(): + if key == "encrypt_type": + delta[key] = value + if value != existing.get(key): + if value != "default" or existing.get(key): + delta[key] = value + + command = config_aaa_host(server_type, address, delta, existing) + if command: + commands.append(command) + + elif state == "absent": + intersect = dict(set(proposed.items()).intersection(existing.items())) + if intersect.get("address") and intersect.get("server_type"): + command = "no {0}-server host {1}".format( + intersect.get("server_type"), intersect.get("address") + ) + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + end_state = get_aaa_host_info(module, server_type, address) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + results["end_state"] = end_state + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl.py new file mode 100644 index 00000000..84b5acbc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl.py @@ -0,0 +1,698 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_acl +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manages access + list entries for ACLs. +description: +- Manages access list entries for ACLs. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +deprecated: + alternative: nxos_acls + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the ACE if it exists. +- C(state=delete_acl) deletes the ACL if it exists. +- For idempotency, use port numbers for the src/dest port params like I(src_port1) + and names for the well defined protocols for the I(proto) param. +- Although this module is idempotent in that if the ace as presented in the task is + identical to the one on the switch, no changes will be made. If there is any difference, + what is in Ansible will be pushed (configured options will be overridden). This + is to improve security, but at the same time remember an ACE is removed, then re-added, + so if there is a change, the new ACE will be exactly what parameters you are sending + to the module. +options: + seq: + description: + - Sequence number of the entry (ACE). + type: str + name: + description: + - Case sensitive name of the access list (ACL). + required: true + type: str + action: + description: + - Action of the ACE. + choices: + - permit + - deny + - remark + type: str + remark: + description: + - If action is set to remark, this is the description. + type: str + proto: + description: + - Port number or protocol (as supported by the switch). + type: str + src: + description: + - Source ip and mask using IP/MASK notation and supports keyword 'any'. + type: str + src_port_op: + description: + - Source port operands such as eq, neq, gt, lt, range. + choices: + - any + - eq + - gt + - lt + - neq + - range + type: str + src_port1: + description: + - Port/protocol and also first (lower) port when using range operand. + type: str + src_port2: + description: + - Second (end) port when using range operand. + type: str + dest: + description: + - Destination ip and mask using IP/MASK notation and supports the keyword 'any'. + type: str + dest_port_op: + description: + - Destination port operands such as eq, neq, gt, lt, range. + choices: + - any + - eq + - gt + - lt + - neq + - range + type: str + dest_port1: + description: + - Port/protocol and also first (lower) port when using range operand. + type: str + dest_port2: + description: + - Second (end) port when using range operand. + type: str + log: + description: + - Log matches against this entry. + choices: + - enable + type: str + urg: + description: + - Match on the URG bit. + choices: + - enable + type: str + ack: + description: + - Match on the ACK bit. + choices: + - enable + type: str + psh: + description: + - Match on the PSH bit. + choices: + - enable + type: str + rst: + description: + - Match on the RST bit. + choices: + - enable + type: str + syn: + description: + - Match on the SYN bit. + choices: + - enable + type: str + fin: + description: + - Match on the FIN bit. + choices: + - enable + type: str + established: + description: + - Match established connections. + choices: + - enable + type: str + fragments: + description: + - Check non-initial fragments. + choices: + - enable + type: str + time_range: + description: + - Name of time-range to apply. + type: str + precedence: + description: + - Match packets with given precedence. + choices: + - critical + - flash + - flash-override + - immediate + - internet + - network + - priority + - routine + type: str + dscp: + description: + - Match packets with given dscp value. + choices: + - af11 + - af12 + - af13 + - af21 + - af22 + - af23 + - af31 + - af32 + - af33 + - af41 + - af42 + - af43 + - cs1 + - cs2 + - cs3 + - cs4 + - cs5 + - cs6 + - cs7 + - default + - ef + type: str + state: + description: + - Specify desired state of the resource. + default: present + choices: + - present + - absent + - delete_acl + type: str + + +""" + +EXAMPLES = """ +# configure ACL ANSIBLE +- cisco.nxos.nxos_acl: + name: ANSIBLE + seq: 10 + action: permit + proto: tcp + src: 192.0.2.1/24 + dest: any + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["ip access-list ANSIBLE", "10 permit tcp 192.0.2.1/24 any"] +""" +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module, check_rc=True): + command += " | json" + cmds = [command] + body = run_commands(module, cmds, check_rc=check_rc) + return body + + +def get_acl(module, acl_name, seq_number): + command = "show ip access-list" + new_acl = [] + saveme = {} + acl_body = {} + + body = execute_show_command(command, module, check_rc=False) + if "Structured output unsupported" in repr(body): + # Some older versions raise 501 and return a string when no ACLs exist + return {}, [] + + if body and body[0]: + all_acl_body = body[0]["TABLE_ip_ipv6_mac"]["ROW_ip_ipv6_mac"] + else: + # no access-lists configured on the device + return {}, [] + + if isinstance(all_acl_body, dict): + # Only 1 ACL configured. + if all_acl_body.get("acl_name") == acl_name: + acl_body = all_acl_body + else: + for acl in all_acl_body: + if acl.get("acl_name") == acl_name: + acl_body = acl + break + + try: + acl_entries = acl_body["TABLE_seqno"]["ROW_seqno"] + acl_name = acl_body.get("acl_name") + except KeyError: # could be raised if no ACEs are configured for an ACL + return {}, [{"acl": "no_entries"}] + + if isinstance(acl_entries, dict): + acl_entries = [acl_entries] + + for each in acl_entries: + temp = {} + options = {} + remark = each.get("remark") + + temp["name"] = acl_name + temp["seq"] = str(each.get("seqno")) + + if remark: + temp["remark"] = remark + temp["action"] = "remark" + else: + temp["action"] = each.get("permitdeny") + temp["proto"] = str( + each.get("proto", each.get("proto_str", each.get("ip"))) + ) + temp["src"] = each.get("src_any", each.get("src_ip_prefix")) + temp["src_port_op"] = each.get("src_port_op") + temp["src_port1"] = each.get("src_port1_num") + temp["src_port2"] = each.get("src_port2_num") + temp["dest"] = each.get("dest_any", each.get("dest_ip_prefix")) + temp["dest_port_op"] = each.get("dest_port_op") + temp["dest_port1"] = each.get("dest_port1_num") + temp["dest_port2"] = each.get("dest_port2_num") + + options["log"] = each.get("log") + options["urg"] = each.get("urg") + options["ack"] = each.get("ack") + options["psh"] = each.get("psh") + options["rst"] = each.get("rst") + options["syn"] = each.get("syn") + options["fin"] = each.get("fin") + options["established"] = each.get("established") + options["dscp"] = each.get("dscp_str") + options["precedence"] = each.get("precedence_str") + options["fragments"] = each.get("fragments") + options["time_range"] = each.get("timerange") + + keep = {} + for key, value in temp.items(): + if value: + keep[key] = value + + options_no_null = {} + for key, value in options.items(): + if value is not None: + options_no_null[key] = value + keep["options"] = options_no_null + + if keep.get("seq") == seq_number: + saveme = dict(keep) + + new_acl.append(keep) + + return saveme, new_acl + + +def _acl_operand(operand, srcp1, sprcp2): + sub_entry = " " + operand + + if operand == "range": + sub_entry += " " + srcp1 + " " + sprcp2 + else: + sub_entry += " " + srcp1 + + return sub_entry + + +def config_core_acl(proposed): + seq = proposed.get("seq") + action = proposed.get("action") + remark = proposed.get("remark") + proto = proposed.get("proto") + src = proposed.get("src") + src_port_op = proposed.get("src_port_op") + src_port1 = proposed.get("src_port1") + src_port2 = proposed.get("src_port2") + + dest = proposed.get("dest") + dest_port_op = proposed.get("dest_port_op") + dest_port1 = proposed.get("dest_port1") + dest_port2 = proposed.get("dest_port2") + + ace_start_entries = [action, proto, src] + if not remark: + ace = seq + " " + " ".join(ace_start_entries) + if src_port_op: + ace += _acl_operand(src_port_op, src_port1, src_port2) + ace += " " + dest + if dest_port_op: + ace += _acl_operand(dest_port_op, dest_port1, dest_port2) + else: + ace = seq + " remark " + remark + + return ace + + +def config_acl_options(options): + ENABLE_ONLY = [ + "psh", + "urg", + "log", + "ack", + "syn", + "established", + "rst", + "fin", + "fragments", + "log", + ] + + OTHER = ["dscp", "precedence", "time-range"] + # packet-length is the only option not currently supported + + if options.get("time_range"): + options["time-range"] = options.get("time_range") + options.pop("time_range") + + command = "" + for option, value in options.items(): + if option in ENABLE_ONLY: + if value == "enable": + command += " " + option + elif option in OTHER: + command += " " + option + " " + value + if command: + command = command.strip() + return command + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def main(): + argument_spec = dict( + seq=dict(required=False, type="str"), + name=dict(required=True, type="str"), + action=dict(required=False, choices=["remark", "permit", "deny"]), + remark=dict(required=False, type="str"), + proto=dict(required=False, type="str"), + src=dict(required=False, type="str"), + src_port_op=dict( + required=False, choices=["any", "eq", "gt", "lt", "neq", "range"] + ), + src_port1=dict(required=False, type="str"), + src_port2=dict(required=False, type="str"), + dest=dict(required=False, type="str"), + dest_port_op=dict( + required=False, choices=["any", "eq", "gt", "lt", "neq", "range"] + ), + dest_port1=dict(required=False, type="str"), + dest_port2=dict(required=False, type="str"), + log=dict(required=False, choices=["enable"]), + urg=dict(required=False, choices=["enable"]), + ack=dict(required=False, choices=["enable"]), + psh=dict(required=False, choices=["enable"]), + rst=dict(required=False, choices=["enable"]), + syn=dict(required=False, choices=["enable"]), + fragments=dict(required=False, choices=["enable"]), + fin=dict(required=False, choices=["enable"]), + established=dict(required=False, choices=["enable"]), + time_range=dict(required=False), + precedence=dict( + required=False, + choices=[ + "critical", + "flash", + "flash-override", + "immediate", + "internet", + "network", + "priority", + "routine", + ], + ), + dscp=dict( + required=False, + choices=[ + "af11", + "af12", + "af13", + "af21", + "af22", + "af23", + "af31", + "af32", + "af33", + "af41", + "af42", + "af43", + "cs1", + "cs2", + "cs3", + "cs4", + "cs5", + "cs6", + "cs7", + "default", + "ef", + ], + ), + state=dict( + choices=["absent", "present", "delete_acl"], default="present" + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + results = dict(changed=False, warnings=warnings) + + state = module.params["state"] + action = module.params["action"] + remark = module.params["remark"] + dscp = module.params["dscp"] + precedence = module.params["precedence"] + seq = module.params["seq"] + name = module.params["name"] + seq = module.params["seq"] + + if action == "remark" and not remark: + module.fail_json( + msg="when state is action, remark param is also required" + ) + + REQUIRED = ["seq", "name", "action", "proto", "src", "dest"] + ABSENT = ["name", "seq"] + if state == "present": + if action and remark and seq: + pass + else: + for each in REQUIRED: + if module.params[each] is None: + module.fail_json( + msg="req'd params when state is present:", + params=REQUIRED, + ) + elif state == "absent": + for each in ABSENT: + if module.params[each] is None: + module.fail_json( + msg="require params when state is absent", params=ABSENT + ) + elif state == "delete_acl": + if module.params["name"] is None: + module.fail_json(msg="param name req'd when state is delete_acl") + + if dscp and precedence: + module.fail_json( + msg="only one of the params dscp/precedence " "are allowed" + ) + + OPTIONS_NAMES = [ + "log", + "urg", + "ack", + "psh", + "rst", + "syn", + "fin", + "established", + "dscp", + "precedence", + "fragments", + "time_range", + ] + + CORE = [ + "seq", + "name", + "action", + "proto", + "src", + "src_port_op", + "src_port1", + "src_port2", + "dest", + "dest_port_op", + "dest_port1", + "dest_port2", + "remark", + ] + + proposed_core = dict( + (param, value) + for (param, value) in module.params.items() + if param in CORE and value is not None + ) + + proposed_options = dict( + (param, value) + for (param, value) in module.params.items() + if param in OPTIONS_NAMES and value is not None + ) + proposed = {} + proposed.update(proposed_core) + proposed.update(proposed_options) + + existing_options = {} + + # getting existing existing_core=dict, acl=list, seq=list + existing_core, acl = get_acl(module, name, seq) + if existing_core: + existing_options = existing_core.get("options") + existing_core.pop("options") + + commands = [] + delta_core = {} + delta_options = {} + + if not existing_core.get("remark"): + dcore = dict( + set(proposed_core.items()).difference(existing_core.items()) + ) + if not dcore: + # check the diff in the other way just in case + dcore = dict( + set(existing_core.items()).difference(proposed_core.items()) + ) + delta_core = dcore + if delta_core: + delta_options = proposed_options + else: + doptions = dict( + set(proposed_options.items()).difference( + existing_options.items() + ) + ) + # check the diff in the other way just in case + if not doptions: + doptions = dict( + set(existing_options.items()).difference( + proposed_options.items() + ) + ) + delta_options = doptions + else: + delta_core = dict( + set(proposed_core.items()).difference(existing_core.items()) + ) + + if state == "present": + if delta_core or delta_options: + if existing_core: # if the ace exists already + commands.append(["no {0}".format(seq)]) + if delta_options: + myacl_str = config_core_acl(proposed_core) + myacl_str += " " + config_acl_options(proposed_options) + else: + myacl_str = config_core_acl(proposed_core) + command = [myacl_str] + commands.append(command) + elif state == "absent": + if existing_core: + commands.append(["no {0}".format(seq)]) + elif state == "delete_acl": + if acl and acl[0].get("acl") != "no_entries": + commands.append(["no ip access-list {0}".format(name)]) + + cmds = [] + if commands: + preface = [] + if state in ["present", "absent"]: + preface = ["ip access-list {0}".format(name)] + commands.insert(0, preface) + + cmds = flatten_list(commands) + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + load_config(module, cmds) + results["changed"] = True + if "configure" in cmds: + cmds.pop(0) + + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interface.py new file mode 100644 index 00000000..2a65fa32 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interface.py @@ -0,0 +1,227 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_acl_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manages applying + ACLs to interfaces. +description: +- Manages applying ACLs to interfaces. +version_added: 1.0.0 +deprecated: + alternative: nxos_acl_interfaces + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +options: + name: + description: + - Case sensitive name of the access list (ACL). + required: true + type: str + interface: + description: + - Full name of interface, e.g. I(Ethernet1/1). + required: true + type: str + direction: + description: + - Direction ACL to be applied in on the interface. + required: true + choices: + - ingress + - egress + type: str + state: + description: + - Specify desired state of the resource. + required: false + default: present + choices: + - present + - absent + type: str + + +""" + +EXAMPLES = """ +- name: apply egress acl to ethernet1/41 + cisco.nxos.nxos_acl_interface: + name: ANSIBLE + interface: ethernet1/41 + direction: egress + state: present +""" + +RETURN = """ +acl_applied_to: + description: list of interfaces the ACL is applied to + returned: always + type: list + sample: [{"acl_type": "Router ACL", "direction": "egress", + "interface": "Ethernet1/41", "name": "ANSIBLE"}] +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface ethernet1/41", "ip access-group ANSIBLE out"] +""" +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def check_for_acl_int_present(module, name, intf, direction): + # Need to Capitalize the interface name as the nxos + # output has capitalization + command = [ + { + "command": "show running-config aclmgr | section {0}".format( + intf.title() + ), + "output": "text", + } + ] + body = run_commands(module, command) + + if direction == "ingress": + mdir = "in" + elif direction == "egress": + mdir = "out" + + match = re.search( + "ip access-group {0} {1}".format(name, mdir), str(body[0]) + ) + return bool(match) + + +def apply_acl(proposed): + commands = [] + + commands.append("interface " + proposed.get("interface")) + direction = proposed.get("direction") + if direction == "egress": + cmd = "ip access-group {0} {1}".format(proposed.get("name"), "out") + elif direction == "ingress": + cmd = "ip access-group {0} {1}".format(proposed.get("name"), "in") + commands.append(cmd) + + return commands + + +def remove_acl(proposed): + commands = [] + + commands.append("interface " + proposed.get("interface")) + direction = proposed.get("direction") + if direction == "egress": + cmd = "no ip access-group {0} {1}".format(proposed.get("name"), "out") + elif direction == "ingress": + cmd = "no ip access-group {0} {1}".format(proposed.get("name"), "in") + commands.append(cmd) + + return commands + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def main(): + argument_spec = dict( + name=dict(required=True, type="str"), + interface=dict(required=True), + direction=dict(required=True, choices=["egress", "ingress"]), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + results = dict(changed=False, warnings=warnings) + + state = module.params["state"] + name = module.params["name"] + interface = module.params["interface"].lower() + direction = module.params["direction"].lower() + + proposed = dict(name=name, interface=interface, direction=direction) + + existing = check_for_acl_int_present(module, name, interface, direction) + + cmds = [] + commands = [] + if state == "present": + if not existing: + command = apply_acl(proposed) + if command: + commands.append(command) + + elif state == "absent": + if existing: + command = remove_acl(proposed) + if command: + commands.append(command) + + if commands: + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + load_config(module, cmds) + results["changed"] = True + if "configure" in cmds: + cmds.pop(0) + else: + cmds = [] + + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interfaces.py new file mode 100644 index 00000000..74728194 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acl_interfaces.py @@ -0,0 +1,437 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_acl_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_acl_interfaces +short_description: ACL interfaces resource module +description: Add and remove Access Control Lists on interfaces in NX-OS platform +version_added: 1.0.0 +author: Adharsh Srivats Rangarajan (@adharshsrivatsr) +notes: +- Tested against NX-OS 7.3.(0)D1(1) on VIRL +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section '^interface'). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A list of interfaces to be configured with ACLs + type: list + elements: dict + suboptions: + name: + description: Name of the interface + type: str + required: true + access_groups: + description: List of address family indicators with ACLs to be configured + on the interface + type: list + elements: dict + suboptions: + afi: + description: Address Family Indicator of the ACLs to be configured + type: str + required: true + choices: + - ipv4 + - ipv6 + acls: + description: List of Access Control Lists for the interface + type: list + elements: dict + suboptions: + name: + description: Name of the ACL to be added/removed + type: str + required: true + direction: + description: Direction to be applied for the ACL + type: str + required: true + choices: + - in + - out + port: + description: Use ACL as port policy. + type: bool + state: + description: The state the configuration should be left in + type: str + choices: + - deleted + - gathered + - merged + - overridden + - rendered + - replaced + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------ +# + +- name: Merge ACL interfaces configuration + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/2 + access_groups: + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + + - name: Eth1/5 + access_groups: + - afi: ipv4 + acls: + - name: PortACL + direction: in + port: true + + - name: ACL1v4 + direction: out + + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + state: merged + +# After state: +# ------------ +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ip port access-group PortACL in +# ip access-group ACL1v4 out +# ipv6 traffic-filter ACL1v6 in + +# Using replaced + +# Before state: +# ------------ +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ip port access-group PortACL in +# ip access-group ACL1v4 out +# ipv6 traffic-filter ACL1v6 in + +- name: Replace interface configuration with given configuration + cisco.nxos.nxos_acl_interfaces: + config: + - name: Eth1/5 + access_groups: + - afi: ipv4 + acls: + - name: NewACLv4 + direction: out + + - name: Ethernet1/3 + access_groups: + - afi: ipv6 + acls: + - name: NewACLv6 + direction: in + port: true + state: replaced + +# After state: +# ------------ +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/3 +# ipv6 port traffic-filter NewACLv6 in +# interface Ethernet1/5 +# ip access-group NewACLv4 out + +# Using overridden + +# Before state: +# ------------ +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ip port access-group PortACL in +# ip access-group ACL1v4 out +# ipv6 traffic-filter ACL1v6 in + +- name: Override interface configuration with given configuration + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/3 + access_groups: + - afi: ipv4 + acls: + - name: ACL1v4 + direction: out + + - name: PortACL + port: true + direction: in + - afi: ipv6 + acls: + - name: NewACLv6 + direction: in + port: true + state: overridden + +# After state: +# ------------ +# interface Ethernet1/3 +# ip access-group ACL1v4 out +# ip port access-group PortACL in +# ipv6 port traffic-filter NewACLv6 in + +# Using deleted to remove ACL config from specified interfaces + +# Before state: +# ------------- +# interface Ethernet1/1 +# ip access-group ACL2v4 in +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ip port access-group PortACL in +# ip access-group ACL1v4 out +# ipv6 traffic-filter ACL1v6 in + +- name: Delete ACL configuration on interfaces + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/5 + - name: Ethernet1/2 + state: deleted + +# After state: +# ------------- +# interface Ethernet1/1 +# ip access-group ACL2v4 in +# interface Ethernet1/2 +# interface Ethernet1/5 + +# Using deleted to remove ACL config from all interfaces + +# Before state: +# ------------- +# interface Ethernet1/1 +# ip access-group ACL2v4 in +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ip port access-group PortACL in +# ip access-group ACL1v4 out +# ipv6 traffic-filter ACL1v6 in + +- name: Delete ACL configuration from all interfaces + cisco.nxos.nxos_acl_interfaces: + state: deleted + +# After state: +# ------------- +# interface Ethernet1/1 +# interface Ethernet1/2 +# interface Ethernet1/5 + +# Using parsed + +- name: Parse given configuration into structured format + cisco.nxos.nxos_acl_interfaces: + running_config: | + interface Ethernet1/2 + ipv6 traffic-filter ACL1v6 in + interface Ethernet1/5 + ipv6 traffic-filter ACL1v6 in + ip access-group ACL1v4 out + ip port access-group PortACL in + state: parsed + +# returns +# parsed: +# - name: Ethernet1/2 +# access_groups: +# - afi: ipv6 +# acls: +# - name: ACL1v6 +# direction: in +# - name: Ethernet1/5 +# access_groups: +# - afi: ipv4 +# acls: +# - name: PortACL +# direction: in +# port: True +# - name: ACL1v4 +# direction: out +# - afi: ipv6 +# acls: +# - name: ACL1v6 +# direction: in + + +# Using gathered: + +# Before state: +# ------------ +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ipv6 traffic-filter ACL1v6 in +# ip access-group ACL1v4 out +# ip port access-group PortACL in + +- name: Gather existing configuration from device + cisco.nxos.nxos_acl_interfaces: + config: + state: gathered + +# returns +# gathered: +# - name: Ethernet1/2 +# access_groups: +# - afi: ipv6 +# acls: +# - name: ACL1v6 +# direction: in +# - name: Ethernet1/5 +# access_groups: +# - afi: ipv4 +# acls: +# - name: PortACL +# direction: in +# port: True +# - name: ACL1v4 +# direction: out +# - afi: ipv6 +# acls: +# - name: ACL1v6 +# direction: in + + +# Using rendered + +- name: Render required configuration to be pushed to the device + cisco.nxos.nxos_acl_interfaces: + config: + - name: Ethernet1/2 + access_groups: + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + + - name: Ethernet1/5 + access_groups: + - afi: ipv4 + acls: + - name: PortACL + direction: in + port: true + - name: ACL1v4 + direction: out + - afi: ipv6 + acls: + - name: ACL1v6 + direction: in + state: rendered + +# returns +# rendered: +# interface Ethernet1/2 +# ipv6 traffic-filter ACL1v6 in +# interface Ethernet1/5 +# ipv6 traffic-filter ACL1v6 in +# ip access-group ACL1v4 out +# ip port access-group PortACL in + +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface Ethernet1/2', 'ipv6 traffic-filter ACL1v6 out', 'ip port access-group PortACL in'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.acl_interfaces.acl_interfaces import ( + Acl_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.acl_interfaces.acl_interfaces import ( + Acl_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=Acl_interfacesArgs.argument_spec, + supports_check_mode=True, + ) + + result = Acl_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acls.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acls.py new file mode 100644 index 00000000..5414dfdd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_acls.py @@ -0,0 +1,819 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_acls +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_acls +short_description: ACLs resource module +description: Manage named IP ACLs on the Cisco NX-OS platform +version_added: 1.0.0 +author: Adharsh Srivats Rangarajan (@adharshsrivatsr) +notes: +- Tested against NX-OS 7.3.(0)D1(1) on VIRL +- As NX-OS allows configuring a rule again with different sequence numbers, the user + is expected to provide sequence numbers for the access control entries to preserve + idempotency. If no sequence number is given, the rule will be added as a new rule + by the device. +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section 'ip(v6)* access-list). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A dictionary of ACL options. + type: list + elements: dict + suboptions: + afi: + description: The Address Family Indicator (AFI) for the ACL. + type: str + required: true + choices: + - ipv4 + - ipv6 + acls: + description: A list of the ACLs. + type: list + elements: dict + suboptions: + name: + description: Name of the ACL. + type: str + required: true + aces: + description: The entries within the ACL. + type: list + elements: dict + suboptions: + grant: + description: Action to be applied on the rule. + type: str + choices: + - permit + - deny + destination: + description: Specify the packet destination. + type: dict + suboptions: + address: + description: Destination network address. + type: str + any: + description: Any destination address. + type: bool + host: + description: Host IP address. + type: str + port_protocol: + description: Specify the destination port or protocol (only for + TCP and UDP). + type: dict + suboptions: + eq: + description: Match only packets on a given port number. + type: str + gt: + description: Match only packets with a greater port number. + type: str + lt: + description: Match only packets with a lower port number. + type: str + neq: + description: Match only packets not on a given port number. + type: str + range: + description: Match only packets in the range of port numbers. + type: dict + suboptions: + start: + description: Specify the start of the port range. + type: str + end: + description: Specify the end of the port range. + type: str + prefix: + description: Destination network prefix. Only for prefixes of + value less than 31 for ipv4 and 127 for ipv6. Prefixes of 32 + (ipv4) and 128 (ipv6) should be given in the 'host' key. + type: str + wildcard_bits: + description: Destination wildcard bits. + type: str + dscp: + description: Match packets with given DSCP value. + type: str + fragments: + description: Check non-initial fragments. + type: bool + remark: + description: Access list entry comment. + type: str + sequence: + description: Sequence number. + type: int + source: + description: Specify the packet source. + type: dict + suboptions: + address: + description: Source network address. + type: str + any: + description: Any source address. + type: bool + host: + description: Host IP address. + type: str + port_protocol: + description: Specify the destination port or protocol (only for + TCP and UDP). + type: dict + suboptions: + eq: + description: Match only packets on a given port number. + type: str + gt: + description: Match only packets with a greater port number. + type: str + lt: + description: Match only packets with a lower port number. + type: str + neq: + description: Match only packets not on a given port number. + type: str + range: + description: Match only packets in the range of port numbers. + type: dict + suboptions: + start: + description: Specify the start of the port range. + type: str + end: + description: Specify the end of the port range. + type: str + prefix: + description: Source network prefix. Only for prefixes of mask + value less than 31 for ipv4 and 127 for ipv6. Prefixes of mask + 32 (ipv4) and 128 (ipv6) should be given in the 'host' key. + type: str + wildcard_bits: + description: Source wildcard bits. + type: str + log: + description: Log matches against this entry. + type: bool + precedence: + description: Match packets with given precedence value. + type: str + protocol: + description: Specify the protocol. + type: str + protocol_options: + description: All possible suboptions for the protocol chosen. + type: dict + suboptions: + icmp: + description: ICMP protocol options. + type: dict + suboptions: + administratively_prohibited: + description: Administratively prohibited + type: bool + alternate_address: + description: Alternate address + type: bool + conversion_error: + description: Datagram conversion + type: bool + dod_host_prohibited: + description: Host prohibited + type: bool + dod_net_prohibited: + description: Net prohibited + type: bool + echo: + description: Echo (ping) + type: bool + echo_reply: + description: Echo reply + type: bool + echo_request: + description: Echo request (ping) + type: bool + general_parameter_problem: + description: Parameter problem + type: bool + host_isolated: + description: Host isolated + type: bool + host_precedence_unreachable: + description: Host unreachable for precedence + type: bool + host_redirect: + description: Host redirect + type: bool + host_tos_redirect: + description: Host redirect for TOS + type: bool + host_tos_unreachable: + description: Host unreachable for TOS + type: bool + host_unknown: + description: Host unknown + type: bool + host_unreachable: + description: Host unreachable + type: bool + information_reply: + description: Information replies + type: bool + information_request: + description: Information requests + type: bool + mask_reply: + description: Mask replies + type: bool + mask_request: + description: Mask requests + type: bool + message_code: + description: ICMP message code + type: int + message_type: + description: ICMP message type + type: int + mobile_redirect: + description: Mobile host redirect + type: bool + net_redirect: + description: Network redirect + type: bool + net_tos_redirect: + description: Net redirect for TOS + type: bool + net_tos_unreachable: + description: Network unreachable for TOS + type: bool + net_unreachable: + description: Net unreachable + type: bool + network_unknown: + description: Network unknown + type: bool + no_room_for_option: + description: Parameter required but no room + type: bool + option_missing: + description: Parameter required but not present + type: bool + packet_too_big: + description: Fragmentation needed and DF set + type: bool + parameter_problem: + description: All parameter problems + type: bool + port_unreachable: + description: Port unreachable + type: bool + precedence_unreachable: + description: Precedence cutoff + type: bool + protocol_unreachable: + description: Protocol unreachable + type: bool + reassembly_timeout: + description: Reassembly timeout + type: bool + redirect: + description: All redirects + type: bool + router_advertisement: + description: Router discovery advertisements + type: bool + router_solicitation: + description: Router discovery solicitations + type: bool + source_quench: + description: Source quenches + type: bool + source_route_failed: + description: Source route failed + type: bool + time_exceeded: + description: All time exceeded. + type: bool + timestamp_reply: + description: Timestamp replies + type: bool + timestamp_request: + description: Timestamp requests + type: bool + traceroute: + description: Traceroute + type: bool + ttl_exceeded: + description: TTL exceeded + type: bool + unreachable: + description: All unreachables + type: bool + tcp: + description: TCP flags. + type: dict + suboptions: + ack: + description: Match on the ACK bit + type: bool + established: + description: Match established connections + type: bool + fin: + description: Match on the FIN bit + type: bool + psh: + description: Match on the PSH bit + type: bool + rst: + description: Match on the RST bit + type: bool + syn: + description: Match on the SYN bit + type: bool + urg: + description: Match on the URG bit + type: bool + igmp: + description: IGMP protocol options. + type: dict + suboptions: + dvmrp: + description: Distance Vector Multicast Routing Protocol + type: bool + host_query: + description: Host Query + type: bool + host_report: + description: Host Report + type: bool + state: + description: + - The state the configuration should be left in + type: str + choices: + - deleted + - gathered + - merged + - overridden + - rendered + - replaced + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# + +- name: Merge new ACLs configuration + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: ACL1v4 + aces: + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + lt: 55 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - afi: ipv6 + acls: + - name: ACL1v6 + aces: + - grant: permit + sequence: 10 + source: + any: true + destination: + prefix: 2001:db8:12::/32 + protocol: sctp + state: merged + +# After state: +# ------------ +# +# ip access-list ACL1v4 +# 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin +# ipv6 access-list ACL1v6 +# 10 permit sctp any any + +# Using replaced + +# Before state: +# ---------------- +# +# ip access-list ACL1v4 +# 10 permit ip any any +# 20 deny udp any any +# ip access-list ACL2v4 +# 10 permit ahp 192.0.2.0 0.0.0.255 any +# ip access-list ACL1v6 +# 10 permit sctp any any +# 20 remark IPv6 ACL +# ip access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + +- name: Replace existing ACL configuration with provided configuration + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + - afi: ipv6 + acls: + - name: ACL1v6 + aces: + - sequence: 20 + grant: permit + source: + any: true + destination: + any: true + protocol: pip + + - remark: Replaced ACE + + - name: ACL2v6 + state: replaced + +# After state: +# --------------- +# +# ipv6 access-list ACL1v6 +# 20 permit pip any any +# 30 remark Replaced ACE +# ipv6 access-list ACL2v6 + +# Using overridden + +# Before state: +# ---------------- +# +# ip access-list ACL1v4 +# 10 permit ip any any +# 20 deny udp any any +# ip access-list ACL2v4 +# 10 permit ahp 192.0.2.0 0.0.0.255 any +# ip access-list ACL1v6 +# 10 permit sctp any any +# 20 remark IPv6 ACL +# ip access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + +- name: Override existing configuration with provided configuration + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: NewACL + aces: + - grant: deny + source: + address: 192.0.2.0 + wildcard_bits: 0.0.255.255 + destination: + any: true + protocol: eigrp + - remark: Example for overridden state + state: overridden + +# After state: +# ------------ +# +# ip access-list NewACL +# 10 deny eigrp 192.0.2.0 0.0.255.255 any +# 20 remark Example for overridden state + +# Using deleted: +# +# Before state: +# ------------- +# +# ip access-list ACL1v4 +# 10 permit ip any any +# 20 deny udp any any +# ip access-list ACL2v4 +# 10 permit ahp 192.0.2.0 0.0.0.255 any +# ip access-list ACL1v6 +# 10 permit sctp any any +# 20 remark IPv6 ACL +# ip access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + +- name: Delete all ACLs + cisco.nxos.nxos_acls: + config: + state: deleted + +# After state: +# ----------- +# + + +# Before state: +# ------------- +# +# ip access-list ACL1v4 +# 10 permit ip any any +# 20 deny udp any any +# ip access-list ACL2v4 +# 10 permit ahp 192.0.2.0 0.0.0.255 any +# ip access-list ACL1v6 +# 10 permit sctp any any +# 20 remark IPv6 ACL +# ip access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + +- name: Delete all ACLs in given AFI + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + state: deleted + +# After state: +# ------------ +# +# ip access-list ACL1v6 +# 10 permit sctp any any +# 20 remark IPv6 ACL +# ip access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + + + +# Before state: +# ------------- +# +# ip access-list ACL1v4 +# 10 permit ip any any +# 20 deny udp any any +# ip access-list ACL2v4 +# 10 permit ahp 192.0.2.0 0.0.0.255 any +# ipv6 access-list ACL1v6 +# 10 permit sctp any any +# 20 remark IPv6 ACL +# ipv6 access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + +- name: Delete specific ACLs + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: ACL1v4 + - name: ACL2v4 + - afi: ipv6 + acls: + - name: ACL1v6 + state: deleted + +# After state: +# ------------ +# ipv6 access-list ACL2v6 +# 10 deny ipv6 any 2001:db8:3000::/36 +# 20 permit tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128 + +# Using parsed + +- name: Parse given config to structured data + cisco.nxos.nxos_acls: + running_config: | + ip access-list ACL1v4 + 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin + ipv6 access-list ACL1v6 + 10 permit sctp any any + state: parsed + +# returns: +# parsed: +# - afi: ipv4 +# acls: +# - name: ACL1v4 +# aces: +# - grant: deny +# destination: +# address: 192.0.2.64 +# wildcard_bits: 0.0.0.255 +# source: +# any: true +# port_protocol: +# lt: 55 +# protocol: tcp +# protocol_options: +# tcp: +# ack: true +# fin: true +# sequence: 50 +# +# - afi: ipv6 +# acls: +# - name: ACL1v6 +# aces: +# - grant: permit +# sequence: 10 +# source: +# any: true +# destination: +# prefix: 2001:db8:12::/32 +# protocol: sctp + + +# Using gathered: + +# Before state: +# ------------ +# +# ip access-list ACL1v4 +# 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin +# ipv6 access-list ACL1v6 +# 10 permit sctp any any + +- name: Gather existing configuration + cisco.nxos.nxos_acls: + state: gathered + +# returns: +# gathered: +# - afi: ipv4 +# acls: +# - name: ACL1v4 +# aces: +# - grant: deny +# destination: +# address: 192.0.2.64 +# wildcard_bits: 0.0.0.255 +# source: +# any: true +# port_protocol: +# lt: 55 +# protocol: tcp +# protocol_options: +# tcp: +# ack: true +# fin: true +# sequence: 50 + +# - afi: ipv6 +# acls: +# - name: ACL1v6 +# aces: +# - grant: permit +# sequence: 10 +# source: +# any: true +# destination: +# prefix: 2001:db8:12::/32 +# protocol: sctp + + +# Using rendered + +- name: Render required configuration to be pushed to the device + cisco.nxos.nxos_acls: + config: + - afi: ipv4 + acls: + - name: ACL1v4 + aces: + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + lt: 55 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - afi: ipv6 + acls: + - name: ACL1v6 + aces: + - grant: permit + sequence: 10 + source: + any: true + destination: + prefix: 2001:db8:12::/32 + protocol: sctp + state: rendered + +# returns: +# rendered: +# ip access-list ACL1v4 +# 50 deny tcp any lt 55 192.0.2.64 0.0.0.255 ack fin +# ipv6 access-list ACL1v6 +# 10 permit sctp any any +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['ip access-list ACL1v4', '10 permit ip any any precedence critical log', '20 deny tcp any lt smtp host 192.0.2.64 ack fin'] +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.acls.acls import ( + AclsArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.acls.acls import ( + Acls, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=AclsArgs.argument_spec, supports_check_mode=True + ) + + result = Acls(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_banner.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_banner.py new file mode 100644 index 00000000..84cc6d91 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_banner.py @@ -0,0 +1,229 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# (c) 2017, Ansible by Red Hat, inc +# +# This file is part of Ansible by Red Hat +# +# 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 . +# + + +DOCUMENTATION = """ +module: nxos_banner +author: Trishna Guha (@trishnaguha) +short_description: Manage multiline banners on Cisco NXOS devices +description: +- This will configure both exec and motd banners on remote devices running Cisco NXOS. + It allows playbooks to add or remove banner text from the active running configuration. +notes: +- Since responses from the device are always read with surrounding whitespaces stripped, + tasks that configure banners with preceeding or trailing whitespaces will not be idempotent. +version_added: 1.0.0 +options: + banner: + description: + - Specifies which banner that should be configured on the remote device. + required: true + choices: + - exec + - motd + type: str + text: + description: + - The banner text that should be present in the remote device running configuration. + This argument accepts a multiline string, with no empty lines. Requires I(state=present). + type: str + state: + description: + - Specifies whether or not the configuration is present in the current devices + active running configuration. + default: present + choices: + - present + - absent + type: str +extends_documentation_fragment: +- cisco.nxos.nxos +""" + +EXAMPLES = """ +- name: configure the exec banner + cisco.nxos.nxos_banner: + banner: exec + text: | + this is my exec banner + that contains a multiline + string + state: present +- name: remove the motd banner + cisco.nxos.nxos_banner: + banner: motd + state: absent +- name: Configure banner from file + cisco.nxos.nxos_banner: + banner: motd + text: "{{ lookup('file', './config_partial/raw_banner.cfg') }}" + state: present +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always + type: list + sample: + - banner exec + - this is my exec banner + - that contains a multiline + - string +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils._text import to_text +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +import re + + +def execute_show_command(module, command): + format = "text" + cmds = [{"command": command, "output": format}] + output = run_commands(module, cmds) + return output + + +def map_obj_to_commands(want, have, module): + commands = list() + state = module.params["state"] + platform_regex = "Nexus.*Switch" + + if state == "absent": + if have.get("text") and not ( + (have.get("text") == "User Access Verification") + or re.match(platform_regex, have.get("text")) + ): + commands.append("no banner %s" % module.params["banner"]) + + elif state == "present" and want.get("text") != have.get("text"): + banner_cmd = "banner %s @\n%s\n@" % ( + module.params["banner"], + want["text"], + ) + commands.append(banner_cmd) + + return commands + + +def map_config_to_obj(module): + command = "show banner %s" % module.params["banner"] + output = execute_show_command(module, command)[0] + + if "Invalid command" in output: + module.fail_json( + msg="banner: %s may not be supported on this platform. Possible values are : exec | motd" + % module.params["banner"] + ) + + if isinstance(output, dict): + output = list(output.values()) + if output != []: + output = output[0] + else: + output = "" + if isinstance(output, dict): + output = list(output.values()) + if output != []: + output = output[0] + else: + output = "" + else: + output = output.rstrip() + + obj = {"banner": module.params["banner"], "state": "absent"} + if output: + obj["text"] = output + obj["state"] = "present" + return obj + + +def map_params_to_obj(module): + text = module.params["text"] + return { + "banner": module.params["banner"], + "text": to_text(text) if text else None, + "state": module.params["state"], + } + + +def main(): + """ main entry point for module execution + """ + argument_spec = dict( + banner=dict(required=True, choices=["exec", "motd"]), + text=dict(), + state=dict(default="present", choices=["present", "absent"]), + ) + + argument_spec.update(nxos_argument_spec) + + required_if = [("state", "present", ("text",))] + + module = AnsibleModule( + argument_spec=argument_spec, + required_if=required_if, + supports_check_mode=True, + ) + + warnings = list() + + result = {"changed": False} + if warnings: + result["warnings"] = warnings + want = map_params_to_obj(module) + have = map_config_to_obj(module) + commands = map_obj_to_commands(want, have, module) + result["commands"] = commands + + if commands: + if not module.check_mode: + msgs = load_config(module, commands, True) + if msgs: + for item in msgs: + if item: + if isinstance(item, dict): + err_str = item["clierror"] + else: + err_str = item + if ( + "more than 40 lines" in err_str + or "buffer overflowed" in err_str + ): + load_config(module, commands) + + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_global.py new file mode 100644 index 00000000..54ce4ec6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_global.py @@ -0,0 +1,336 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_bfd_global +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Bidirectional Forwarding Detection (BFD) global-level configuration +description: +- Manages Bidirectional Forwarding Detection (BFD) global-level configuration. +version_added: 1.0.0 +author: +- Chris Van Heuveln (@chrisvanheuveln) +notes: +- Tested against NXOSv 9.2(2) +- BFD global will automatically enable 'feature bfd' if it is disabled. +- BFD global does not have a 'state' parameter. All of the BFD commands are unique + and are defined if 'feature bfd' is enabled. +options: + echo_interface: + description: + - Loopback interface used for echo frames. + - Valid values are loopback interface name or 'deleted'. + - Not supported on N5K/N6K + required: false + type: str + echo_rx_interval: + description: + - BFD Echo receive interval in milliseconds. + required: false + type: int + interval: + description: + - BFD interval timer values. + - Value must be a dict defining values for keys (tx, min_rx, and multiplier) + required: false + type: dict + slow_timer: + description: + - BFD slow rate timer in milliseconds. + required: false + type: int + startup_timer: + description: + - BFD delayed startup timer in seconds. + - Not supported on N5K/N6K/N7K + required: false + type: int + ipv4_echo_rx_interval: + description: + - BFD IPv4 session echo receive interval in milliseconds. + required: false + type: int + ipv4_interval: + description: + - BFD IPv4 interval timer values. + - Value must be a dict defining values for keys (tx, min_rx, and multiplier). + required: false + type: dict + ipv4_slow_timer: + description: + - BFD IPv4 slow rate timer in milliseconds. + required: false + type: int + ipv6_echo_rx_interval: + description: + - BFD IPv6 session echo receive interval in milliseconds. + required: false + type: int + ipv6_interval: + description: + - BFD IPv6 interval timer values. + - Value must be a dict defining values for keys (tx, min_rx, and multiplier). + required: false + type: dict + ipv6_slow_timer: + description: + - BFD IPv6 slow rate timer in milliseconds. + required: false + type: int + fabricpath_interval: + description: + - BFD fabricpath interval timer values. + - Value must be a dict defining values for keys (tx, min_rx, and multiplier). + required: false + type: dict + fabricpath_slow_timer: + description: + - BFD fabricpath slow rate timer in milliseconds. + required: false + type: int + fabricpath_vlan: + description: + - BFD fabricpath control vlan. + required: false + type: int +""" +EXAMPLES = """ +- cisco.nxos.nxos_bfd_global: + echo_interface: Ethernet1/2 + echo_rx_interval: 50 + interval: + tx: 50 + min_rx: 50 + multiplier: 4 +""" + +RETURN = """ +cmds: + description: commands sent to the device + returned: always + type: list + sample: ["bfd echo-interface loopback1", "bfd slow-timer 2000"] +""" + + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + NxosCmdRef, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, +) +from ansible.module_utils.basic import AnsibleModule + +BFD_CMD_REF = """ +# The cmd_ref is a yaml formatted list of module commands. +# A leading underscore denotes a non-command variable; e.g. _template. +# BFD does not have convenient json data so this cmd_ref uses raw cli configs. +--- +_template: # _template holds common settings for all commands + # Enable feature bfd if disabled + feature: bfd + # Common get syntax for BFD commands + get_command: show run bfd all | incl '^(no )*bfd' + +echo_interface: + kind: str + getval: (no )*bfd echo-interface *(\\S+)*$ + setval: 'bfd echo-interface {0}' + default: ~ + +echo_rx_interval: + _exclude: ['N5K', 'N6K'] + kind: int + getval: bfd echo-rx-interval (\\d+)$ + setval: bfd echo-rx-interval {0} + default: 50 + N3K: + default: 250 + +interval: + kind: dict + getval: bfd interval (?P\\d+) min_rx (?P\\d+) multiplier (?P\\d+) + setval: bfd interval {tx} min_rx {min_rx} multiplier {multiplier} + default: &def_interval + tx: 50 + min_rx: 50 + multiplier: 3 + N3K: + default: &n3k_def_interval + tx: 250 + min_rx: 250 + multiplier: 3 + +slow_timer: + kind: int + getval: bfd slow-timer (\\d+)$ + setval: bfd slow-timer {0} + default: 2000 + +startup_timer: + _exclude: ['N5K', 'N6K', 'N7K'] + kind: int + getval: bfd startup-timer (\\d+)$ + setval: bfd startup-timer {0} + default: 5 + +# IPv4/IPv6 specific commands +ipv4_echo_rx_interval: + _exclude: ['N5K', 'N6K'] + kind: int + getval: bfd ipv4 echo-rx-interval (\\d+)$ + setval: bfd ipv4 echo-rx-interval {0} + default: 50 + N3K: + default: 250 + +ipv4_interval: + _exclude: ['N5K', 'N6K'] + kind: dict + getval: bfd ipv4 interval (?P\\d+) min_rx (?P\\d+) multiplier (?P\\d+) + setval: bfd ipv4 interval {tx} min_rx {min_rx} multiplier {multiplier} + default: *def_interval + N3K: + default: *n3k_def_interval + +ipv4_slow_timer: + _exclude: ['N5K', 'N6K'] + kind: int + getval: bfd ipv4 slow-timer (\\d+)$ + setval: bfd ipv4 slow-timer {0} + default: 2000 + +ipv6_echo_rx_interval: + _exclude: ['N35', 'N5K', 'N6K'] + kind: int + getval: bfd ipv6 echo-rx-interval (\\d+)$ + setval: bfd ipv6 echo-rx-interval {0} + default: 50 + N3K: + default: 250 + +ipv6_interval: + _exclude: ['N35', 'N5K', 'N6K'] + kind: dict + getval: bfd ipv6 interval (?P\\d+) min_rx (?P\\d+) multiplier (?P\\d+) + setval: bfd ipv6 interval {tx} min_rx {min_rx} multiplier {multiplier} + default: *def_interval + N3K: + default: *n3k_def_interval + +ipv6_slow_timer: + _exclude: ['N35', 'N5K', 'N6K'] + kind: int + getval: bfd ipv6 slow-timer (\\d+)$ + setval: bfd ipv6 slow-timer {0} + default: 2000 + +# Fabricpath Commands +fabricpath_interval: + _exclude: ['N35', 'N3K', 'N9K'] + kind: dict + getval: bfd fabricpath interval (?P\\d+) min_rx (?P\\d+) multiplier (?P\\d+) + setval: bfd fabricpath interval {tx} min_rx {min_rx} multiplier {multiplier} + default: *def_interval + +fabricpath_slow_timer: + _exclude: ['N35', 'N3K', 'N9K'] + kind: int + getval: bfd fabricpath slow-timer (\\d+)$ + setval: bfd fabricpath slow-timer {0} + default: 2000 + +fabricpath_vlan: + _exclude: ['N35', 'N3K', 'N9K'] + kind: int + getval: bfd fabricpath vlan (\\d+)$ + setval: bfd fabricpath vlan {0} + default: 1 +""" + + +def reorder_cmds(cmds): + """ + There is a bug in some image versions where bfd echo-interface and + bfd echo-rx-interval need to be applied last for them to nvgen properly. + """ + regex1 = re.compile(r"^bfd echo-interface") + regex2 = re.compile(r"^bfd echo-rx-interval") + filtered_cmds = [i for i in cmds if not regex1.match(i)] + filtered_cmds = [i for i in filtered_cmds if not regex2.match(i)] + echo_int_cmd = [i for i in cmds if regex1.match(i)] + echo_rx_cmd = [i for i in cmds if regex2.match(i)] + filtered_cmds.extend(echo_int_cmd) + filtered_cmds.extend(echo_rx_cmd) + + return filtered_cmds + + +def main(): + argument_spec = dict( + echo_interface=dict(required=False, type="str"), + echo_rx_interval=dict(required=False, type="int"), + interval=dict(required=False, type="dict"), + slow_timer=dict(required=False, type="int"), + startup_timer=dict(required=False, type="int"), + ipv4_echo_rx_interval=dict(required=False, type="int"), + ipv4_interval=dict(required=False, type="dict"), + ipv4_slow_timer=dict(required=False, type="int"), + ipv6_echo_rx_interval=dict(required=False, type="int"), + ipv6_interval=dict(required=False, type="dict"), + ipv6_slow_timer=dict(required=False, type="int"), + fabricpath_interval=dict(required=False, type="dict"), + fabricpath_slow_timer=dict(required=False, type="int"), + fabricpath_vlan=dict(required=False, type="int"), + ) + argument_spec.update(nxos_argument_spec) + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + warnings = list() + + cmd_ref = NxosCmdRef(module, BFD_CMD_REF) + cmd_ref.get_existing() + cmd_ref.get_playvals() + cmds = reorder_cmds(cmd_ref.get_proposed()) + + result = { + "changed": False, + "commands": cmds, + "warnings": warnings, + "check_mode": module.check_mode, + } + if cmds: + result["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_interfaces.py new file mode 100644 index 00000000..3e885dc2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bfd_interfaces.py @@ -0,0 +1,299 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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 module file for nxos_bfd_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_bfd_interfaces +short_description: BFD interfaces resource module +description: Manages attributes of Bidirectional Forwarding Detection (BFD) on the + interface. +version_added: 1.0.0 +author: Chris Van Heuveln (@chrisvanheuveln) +notes: +- Tested against NX-OS 7.0(3)I5(1). +- Feature bfd should be enabled for this module. +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section '^interface|^feature + bfd'). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: The provided configuration + type: list + elements: dict + suboptions: + name: + type: str + description: The name of the interface. + bfd: + type: str + description: + - Enable/Disable Bidirectional Forwarding Detection (BFD) on the interface. + choices: + - enable + - disable + echo: + type: str + description: + - Enable/Disable BFD Echo functionality on the interface. + choices: + - enable + - disable + state: + description: + - The state of the configuration after module completion + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using deleted + +- name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + state: deleted + + +# Using merged + +- name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + echo: enable + - name: Ethernet1/2 + bfd: disable + echo: disable + state: merged + + +# Using overridden + +- name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + echo: enable + - name: Ethernet1/2 + bfd: disable + echo: disable + state: overridden + + +# Using replaced + +- name: Configure interfaces + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + echo: enable + - name: Ethernet1/2 + bfd: disable + echo: disable + state: replaced + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/800 + bfd: enable + echo: enable + - name: Ethernet1/801 + bfd: disable + echo: disable + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/800" +# - "bfd" +# - "bfd echo" +# - "interface Ethernet1/801" +# - "no bfd" +# - "no bfd echo" + +# Using parsed + +# parsed.cfg +# ------------ + +# feature bfd +# interface Ethernet1/800 +# no switchport +# no bfd +# no bfd echo +# interface Ethernet1/801 +# no switchport +# no bfd +# interface Ethernet1/802 +# no switchport +# no bfd echo +# interface mgmt0 +# ip address dhcp +# vrf member management + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_bfd_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- + +# parsed: +# - bfd: disable +# echo: disable +# name: Ethernet1/800 +# - bfd: disable +# echo: enable +# name: Ethernet1/801 +# - bfd: enable +# echo: disable +# name: Ethernet1/802 +# - bfd: enable +# echo: enable +# name: mgmt0 + +# Using gathered + +# Existing device config state +# ------------------------------- + +# feature bfd +# interface Ethernet1/1 +# no switchport +# no bfd +# interface Ethernet1/2 +# no switchport +# no bfd echo +# interface mgmt0 +# ip address dhcp +# vrf member management + +- name: Gather bfd_interfaces facts from the device using nxos_bfd_interfaces + cisco.nxos.nxos_bfd_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# - name: Ethernet1/1 +# bfd: disable +# echo: enable +# - name: Ethernet1/3 +# echo: disable +# bfd: enable +# - name: mgmt0 +# bfd: enable +# echo: enable +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface Ethernet1/1', 'no bfd', 'no bfd echo'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.bfd_interfaces.bfd_interfaces import ( + Bfd_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.bfd_interfaces.bfd_interfaces import ( + Bfd_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=Bfd_interfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Bfd_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp.py new file mode 100644 index 00000000..a850d15b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp.py @@ -0,0 +1,786 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_bgp +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2023-01-27) Manages BGP configuration. +description: +- Manages BGP configurations on NX-OS switches. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +deprecated: + alternative: nxos_bgp_global + why: Updated module released with more functionality. + removed_at_date: '2023-01-27' +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the whole BGP ASN configuration when C(vrf=default) or the + whole VRF instance within the BGP process when using a different VRF. +- Default when supported restores params default value. +- Configuring global params is only permitted if C(vrf=default). +options: + asn: + description: + - BGP autonomous system number. Valid values are String, Integer in ASPLAIN or + ASDOT notation. + required: true + type: str + vrf: + description: + - Name of the VRF. The name 'default' is a valid VRF representing the global BGP. + default: 'default' + type: str + bestpath_always_compare_med: + description: + - Enable/Disable MED comparison on paths from different autonomous systems. + type: bool + bestpath_aspath_multipath_relax: + description: + - Enable/Disable load sharing across the providers with different (but equal-length) + AS paths. + type: bool + bestpath_compare_routerid: + description: + - Enable/Disable comparison of router IDs for identical eBGP paths. + type: bool + bestpath_compare_neighborid: + description: + - Enable/Disable neighborid. Use this when more paths available than max path + config. + type: bool + bestpath_cost_community_ignore: + description: + - Enable/Disable Ignores the cost community for BGP best-path calculations. + type: bool + bestpath_med_confed: + description: + - Enable/Disable enforcement of bestpath to do a MED comparison only between paths + originated within a confederation. + type: bool + bestpath_med_missing_as_worst: + description: + - Enable/Disable assigns the value of infinity to received routes that do not + carry the MED attribute, making these routes the least desirable. + type: bool + bestpath_med_non_deterministic: + description: + - Enable/Disable deterministic selection of the best MED pat from among the paths + from the same autonomous system. + type: bool + cluster_id: + description: + - Route Reflector Cluster-ID. + type: str + confederation_id: + description: + - Routing domain confederation AS. + type: str + confederation_peers: + description: + - AS confederation parameters. + type: list + elements: str + disable_policy_batching: + description: + - Enable/Disable the batching evaluation of prefix advertisement to all peers. + type: bool + disable_policy_batching_ipv4_prefix_list: + description: + - Enable/Disable the batching evaluation of prefix advertisements to all peers + with prefix list. + type: str + disable_policy_batching_ipv6_prefix_list: + description: + - Enable/Disable the batching evaluation of prefix advertisements to all peers + with prefix list. + type: str + enforce_first_as: + description: + - Enable/Disable enforces the neighbor autonomous system to be the first AS number + listed in the AS path attribute for eBGP. On NX-OS, this property is only supported + in the global BGP context. + type: bool + event_history_cli: + description: + - Enable/Disable cli event history buffer. + choices: + - size_small + - size_medium + - size_large + - size_disable + - default + - 'true' + - 'false' + type: str + event_history_detail: + description: + - Enable/Disable detail event history buffer. + choices: + - size_small + - size_medium + - size_large + - size_disable + - default + - 'true' + - 'false' + type: str + event_history_events: + description: + - Enable/Disable event history buffer. + choices: + - size_small + - size_medium + - size_large + - size_disable + - default + - 'true' + - 'false' + type: str + event_history_periodic: + description: + - Enable/Disable periodic event history buffer. + choices: + - size_small + - size_medium + - size_large + - size_disable + - default + - 'true' + - 'false' + type: str + fast_external_fallover: + description: + - Enable/Disable immediately reset the session if the link to a directly connected + BGP peer goes down. Only supported in the global BGP context. + type: bool + flush_routes: + description: + - Enable/Disable flush routes in RIB upon controlled restart. On NX-OS, this property + is only supported in the global BGP context. + type: bool + graceful_restart: + description: + - Enable/Disable graceful restart. + type: bool + graceful_restart_helper: + description: + - Enable/Disable graceful restart helper mode. + type: bool + graceful_restart_timers_restart: + description: + - Set maximum time for a restart sent to the BGP peer. + type: str + graceful_restart_timers_stalepath_time: + description: + - Set maximum time that BGP keeps the stale routes from the restarting BGP peer. + type: str + isolate: + description: + - Enable/Disable isolate this router from BGP perspective. + type: bool + local_as: + description: + - Local AS number to be used within a VRF instance. + type: str + log_neighbor_changes: + description: + - Enable/Disable message logging for neighbor up/down event. + type: bool + maxas_limit: + description: + - Specify Maximum number of AS numbers allowed in the AS-path attribute. Valid + values are between 1 and 512. + type: str + neighbor_down_fib_accelerate: + description: + - Enable/Disable handle BGP neighbor down event, due to various reasons. + type: bool + reconnect_interval: + description: + - The BGP reconnection interval for dropped sessions. Valid values are between + 1 and 60. + type: str + router_id: + description: + - Router Identifier (ID) of the BGP router VRF instance. + type: str + shutdown: + description: + - Administratively shutdown the BGP protocol. + type: bool + suppress_fib_pending: + description: + - Enable/Disable advertise only routes programmed in hardware to peers. + type: bool + timer_bestpath_limit: + description: + - Specify timeout for the first best path after a restart, in seconds. + type: str + timer_bgp_hold: + description: + - Set BGP hold timer. + type: str + timer_bgp_keepalive: + description: + - Set BGP keepalive timer. + type: str + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str +""" + + +EXAMPLES = """ +- name: Configure a simple ASN + cisco.nxos.nxos_bgp: + asn: 65535 + vrf: test + router_id: 192.0.2.1 + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["router bgp 65535", "vrf test", "router-id 192.0.2.1"] +""" + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +BOOL_PARAMS = [ + "bestpath_always_compare_med", + "bestpath_aspath_multipath_relax", + "bestpath_compare_neighborid", + "bestpath_compare_routerid", + "bestpath_cost_community_ignore", + "bestpath_med_confed", + "bestpath_med_missing_as_worst", + "bestpath_med_non_deterministic", + "disable_policy_batching", + "enforce_first_as", + "fast_external_fallover", + "flush_routes", + "graceful_restart", + "graceful_restart_helper", + "isolate", + "log_neighbor_changes", + "neighbor_down_fib_accelerate", + "shutdown", + "suppress_fib_pending", +] +GLOBAL_PARAMS = [ + "disable_policy_batching", + "disable_policy_batching_ipv4_prefix_list", + "disable_policy_batching_ipv6_prefix_list", + "enforce_first_as", + "event_history_cli", + "event_history_detail", + "event_history_events", + "event_history_periodic", + "fast_external_fallover", + "flush_routes", + "isolate", + "suppress_fib_pending", + "shutdown", +] +PARAM_TO_DEFAULT_KEYMAP = { + "timer_bgp_keepalive": "60", + "timer_bgp_hold": "180", + "timer_bestpath_limit": "300", + "graceful_restart": True, + "graceful_restart_timers_restart": "120", + "graceful_restart_timers_stalepath_time": "300", + "reconnect_interval": "60", + "suppress_fib_pending": True, + "fast_external_fallover": True, + "enforce_first_as": True, + "event_history_cli": True, + "event_history_detail": False, + "event_history_events": True, + "event_history_periodic": True, + "maxas_limit": "", + "router_id": "", + "cluster_id": "", + "disable_policy_batching_ipv4_prefix_list": "", + "disable_policy_batching_ipv6_prefix_list": "", + "local_as": "", + "confederation_id": "", +} +PARAM_TO_COMMAND_KEYMAP = { + "asn": "router bgp", + "bestpath_always_compare_med": "bestpath always-compare-med", + "bestpath_aspath_multipath_relax": "bestpath as-path multipath-relax", + "bestpath_compare_neighborid": "bestpath compare-neighborid", + "bestpath_compare_routerid": "bestpath compare-routerid", + "bestpath_cost_community_ignore": "bestpath cost-community ignore", + "bestpath_med_confed": "bestpath med confed", + "bestpath_med_missing_as_worst": "bestpath med missing-as-worst", + "bestpath_med_non_deterministic": "bestpath med non-deterministic", + "cluster_id": "cluster-id", + "confederation_id": "confederation identifier", + "confederation_peers": "confederation peers", + "disable_policy_batching": "disable-policy-batching", + "disable_policy_batching_ipv4_prefix_list": "disable-policy-batching ipv4 prefix-list", + "disable_policy_batching_ipv6_prefix_list": "disable-policy-batching ipv6 prefix-list", + "enforce_first_as": "enforce-first-as", + "event_history_cli": "event-history cli", + "event_history_detail": "event-history detail", + "event_history_events": "event-history events", + "event_history_periodic": "event-history periodic", + "fast_external_fallover": "fast-external-fallover", + "flush_routes": "flush-routes", + "graceful_restart": "graceful-restart", + "graceful_restart_helper": "graceful-restart-helper", + "graceful_restart_timers_restart": "graceful-restart restart-time", + "graceful_restart_timers_stalepath_time": "graceful-restart stalepath-time", + "isolate": "isolate", + "local_as": "local-as", + "log_neighbor_changes": "log-neighbor-changes", + "maxas_limit": "maxas-limit", + "neighbor_down_fib_accelerate": "neighbor-down fib-accelerate", + "reconnect_interval": "reconnect-interval", + "router_id": "router-id", + "shutdown": "shutdown", + "suppress_fib_pending": "suppress-fib-pending", + "timer_bestpath_limit": "timers bestpath-limit", + "timer_bgp_hold": "timers bgp", + "timer_bgp_keepalive": "timers bgp", + "vrf": "vrf", +} + + +def get_value(arg, config): + command = PARAM_TO_COMMAND_KEYMAP.get(arg) + + if command.split()[0] == "event-history": + has_size = re.search( + r"^\s+{0} size\s(?P.*)$".format(command), config, re.M + ) + + if command == "event-history detail": + value = False + else: + value = "size_small" + + if has_size: + value = "size_%s" % has_size.group("value") + + elif arg in ["enforce_first_as", "fast_external_fallover"]: + no_command_re = re.compile(r"no\s+{0}\s*".format(command), re.M) + value = True + + if no_command_re.search(config): + value = False + + elif arg in BOOL_PARAMS: + has_command = re.search(r"^\s+{0}\s*$".format(command), config, re.M) + value = False + + if has_command: + value = True + else: + command_val_re = re.compile( + r"(?:{0}\s)(?P.*)".format(command), re.M + ) + value = "" + + has_command = command_val_re.search(config) + if has_command: + found_value = has_command.group("value") + + if arg == "confederation_peers": + value = found_value.split() + elif arg == "timer_bgp_keepalive": + value = found_value.split()[0] + elif arg == "timer_bgp_hold": + split_values = found_value.split() + if len(split_values) == 2: + value = split_values[1] + elif found_value: + value = found_value + + return value + + +def get_existing(module, args, warnings): + existing = {} + netcfg = CustomNetworkConfig( + indent=2, contents=get_config(module, flags=["bgp all"]) + ) + + asn_re = re.compile( + r".*router\sbgp\s(?P\d+(\.\d+)?).*", re.S + ) + asn_match = asn_re.match(str(netcfg)) + + if asn_match: + existing_asn = asn_match.group("existing_asn") + bgp_parent = "router bgp {0}".format(existing_asn) + + if module.params["vrf"] != "default": + parents = [bgp_parent, "vrf {0}".format(module.params["vrf"])] + else: + parents = [bgp_parent] + + config = netcfg.get_section(parents) + if config: + for arg in args: + if arg != "asn" and ( + module.params["vrf"] == "default" + or arg not in GLOBAL_PARAMS + ): + existing[arg] = get_value(arg, config) + + existing["asn"] = existing_asn + if module.params["vrf"] == "default": + existing["vrf"] = "default" + + if ( + not existing + and module.params["vrf"] != "default" + and module.params["state"] == "present" + ): + msg = "VRF {0} doesn't exist.".format(module.params["vrf"]) + warnings.append(msg) + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key in table: + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = table.get(key) + + return new_dict + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, value in proposed_commands.items(): + if value is True: + commands.append(key) + elif value is False: + commands.append("no {0}".format(key)) + elif value == "default": + default_value = PARAM_TO_DEFAULT_KEYMAP.get(key) + existing_value = existing_commands.get(key) + + if default_value: + commands.append("{0} {1}".format(key, default_value)) + elif existing_value: + if key == "confederation peers": + existing_value = " ".join(existing_value) + commands.append("no {0} {1}".format(key, existing_value)) + elif not value: + existing_value = existing_commands.get(key) + if existing_value: + commands.append("no {0} {1}".format(key, existing_value)) + elif key == "confederation peers": + commands.append("{0} {1}".format(key, value)) + elif key.startswith("timers bgp"): + command = "timers bgp {0} {1}".format( + proposed["timer_bgp_keepalive"], proposed["timer_bgp_hold"] + ) + if command not in commands: + commands.append(command) + else: + if value.startswith("size"): + value = value.replace("_", " ") + command = "{0} {1}".format(key, value) + commands.append(command) + + parents = [] + if commands: + commands = fix_commands(commands) + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + elif proposed: + if module.params["vrf"] != "default": + commands.append("vrf {0}".format(module.params["vrf"])) + parents = ["router bgp {0}".format(module.params["asn"])] + else: + commands.append("router bgp {0}".format(module.params["asn"])) + + candidate.add(commands, parents=parents) + + +def state_absent(module, existing, candidate): + commands = [] + parents = [] + if module.params["vrf"] == "default": + commands.append("no router bgp {0}".format(module.params["asn"])) + elif existing.get("vrf") == module.params["vrf"]: + commands.append("no vrf {0}".format(module.params["vrf"])) + parents = ["router bgp {0}".format(module.params["asn"])] + + candidate.add(commands, parents=parents) + + +def fix_commands(commands): + local_as_command = "" + confederation_id_command = "" + confederation_peers_command = "" + + for command in commands: + if "local-as" in command: + local_as_command = command + elif "confederation identifier" in command: + confederation_id_command = command + elif "confederation peers" in command: + confederation_peers_command = command + + if local_as_command and confederation_id_command: + if "no" in confederation_id_command: + commands.pop(commands.index(local_as_command)) + commands.pop(commands.index(confederation_id_command)) + commands.append(confederation_id_command) + commands.append(local_as_command) + else: + commands.pop(commands.index(local_as_command)) + commands.pop(commands.index(confederation_id_command)) + commands.append(local_as_command) + commands.append(confederation_id_command) + + if confederation_peers_command and confederation_id_command: + if local_as_command: + if "no" in local_as_command: + commands.pop(commands.index(local_as_command)) + commands.pop(commands.index(confederation_id_command)) + commands.pop(commands.index(confederation_peers_command)) + commands.append(confederation_id_command) + commands.append(confederation_peers_command) + commands.append(local_as_command) + else: + commands.pop(commands.index(local_as_command)) + commands.pop(commands.index(confederation_id_command)) + commands.pop(commands.index(confederation_peers_command)) + commands.append(local_as_command) + commands.append(confederation_id_command) + commands.append(confederation_peers_command) + else: + commands.pop(commands.index(confederation_peers_command)) + commands.pop(commands.index(confederation_id_command)) + commands.append(confederation_id_command) + commands.append(confederation_peers_command) + + return commands + + +def main(): + argument_spec = dict( + asn=dict(required=True, type="str"), + vrf=dict(required=False, type="str", default="default"), + bestpath_always_compare_med=dict(required=False, type="bool"), + bestpath_aspath_multipath_relax=dict(required=False, type="bool"), + bestpath_compare_neighborid=dict(required=False, type="bool"), + bestpath_compare_routerid=dict(required=False, type="bool"), + bestpath_cost_community_ignore=dict(required=False, type="bool"), + bestpath_med_confed=dict(required=False, type="bool"), + bestpath_med_missing_as_worst=dict(required=False, type="bool"), + bestpath_med_non_deterministic=dict(required=False, type="bool"), + cluster_id=dict(required=False, type="str"), + confederation_id=dict(required=False, type="str"), + confederation_peers=dict(required=False, type="list", elements="str"), + disable_policy_batching=dict(required=False, type="bool"), + disable_policy_batching_ipv4_prefix_list=dict( + required=False, type="str" + ), + disable_policy_batching_ipv6_prefix_list=dict( + required=False, type="str" + ), + enforce_first_as=dict(required=False, type="bool"), + event_history_cli=dict( + required=False, + choices=[ + "true", + "false", + "default", + "size_small", + "size_medium", + "size_large", + "size_disable", + ], + ), + event_history_detail=dict( + required=False, + choices=[ + "true", + "false", + "default", + "size_small", + "size_medium", + "size_large", + "size_disable", + ], + ), + event_history_events=dict( + required=False, + choices=[ + "true", + "false", + "default", + "size_small", + "size_medium", + "size_large", + "size_disable", + ], + ), + event_history_periodic=dict( + required=False, + choices=[ + "true", + "false", + "default", + "size_small", + "size_medium", + "size_large", + "size_disable", + ], + ), + fast_external_fallover=dict(required=False, type="bool"), + flush_routes=dict(required=False, type="bool"), + graceful_restart=dict(required=False, type="bool"), + graceful_restart_helper=dict(required=False, type="bool"), + graceful_restart_timers_restart=dict(required=False, type="str"), + graceful_restart_timers_stalepath_time=dict( + required=False, type="str" + ), + isolate=dict(required=False, type="bool"), + local_as=dict(required=False, type="str"), + log_neighbor_changes=dict(required=False, type="bool"), + maxas_limit=dict(required=False, type="str"), + neighbor_down_fib_accelerate=dict(required=False, type="bool"), + reconnect_interval=dict(required=False, type="str"), + router_id=dict(required=False, type="str"), + shutdown=dict(required=False, type="bool"), + suppress_fib_pending=dict(required=False, type="bool"), + timer_bestpath_limit=dict(required=False, type="str"), + timer_bgp_hold=dict(required=False, type="str"), + timer_bgp_keepalive=dict(required=False, type="str"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + ) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + required_together=[["timer_bgp_hold", "timer_bgp_keepalive"]], + supports_check_mode=True, + ) + + warnings = list() + result = dict(changed=False, warnings=warnings) + + state = module.params["state"] + + if module.params["vrf"] != "default": + for param in GLOBAL_PARAMS: + if module.params[param]: + module.fail_json( + msg='Global params can be modified only under "default" VRF.', + vrf=module.params["vrf"], + global_param=param, + ) + + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing = get_existing(module, args, warnings) + + if existing.get("asn") and state == "present": + if existing.get("asn") != module.params["asn"]: + module.fail_json( + msg="Another BGP ASN already exists.", + proposed_asn=module.params["asn"], + existing_asn=existing.get("asn"), + ) + + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + proposed = {} + for key, value in proposed_args.items(): + if key not in ["asn", "vrf"]: + if str(value).lower() == "default": + value = PARAM_TO_DEFAULT_KEYMAP.get(key, "default") + if key == "confederation_peers": + if value[0] == "default": + if existing.get(key): + proposed[key] = "default" + else: + v = set([int(i) for i in value]) + ex = set([int(i) for i in existing.get(key)]) + if v != ex: + proposed[key] = " ".join(str(s) for s in v) + else: + if existing.get(key) != value: + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + elif existing.get("asn") == module.params["asn"]: + state_absent(module, existing, candidate) + + if candidate: + candidate = candidate.items_text() + if not module.check_mode: + load_config(module, candidate) + result["changed"] = True + result["commands"] = candidate + else: + result["commands"] = [] + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_af.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_af.py new file mode 100644 index 00000000..6f24acfe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_af.py @@ -0,0 +1,935 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_bgp_af +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages BGP Address-family configuration. +description: +- Manages BGP Address-family configurations on NX-OS switches. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the whole BGP ASN configuration +- Default, where supported, restores params default value. +options: + asn: + description: + - BGP autonomous system number. Valid values are String, Integer in ASPLAIN or + ASDOT notation. + required: true + type: str + vrf: + description: + - Name of the VRF. The name 'default' is a valid VRF representing the global bgp. + default: 'default' + type: str + afi: + description: + - Address Family Identifier. + required: true + choices: + - ipv4 + - ipv6 + - vpnv4 + - vpnv6 + - l2vpn + type: str + safi: + description: + - Sub Address Family Identifier. + required: true + choices: + - unicast + - multicast + - evpn + type: str + additional_paths_install: + description: + - Install a backup path into the forwarding table and provide prefix independent + convergence (PIC) in case of a PE-CE link failure. + type: bool + additional_paths_receive: + description: + - Enables the receive capability of additional paths for all of the neighbors + under this address family for which the capability has not been disabled. + type: bool + additional_paths_selection: + description: + - Configures the capability of selecting additional paths for a prefix. Valid + values are a string defining the name of the route-map. + type: str + additional_paths_send: + description: + - Enables the send capability of additional paths for all of the neighbors under + this address family for which the capability has not been disabled. + type: bool + advertise_l2vpn_evpn: + description: + - Advertise evpn routes. + type: bool + client_to_client: + description: + - Configure client-to-client route reflection. + type: bool + dampen_igp_metric: + description: + - Specify dampen value for IGP metric-related changes, in seconds. Valid values + are integer and keyword 'default'. + type: str + dampening_state: + description: + - Enable/disable route-flap dampening. + type: bool + dampening_half_time: + description: + - Specify decay half-life in minutes for route-flap dampening. Valid values are + integer and keyword 'default'. + type: str + dampening_max_suppress_time: + description: + - Specify max suppress time for route-flap dampening stable route. Valid values + are integer and keyword 'default'. + type: str + dampening_reuse_time: + description: + - Specify route reuse time for route-flap dampening. Valid values are integer + and keyword 'default'. + type: str + dampening_routemap: + description: + - Specify route-map for route-flap dampening. Valid values are a string defining + the name of the route-map. + type: str + dampening_suppress_time: + description: + - Specify route suppress time for route-flap dampening. Valid values are integer + and keyword 'default'. + type: str + default_information_originate: + description: + - Default information originate. + type: bool + default_metric: + description: + - Sets default metrics for routes redistributed into BGP. Valid values are Integer + or keyword 'default' + type: str + distance_ebgp: + description: + - Sets the administrative distance for eBGP routes. Valid values are Integer or + keyword 'default'. + type: str + distance_ibgp: + description: + - Sets the administrative distance for iBGP routes. Valid values are Integer or + keyword 'default'. + type: str + distance_local: + description: + - Sets the administrative distance for local BGP routes. Valid values are Integer + or keyword 'default'. + type: str + inject_map: + description: + - An array of route-map names which will specify prefixes to inject. Each array + entry must first specify the inject-map name, secondly an exist-map name, and + optionally the copy-attributes keyword which indicates that attributes should + be copied from the aggregate. For example [['lax_inject_map', 'lax_exist_map'], + ['nyc_inject_map', 'nyc_exist_map', 'copy-attributes'], ['fsd_inject_map', 'fsd_exist_map']]. + type: list + elements: list + maximum_paths: + description: + - Configures the maximum number of equal-cost paths for load sharing. Valid value + is an integer in the range 1-64. + type: str + maximum_paths_ibgp: + description: + - Configures the maximum number of ibgp equal-cost paths for load sharing. Valid + value is an integer in the range 1-64. + type: str + networks: + description: + - Networks to configure. Valid value is a list of network prefixes to advertise. + The list must be in the form of an array. Each entry in the array must include + a prefix address and an optional route-map. For example [['10.0.0.0/16', 'routemap_LA'], + ['192.168.1.1', 'Chicago'], ['192.168.2.0/24'], ['192.168.3.0/24', 'routemap_NYC']]. + type: list + elements: list + next_hop_route_map: + description: + - Configure a route-map for valid nexthops. Valid values are a string defining + the name of the route-map. + type: str + redistribute: + description: + - A list of redistribute directives. Multiple redistribute entries are allowed. + The list must be in the form of a nested array. the first entry of each array + defines the source-protocol to redistribute from; the second entry defines a + route-map name. A route-map is highly advised but may be optional on some platforms, + in which case it may be omitted from the array list. For example [['direct', + 'rm_direct'], ['lisp', 'rm_lisp']]. + type: list + elements: list + suppress_inactive: + description: + - Advertises only active routes to peers. + type: bool + table_map: + description: + - Apply table-map to filter routes downloaded into URIB. Valid values are a string. + type: str + table_map_filter: + description: + - Filters routes rejected by the route-map and does not download them to the RIB. + type: bool + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str + retain_route_target: + description: + - Retains all of the routes or the routes which are part of configured route-map. + Valid values are route-map names or keyword C(all) or keyword C(default). C(all) + retains all the routes regardless of Target-VPN community. C(default) will disable + the retain route target option. If you are using route-map name please ensure + that the name is not same as C(all) and C(default). + type: str + version_added: 1.1.0 +""" +EXAMPLES = """ +# configure a simple address-family +- cisco.nxos.nxos_bgp_af: + asn: 65535 + vrf: TESTING + afi: ipv4 + safi: unicast + advertise_l2vpn_evpn: true + state: present + retain_route_target: all +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["router bgp 65535", "vrf TESTING", + "address-family ipv4 unicast", "advertise l2vpn evpn", + "retain route-target all"] +""" + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +BOOL_PARAMS = [ + "additional_paths_install", + "additional_paths_receive", + "additional_paths_send", + "advertise_l2vpn_evpn", + "dampening_state", + "default_information_originate", + "suppress_inactive", +] +PARAM_TO_DEFAULT_KEYMAP = { + "maximum_paths": "1", + "maximum_paths_ibgp": "1", + "client_to_client": True, + "distance_ebgp": "20", + "distance_ibgp": "200", + "distance_local": "220", + "dampen_igp_metric": "600", +} +PARAM_TO_COMMAND_KEYMAP = { + "asn": "router bgp", + "afi": "address-family", + "safi": "address-family", + "additional_paths_install": "additional-paths install backup", + "additional_paths_receive": "additional-paths receive", + "additional_paths_selection": "additional-paths selection route-map", + "additional_paths_send": "additional-paths send", + "advertise_l2vpn_evpn": "advertise l2vpn evpn", + "client_to_client": "client-to-client reflection", + "dampen_igp_metric": "dampen-igp-metric", + "dampening_state": "dampening", + "dampening_half_time": "dampening", + "dampening_max_suppress_time": "dampening", + "dampening_reuse_time": "dampening", + "dampening_routemap": "dampening route-map", + "dampening_suppress_time": "dampening", + "default_information_originate": "default-information originate", + "default_metric": "default-metric", + "distance_ebgp": "distance", + "distance_ibgp": "distance", + "distance_local": "distance", + "inject_map": "inject-map", + "maximum_paths": "maximum-paths", + "maximum_paths_ibgp": "maximum-paths ibgp", + "networks": "network", + "redistribute": "redistribute", + "next_hop_route_map": "nexthop route-map", + "suppress_inactive": "suppress-inactive", + "table_map": "table-map", + "table_map_filter": "table-map-filter", + "vrf": "vrf", + "retain_route_target": "retain route-target", +} +DAMPENING_PARAMS = [ + "dampening_half_time", + "dampening_suppress_time", + "dampening_reuse_time", + "dampening_max_suppress_time", +] + + +def get_value(arg, config, module): + command = PARAM_TO_COMMAND_KEYMAP[arg] + command_val_re = re.compile( + r"(?:{0}\s)(?P.*)$".format(command), re.M + ) + has_command_val = command_val_re.search(config) + + if arg in ["networks", "redistribute", "inject_map"]: + value = [] + for ele in command_val_re.findall(config): + tl = ele.split() + if "exist-map" in tl: + tl.remove("exist-map") + elif "route-map" in tl: + tl.remove("route-map") + value.append(tl) + + elif command == "distance": + distance_re = ( + r".*distance\s(?P\w+)\s(?P\w+)\s(?P\w+)" + ) + match_distance = re.match(distance_re, config, re.DOTALL) + + value = "" + if match_distance: + distance_group = match_distance.groupdict() + + if arg == "distance_ebgp": + value = distance_group["d_ebgp"] + elif arg == "distance_ibgp": + value = distance_group["d_ibgp"] + elif arg == "distance_local": + value = distance_group["d_local"] + + elif command.split()[0] == "dampening": + value = "" + if arg == "dampen_igp_metric" or arg == "dampening_routemap": + if command in config: + value = has_command_val.group("value") + else: + dampening_re = r".*dampening\s(?P\w+)\s(?P\w+)\s(?P\w+)\s(?P\w+)" + match_dampening = re.match(dampening_re, config, re.DOTALL) + if match_dampening: + dampening_group = match_dampening.groupdict() + + if arg == "dampening_half_time": + value = dampening_group["half"] + elif arg == "dampening_reuse_time": + value = dampening_group["reuse"] + elif arg == "dampening_suppress_time": + value = dampening_group["suppress"] + elif arg == "dampening_max_suppress_time": + value = dampening_group["max_suppress"] + else: + if arg == "dampening_state": + value = True if "dampening" in config else False + elif arg == "table_map_filter": + tmf_regex = re.compile(r"\s+table-map.*filter$", re.M) + value = False + if tmf_regex.search(config): + value = True + + elif arg == "table_map": + tm_regex = re.compile( + r"(?:table-map\s)(?P\S+)(\sfilter)?$", re.M + ) + has_tablemap = tm_regex.search(config) + value = "" + if has_tablemap: + value = has_tablemap.group("value") + + elif arg == "client_to_client": + no_command_re = re.compile(r"^\s+no\s{0}\s*$".format(command), re.M) + value = True + + if no_command_re.search(config): + value = False + + elif arg == "retain_route_target": + value = "" + if command in config: + route_target = has_command_val.group("value") + if route_target: + if route_target == "all": + value = "all" + elif "route-map" in route_target: + value = route_target.replace("route-map ", "") + + elif arg in BOOL_PARAMS: + command_re = re.compile(r"^\s+{0}\s*$".format(command), re.M) + value = False + + if command_re.search(config): + value = True + + else: + value = "" + + if has_command_val: + value = has_command_val.group("value") + + return value + + +def get_existing(module, args, warnings): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + + asn_regex = re.compile( + r".*router\sbgp\s(?P\d+(\.\d+)?).*", re.DOTALL + ) + match_asn = asn_regex.match(str(netcfg)) + + if match_asn: + existing_asn = match_asn.group("existing_asn") + parents = ["router bgp {0}".format(existing_asn)] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + parents.append( + "address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + ) + config = netcfg.get_section(parents) + + if config: + for arg in args: + if arg not in ["asn", "afi", "safi", "vrf"]: + gv = get_value(arg, config, module) + if gv: + existing[arg] = gv + else: + if ( + arg != "client_to_client" + and arg in PARAM_TO_DEFAULT_KEYMAP.keys() + ): + existing[arg] = PARAM_TO_DEFAULT_KEYMAP.get(arg) + else: + existing[arg] = gv + + existing["asn"] = existing_asn + existing["afi"] = module.params["afi"] + existing["safi"] = module.params["safi"] + existing["vrf"] = module.params["vrf"] + else: + warnings.append( + "The BGP process {0} didn't exist but the task just created it.".format( + module.params["asn"] + ) + ) + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = value + + return new_dict + + +def fix_proposed(module, proposed, existing): + commands = list() + command = "" + fixed_proposed = {} + for key, value in proposed.items(): + if key in DAMPENING_PARAMS: + if value != "default": + command = "dampening {0} {1} {2} {3}".format( + proposed.get("dampening_half_time"), + proposed.get("dampening_reuse_time"), + proposed.get("dampening_suppress_time"), + proposed.get("dampening_max_suppress_time"), + ) + else: + if existing.get(key): + command = "no dampening {0} {1} {2} {3}".format( + existing["dampening_half_time"], + existing["dampening_reuse_time"], + existing["dampening_suppress_time"], + existing["dampening_max_suppress_time"], + ) + if "default" in command: + command = "" + elif key.startswith("distance"): + command = "distance {0} {1} {2}".format( + proposed.get("distance_ebgp"), + proposed.get("distance_ibgp"), + proposed.get("distance_local"), + ) + else: + fixed_proposed[key] = value + + if command: + if command not in commands: + commands.append(command) + + return fixed_proposed, commands + + +def default_existing(existing_value, key, value): + commands = [] + if key == "network": + for network in existing_value: + if len(network) == 2: + commands.append( + "no network {0} route-map {1}".format( + network[0], network[1] + ) + ) + elif len(network) == 1: + commands.append("no network {0}".format(network[0])) + + elif key == "inject-map": + for maps in existing_value: + if len(maps) == 2: + commands.append( + "no inject-map {0} exist-map {1}".format(maps[0], maps[1]) + ) + elif len(maps) == 3: + commands.append( + "no inject-map {0} exist-map {1} " + "copy-attributes".format(maps[0], maps[1]) + ) + + elif key == "redistribute": + for maps in existing_value: + commands.append( + "no redistribute {0} route-map {1}".format(maps[0], maps[1]) + ) + + elif key == "retain route-target": + if existing_value == "all": + commands.append("no {0} {1}".format(key, existing_value)) + elif existing_value != "default": + commands.append("no {0} route-map {1}".format(key, existing_value)) + + else: + commands.append("no {0} {1}".format(key, existing_value)) + return commands + + +def get_network_command(existing, key, value): + commands = [] + existing_networks = existing.get("networks", []) + for inet in value: + if not isinstance(inet, list): + inet = [inet] + if inet not in existing_networks: + if len(inet) == 1: + command = "{0} {1}".format(key, inet[0]) + elif len(inet) == 2: + command = "{0} {1} route-map {2}".format(key, inet[0], inet[1]) + if command: + commands.append(command) + for enet in existing_networks: + if enet not in value: + if len(enet) == 1: + command = "no {0} {1}".format(key, enet[0]) + elif len(enet) == 2: + command = "no {0} {1} route-map {2}".format( + key, enet[0], enet[1] + ) + if command: + commands.append(command) + return commands + + +def get_inject_map_command(existing, key, value): + commands = [] + existing_maps = existing.get("inject_map", []) + for maps in value: + if not isinstance(maps, list): + maps = [maps] + if maps not in existing_maps: + if len(maps) == 2: + command = "inject-map {0} exist-map {1}".format( + maps[0], maps[1] + ) + elif len(maps) == 3: + command = ( + "inject-map {0} exist-map {1} " + "copy-attributes".format(maps[0], maps[1]) + ) + if command: + commands.append(command) + for emaps in existing_maps: + if emaps not in value: + if len(emaps) == 2: + command = "no inject-map {0} exist-map {1}".format( + emaps[0], emaps[1] + ) + elif len(emaps) == 3: + command = ( + "no inject-map {0} exist-map {1} " + "copy-attributes".format(emaps[0], emaps[1]) + ) + if command: + commands.append(command) + return commands + + +def get_redistribute_command(existing, key, value): + commands = [] + existing_rules = existing.get("redistribute", []) + for rule in value: + if not isinstance(rule, list): + rule = [rule] + if rule not in existing_rules: + command = "redistribute {0} route-map {1}".format(rule[0], rule[1]) + commands.append(command) + for erule in existing_rules: + if erule not in value: + command = "no redistribute {0} route-map {1}".format( + erule[0], erule[1] + ) + commands.append(command) + return commands + + +def get_table_map_command(module, existing, key, value): + commands = [] + if key == "table-map": + if value != "default": + command = "{0} {1}".format(key, module.params["table_map"]) + if ( + module.params["table_map_filter"] is not None + and module.params["table_map_filter"] != "default" + ): + command += " filter" + commands.append(command) + else: + if existing.get("table_map"): + command = "no {0} {1}".format(key, existing.get("table_map")) + commands.append(command) + return commands + + +def get_retain_route_target_command(existing, key, value): + commands = [] + if key == "retain route-target": + if value != "default": + if value == "all": + command = "{0} {1}".format(key, value) + else: + command = "{0} route-map {1}".format(key, value) + else: + existing_value = existing.get("retain_route_target") + if existing_value == "all": + command = "no {0} {1}".format(key, existing_value) + else: + command = "no {0} route-map {1}".format(key, existing_value) + commands.append(command) + return commands + + +def get_default_table_map_filter(existing): + commands = [] + existing_table_map_filter = existing.get("table_map_filter") + if existing_table_map_filter: + existing_table_map = existing.get("table_map") + if existing_table_map: + command = "table-map {0}".format(existing_table_map) + commands.append(command) + return commands + + +def state_present(module, existing, proposed, candidate): + fixed_proposed, commands = fix_proposed(module, proposed, existing) + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, fixed_proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + for key, value in proposed_commands.items(): + if key == "address-family": + addr_family_command = "address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + if addr_family_command not in commands: + commands.append(addr_family_command) + + elif key.startswith("table-map"): + table_map_commands = get_table_map_command( + module, existing, key, value + ) + if table_map_commands: + commands.extend(table_map_commands) + + elif value is True: + commands.append(key) + + elif value is False: + commands.append("no {0}".format(key)) + + elif value == "default": + if key in PARAM_TO_DEFAULT_KEYMAP: + commands.append( + "{0} {1}".format(key, PARAM_TO_DEFAULT_KEYMAP[key]) + ) + + elif existing_commands.get(key): + if key == "table-map-filter": + default_tmf_command = get_default_table_map_filter( + existing + ) + + if default_tmf_command: + commands.extend(default_tmf_command) + else: + existing_value = existing_commands.get(key) + default_command = default_existing( + existing_value, key, value + ) + if default_command: + commands.extend(default_command) + else: + if key == "network": + network_commands = get_network_command(existing, key, value) + if network_commands: + commands.extend(network_commands) + + elif key == "inject-map": + inject_map_commands = get_inject_map_command( + existing, key, value + ) + if inject_map_commands: + commands.extend(inject_map_commands) + + elif key == "redistribute": + redistribute_commands = get_redistribute_command( + existing, key, value + ) + if redistribute_commands: + commands.extend(redistribute_commands) + + elif key == "retain route-target": + retain_route_target_commands = get_retain_route_target_command( + existing, key, value + ) + if retain_route_target_commands: + commands.extend(retain_route_target_commands) + + else: + command = "{0} {1}".format(key, value) + commands.append(command) + + if commands: + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + addr_family_command = "address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + parents.append(addr_family_command) + if addr_family_command in commands: + commands.remove(addr_family_command) + candidate.add(commands, parents=parents) + + +def state_absent(module, candidate): + commands = [] + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + commands.append( + "no address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + ) + candidate.add(commands, parents=parents) + + +def main(): + argument_spec = dict( + asn=dict(required=True, type="str"), + vrf=dict(required=False, type="str", default="default"), + safi=dict( + required=True, type="str", choices=["unicast", "multicast", "evpn"] + ), + afi=dict( + required=True, + type="str", + choices=["ipv4", "ipv6", "vpnv4", "vpnv6", "l2vpn"], + ), + additional_paths_install=dict(required=False, type="bool"), + additional_paths_receive=dict(required=False, type="bool"), + additional_paths_selection=dict(required=False, type="str"), + additional_paths_send=dict(required=False, type="bool"), + advertise_l2vpn_evpn=dict(required=False, type="bool"), + client_to_client=dict(required=False, type="bool"), + dampen_igp_metric=dict(required=False, type="str"), + dampening_state=dict(required=False, type="bool"), + dampening_half_time=dict(required=False, type="str"), + dampening_max_suppress_time=dict(required=False, type="str"), + dampening_reuse_time=dict(required=False, type="str"), + dampening_routemap=dict(required=False, type="str"), + dampening_suppress_time=dict(required=False, type="str"), + default_information_originate=dict(required=False, type="bool"), + default_metric=dict(required=False, type="str"), + distance_ebgp=dict(required=False, type="str"), + distance_ibgp=dict(required=False, type="str"), + distance_local=dict(required=False, type="str"), + inject_map=dict(required=False, type="list", elements="list"), + maximum_paths=dict(required=False, type="str"), + maximum_paths_ibgp=dict(required=False, type="str"), + networks=dict(required=False, type="list", elements="list"), + next_hop_route_map=dict(required=False, type="str"), + redistribute=dict(required=False, type="list", elements="list"), + suppress_inactive=dict(required=False, type="bool"), + table_map=dict(required=False, type="str"), + table_map_filter=dict(required=False, type="bool"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + retain_route_target=dict(required=False, type="str"), + ) + + argument_spec.update(nxos_argument_spec) + + mutually_exclusive = [ + ("dampening_state", "dampening_routemap"), + ("dampening_state", "dampening_half_time"), + ("dampening_state", "dampening_suppress_time"), + ("dampening_state", "dampening_reuse_time"), + ("dampening_state", "dampening_max_suppress_time"), + ("dampening_routemap", "dampening_half_time"), + ("dampening_routemap", "dampening_suppress_time"), + ("dampening_routemap", "dampening_reuse_time"), + ("dampening_routemap", "dampening_max_suppress_time"), + ] + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + required_together=[ + DAMPENING_PARAMS, + ["distance_ibgp", "distance_ebgp", "distance_local"], + ], + supports_check_mode=True, + ) + + warnings = list() + result = dict(changed=False, warnings=warnings) + + state = module.params["state"] + + if module.params["advertise_l2vpn_evpn"]: + if module.params["vrf"] == "default": + module.fail_json( + msg="It is not possible to advertise L2VPN " + "EVPN in the default VRF. Please specify " + "another one.", + vrf=module.params["vrf"], + ) + + if module.params["table_map_filter"] and not module.params["table_map"]: + module.fail_json( + msg="table_map param is needed when using" + " table_map_filter filter." + ) + + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing = get_existing(module, args, warnings) + + if existing.get("asn") and state == "present": + if existing.get("asn") != module.params["asn"]: + module.fail_json( + msg="Another BGP ASN already exists.", + proposed_asn=module.params["asn"], + existing_asn=existing.get("asn"), + ) + + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + for arg in ["networks", "inject_map", "redistribute"]: + if proposed_args.get(arg): + if proposed_args[arg][0] == "default": + proposed_args[arg] = "default" + + proposed = {} + for key, value in proposed_args.items(): + if key not in ["asn", "vrf"]: + if str(value).lower() == "default": + value = PARAM_TO_DEFAULT_KEYMAP.get(key, "default") + if existing.get(key) != value: + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + elif state == "absent" and existing: + state_absent(module, candidate) + + if candidate: + candidate = candidate.items_text() + if not module.check_mode: + load_config(module, candidate) + result["changed"] = True + result["commands"] = candidate + else: + result["commands"] = [] + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_global.py new file mode 100644 index 00000000..fcb8fbbc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_global.py @@ -0,0 +1,1657 @@ +#!/usr/bin/python +# -*- 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) + +""" +The module file for nxos_bgp_global +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = """ +module: nxos_bgp_global +short_description: BGP Global resource module. +description: +- This module manages global BGP configuration on devices running Cisco NX-OS. +version_added: 1.4.0 +notes: +- Tested against NX-OS 9.3.6. +- This module works with connection C(network_cli) and C(httpapi). +author: Nilashish Chakraborty (@NilashishC) +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section '^router bgp'). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A list of BGP process configuration. + type: dict + suboptions: + as_number: + description: Autonomous System Number of the router. + type: str + affinity_group: + description: Configure an affinity group. + type: dict + suboptions: + group_id: + description: Affinity Group ID. + type: int + bestpath: &bestpath + description: Define the default bestpath selection algorithm. + type: dict + suboptions: + always_compare_med: + description: Compare MED on paths from different AS. + type: bool + as_path: + description: AS-Path. + type: dict + suboptions: + ignore: + description: Ignore AS-Path during bestpath selection. + type: bool + multipath_relax: + description: Relax AS-Path restriction when choosing multipaths. + type: bool + compare_neighborid: + description: When more paths are available than max path config, use neighborid as tie-breaker. + type: bool + compare_routerid: + description: Compare router-id for identical EBGP paths. + type: bool + cost_community_ignore: + description: Ignore cost communities in bestpath selection. + type: bool + igp_metric_ignore: + description: Ignore IGP metric for next-hop during bestpath selection. + type: bool + med: + description: MED + type: dict + suboptions: + confed: + description: Compare MED only from paths originated from within a confederation. + type: bool + missing_as_worst: + description: Treat missing MED as highest MED. + type: bool + non_deterministic: + description: Not always pick the best-MED path among paths from same AS. + type: bool + cluster_id: &cluster_id + description: Configure Route Reflector Cluster-ID. + type: str + confederation: &confederation + description: AS confederation parameters. + type: dict + suboptions: + identifier: + description: Set routing domain confederation AS. + type: str + peers: + description: Peer ASs in BGP confederation. + type: list + elements: str + disable_policy_batching: + description: Disable batching evaluation of outbound policy for a peer. + type: dict + suboptions: + set: + description: Set policy batching. + type: bool + ipv4: + description: IPv4 address-family settings. + type: dict + suboptions: + prefix_list: + description: Name of prefix-list to apply. + type: str + ipv6: + description: IPv6 address-family settings. + type: dict + suboptions: + prefix_list: + description: Name of prefix-list to apply. + type: str + nexthop: + description: Batching based on nexthop. + type: bool + dynamic_med_interval: + description: Sets the interval for dampening of med changes. + type: int + enforce_first_as: + description: Enforce neighbor AS is the first AS in AS-PATH attribute (EBGP). + type: bool + enhanced_error: + description: Enable BGP Enhanced error handling. + type: bool + fabric_soo: + description: Fabric site of origin. + type: str + fast_external_fallover: + description: Immediately reset the session if the link to a directly connected BGP peer goes down. + type: bool + flush_routes: + description: Flush routes in RIB upon controlled restart. + type: bool + graceful_restart: &graceful_restart + description: Configure Graceful Restart functionality. + type: dict + suboptions: + set: + description: Enable graceful-restart. + type: bool + restart_time: + description: Maximum time for restart advertised to peers. + type: int + stalepath_time: + description: Maximum time to keep a restarting peer's stale routes. + type: int + helper: + description: Configure Graceful Restart Helper mode functionality. + type: bool + graceful_shutdown: + description: Graceful-shutdown for BGP protocol. + type: dict + suboptions: + activate: + description: Send graceful-shutdown community on all routes. + type: dict + suboptions: + set: + description: Activiate graceful-shutdown. + type: bool + route_map: + description: Apply route-map to modify attributes for outbound. + type: str + aware: + description: Lower preference of routes carrying graceful-shutdown community. + type: bool + isolate: + description: Isolate this router from BGP perspective. + type: dict + suboptions: + set: + description: Withdraw remote BGP routes to isolate this router. + type: bool + include_local: + description: Withdraw both local and remote BGP routes. + type: bool + log_neighbor_changes: &log_nbr + description: Log a message for neighbor up/down event. + type: bool + maxas_limit: &maxas_limit + description: Allow AS-PATH attribute from EBGP neighbor imposing a limit on number of ASes. + type: int + neighbors: &nbr + description: Configure BGP neighbors. + type: list + elements: dict + suboptions: + neighbor_address: + description: IP address/Prefix of the neighbor or interface. + type: str + required: True + neighbor_affinity_group: + description: Configure an affinity group. + type: dict + suboptions: + group_id: + description: Affinity Group ID. + type: int + bmp_activate_server: + description: Specify server ID for activating BMP monitoring for the peer. + type: int + capability: + description: Capability. + type: dict + suboptions: + suppress_4_byte_as: + description: Suppress 4-byte AS Capability. + type: bool + description: + description: Neighbor specific descripion. + type: str + disable_connected_check: + description: Disable check for directly connected peer. + type: bool + dont_capability_negotiate: + description: Don't negotiate capability with this neighbor. + type: bool + dscp: + description: Set dscp value for tcp transport. + type: str + dynamic_capability: + description: Dynamic Capability + type: bool + ebgp_multihop: + description: Specify multihop TTL for remote peer. + type: int + graceful_shutdown: + description: Graceful-shutdown for this neighbor. + type: dict + suboptions: + activate: + description: Send graceful-shutdown community. + type: dict + suboptions: + set: + description: Set activate. + type: bool + route_map: + description: Apply route-map to modify attributes for outbound. + type: str + inherit: + description: Inherit a template. + type: dict + suboptions: + peer: + description: Peer template to inherit. + type: str + peer_session: + description: Peer-session template to inherit. + type: str + local_as: + description: Specify the local-as number for the eBGP neighbor. + type: str + log_neighbor_changes: + description: Log message for neighbor up/down event. + type: dict + suboptions: + set: + description: + - Set log-neighbor-changes. + type: bool + disable: + description: + - Disable logging of neighbor up/down event. + type: bool + low_memory: + description: Behaviour in low memory situations. + type: dict + suboptions: + exempt: + description: Do not shutdown this peer when under memory pressure. + type: bool + password: + description: Configure a password for neighbor. + type: dict + suboptions: + encryption: + description: + - 0 specifies an UNENCRYPTED neighbor password. + - 3 specifies an 3DES ENCRYPTED neighbor password will follow. + - 7 specifies a Cisco type 7 ENCRYPTED neighbor password will follow. + type: int + key: + description: Authentication password. + type: str + path_attribute: + description: BGP path attribute optional filtering. + type: list + elements: dict + suboptions: + action: + description: Action. + type: str + choices: ["discard", "treat-as-withdraw"] + type: + description: Path attribute type + type: int + range: + description: Path attribute range. + type: dict + suboptions: + start: + description: Path attribute range start value. + type: int + end: + description: Path attribute range end value. + type: int + peer_type: + description: Neighbor facing + type: str + choices: ["fabric-border-leaf", "fabric-external"] + remote_as: + description: Specify Autonomous System Number of the neighbor. + type: str + remove_private_as: + description: Remove private AS number from outbound updates. + type: dict + suboptions: + set: + description: Remove private AS. + type: bool + replace_as: + description: Replace. + type: bool + all: + description: All. + type: bool + shutdown: + description: Administratively shutdown this neighbor. + type: bool + timers: + description: Configure keepalive and hold timers. + type: dict + suboptions: + keepalive: + description: Keepalive interval (seconds). + type: int + holdtime: + description: Holdtime (seconds). + type: int + transport: + description: BGP transport connection. + type: dict + suboptions: + connection_mode: + description: Specify type of connection. + type: dict + suboptions: + passive: + description: Allow passive connection setup only. + type: bool + ttl_security: + description: Enable TTL Security Mechanism. + type: dict + suboptions: + hops: + description: Specify hop count for remote peer. + type: int + update_source: + description: Specify source of BGP session and updates. + type: str + neighbor_down: &nbr_down + description: Handle BGP neighbor down event, due to various reasons. + type: dict + suboptions: + fib_accelerate: + description: Accelerate the hardware updates for IP/IPv6 adjacencies for neighbor. + type: bool + nexthop: + description: Nexthop resolution options. + type: dict + suboptions: + suppress_default_resolution: + description: Prohibit use of default route for nexthop address resolution. + type: bool + rd: + description: Secondary Route Distinguisher for vxlan multisite border gateway. + type: dict + suboptions: + dual: + description: Generate Secondary RD for all VRFs and L2VNIs. + type: bool + id: + description: Specify 2 byte value for ID. + type: int + reconnect_interval: &reconn_intv + description: Configure connection reconnect interval. + type: int + router_id: &rtr_id + description: Specify the IP address to use as router-id. + type: str + shutdown: &shtdwn + description: Administratively shutdown BGP protocol. + type: bool + suppress_fib_pending: &suppr + description: Advertise only routes that are programmed in hardware to peers. + type: bool + timers: &timers + description: Configure bgp related timers. + type: dict + suboptions: + bestpath_limit: + description: Configure timeout for first bestpath after restart. + type: dict + suboptions: + timeout: + description: Bestpath timeout (seconds). + type: int + always: + description: Configure update-delay-always option. + type: bool + bgp: + description: Configure different bgp keepalive and holdtimes. + type: dict + suboptions: + keepalive: + description: Keepalive interval (seconds). + type: int + holdtime: + description: Holdtime (seconds). + type: int + prefix_peer_timeout: + description: Prefix Peer timeout (seconds). + type: int + prefix_peer_wait: + description: Configure wait timer for a prefix peer. + type: int + vrfs: + description: Virtual Router Context configurations. + type: list + elements: dict + suboptions: + vrf: + description: VRF name. + type: str + allocate_index: + description: Configure allocate-index. + type: int + bestpath: *bestpath + cluster_id: *cluster_id + confederation: *confederation + graceful_restart: *graceful_restart + local_as: + description: Specify the local-as for this vrf. + type: str + log_neighbor_changes: *log_nbr + maxas_limit: *maxas_limit + neighbors: *nbr + neighbor_down: *nbr_down + reconnect_interval: *reconn_intv + router_id: *rtr_id + timers: *timers + state: + description: + - The state the configuration should be left in. + - State I(purged) removes all the BGP configurations from the + target device. Use caution with this state. + - State I(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 I(deleted) and I(replaced) will result in an error if there + are address-family configuration lines present under a neighbor, + or a vrf context that is to be removed. Please use the + M(cisco.nxos.nxos_bgp_af) or M(cisco.nxos.nxos_bgp_neighbor_af) + modules for prior cleanup. + - Refer to examples for more details. + type: str + choices: + - merged + - replaced + - deleted + - purged + - parsed + - gathered + - rendered + default: merged +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# Nexus9000v# + +- name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_bgp_global: + config: + as_number: 65563 + router_id: 192.168.1.1 + bestpath: + as_path: + multipath_relax: True + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65040 + log_neighbor_changes: True + maxas_limit: 20 + neighbors: + - neighbor_address: 192.168.1.100 + neighbor_affinity_group: + group_id: 160 + bmp_activate_server: 1 + remote_as: 65563 + description: NBR-1 + low_memory: + exempt: True + - neighbor_address: 192.168.1.101 + remote_as: 65563 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-1 + allocate_index: 5000 + local_as: 200 + log_neighbor_changes: True + neighbors: + - neighbor_address: 198.51.100.1 + description: site-1-nbr-1 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: 65562 + - neighbor_address: 198.51.100.2 + remote_as: 65562 + description: site-1-nbr-2 + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + description: site-2-nbr-1 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: 65568 + neighbor_down: + fib_accelerate: True + +# Task output +# ------------- +# before: {} +# +# commands: +# - router bgp 65563 +# - bestpath as-path multipath-relax +# - bestpath compare-neighborid +# - bestpath cost-community ignore +# - confederation identifier 42 +# - log-neighbor-changes +# - maxas-limit 20 +# - neighbor-down fib-accelerate +# - router-id 192.168.1.1 +# - confederation peers 65020 65030 65040 +# - neighbor 192.168.1.100 +# - remote-as 65563 +# - affinity-group 160 +# - bmp-activate-server 1 +# - description NBR-1 +# - low-memory exempt +# - neighbor 192.168.1.101 +# - remote-as 65563 +# - password 7 12090404011C03162E +# - vrf site-1 +# - allocate-index 5000 +# - local-as 200 +# - log-neighbor-changes +# - neighbor 198.51.100.1 +# - remote-as 65562 +# - description site-1-nbr-1 +# - password 3 13D4D3549493D2877B1DC116EE27A6BE +# - neighbor 198.51.100.2 +# - remote-as 65562 +# - description site-1-nbr-2 +# - vrf site-2 +# - local-as 300 +# - log-neighbor-changes +# - neighbor-down fib-accelerate +# - neighbor 203.0.113.2 +# - remote-as 65568 +# - description site-2-nbr-1 +# - password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 +# +# after: +# as_number: '65563' +# bestpath: +# as_path: +# multipath_relax: true +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65040' +# log_neighbor_changes: true +# maxas_limit: 20 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# - neighbor_address: 192.168.1.101 +# password: +# encryption: 7 +# key: 12090404011C03162E +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - allocate_index: 5000 +# local_as: '200' +# log_neighbor_changes: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 198.51.100.1 +# password: +# encryption: 3 +# key: 13D4D3549493D2877B1DC116EE27A6BE +# remote_as: '65562' +# - description: site-1-nbr-2 +# neighbor_address: 198.51.100.2 +# remote_as: '65562' +# vrf: site-1 +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - description: site-2-nbr-1 +# neighbor_address: 203.0.113.2 +# password: +# encryption: 3 +# key: AF92F4C16A0A0EC5BDF56CF58BC030F6 +# remote_as: '65568' +# vrf: site-2 + + +# After state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65040 +# bestpath as-path multipath-relax +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 20 +# log-neighbor-changes +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# neighbor 192.168.1.101 +# remote-as 65563 +# password 7 12090404011C03162E +# vrf site-1 +# local-as 200 +# log-neighbor-changes +# allocate-index 5000 +# neighbor 198.51.100.1 +# remote-as 65562 +# description site-1-nbr-1 +# password 3 13D4D3549493D2877B1DC116EE27A6BE +# neighbor 198.51.100.2 +# remote-as 65562 +# description site-1-nbr-2 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# remote-as 65568 +# description site-2-nbr-1 +# password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + +# Using replaced + +# Before state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65040 +# bestpath as-path multipath-relax +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 20 +# log-neighbor-changes +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# neighbor 192.168.1.101 +# remote-as 65563 +# password 7 12090404011C03162E +# vrf site-1 +# local-as 200 +# log-neighbor-changes +# allocate-index 5000 +# neighbor 198.51.100.1 +# remote-as 65562 +# description site-1-nbr-1 +# password 3 13D4D3549493D2877B1DC116EE27A6BE +# neighbor 198.51.100.2 +# remote-as 65562 +# description site-1-nbr-2 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# remote-as 65568 +# description site-2-nbr-1 +# password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + +- name: Replace BGP configuration with provided configuration + cisco.nxos.nxos_bgp_global: + config: + as_number: 65563 + router_id: 192.168.1.1 + bestpath: + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65050 + maxas_limit: 40 + neighbors: + - neighbor_address: 192.168.1.100 + neighbor_affinity_group: + group_id: 160 + bmp_activate_server: 1 + remote_as: 65563 + description: NBR-1 + low_memory: + exempt: True + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + state: replaced + +# Task output +# ------------- +# before: +# as_number: '65563' +# bestpath: +# as_path: +# multipath_relax: true +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65040' +# log_neighbor_changes: true +# maxas_limit: 20 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# - neighbor_address: 192.168.1.101 +# password: +# encryption: 7 +# key: 12090404011C03162E +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - allocate_index: 5000 +# local_as: '200' +# log_neighbor_changes: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 198.51.100.1 +# password: +# encryption: 3 +# key: 13D4D3549493D2877B1DC116EE27A6BE +# remote_as: '65562' +# - description: site-1-nbr-2 +# neighbor_address: 198.51.100.2 +# remote_as: '65562' +# vrf: site-1 +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - description: site-2-nbr-1 +# neighbor_address: 203.0.113.2 +# password: +# encryption: 3 +# key: AF92F4C16A0A0EC5BDF56CF58BC030F6 +# remote_as: '65568' +# vrf: site-2 +# +# commands: +# - router bgp 65563 +# - no bestpath as-path multipath-relax +# - no log-neighbor-changes +# - maxas-limit 40 +# - no confederation peers 65020 65030 65040 +# - confederation peers 65020 65030 65050 +# - no neighbor 192.168.1.101 +# - vrf site-2 +# - neighbor 203.0.113.2 +# - no remote-as 65568 +# - no description site-2-nbr-1 +# - password 7 12090404011C03162E +# - no vrf site-1 + +# after: +# as_number: '65563' +# bestpath: +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65050' +# maxas_limit: 40 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - neighbor_address: 203.0.113.2 +# password: +# encryption: 7 +# key: 12090404011C03162E +# vrf: site-2 +# +# After state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65050 +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 40 +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# password 7 12090404011C03162E + +# Using deleted + +# Before state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65040 +# bestpath as-path multipath-relax +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 20 +# log-neighbor-changes +# address-family ipv4 unicast +# default-metric 400 +# suppress-inactive +# default-information originate +# address-family ipv6 multicast +# wait-igp-convergence +# redistribute eigrp eigrp-1 route-map site-1-rmap +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# neighbor 192.168.1.101 +# remote-as 65563 +# password 7 12090404011C03162E +# vrf site-1 +# local-as 200 +# log-neighbor-changes +# allocate-index 5000 +# address-family ipv4 multicast +# maximum-paths 40 +# dampen-igp-metric 1200 +# neighbor 198.51.100.1 +# remote-as 65562 +# description site-1-nbr-1 +# password 3 13D4D3549493D2877B1DC116EE27A6BE +# neighbor 198.51.100.2 +# remote-as 65562 +# description site-1-nbr-2 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# remote-as 65568 +# description site-1-nbr-1 +# password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + +- name: Delete BGP configurations handled by this module + cisco.nxos.nxos_bgp_global: + state: deleted + +# Task output +# ------------- + +# before: +# as_number: '65563' +# bestpath: +# as_path: +# multipath_relax: true +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65040' +# log_neighbor_changes: true +# maxas_limit: 20 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# - neighbor_address: 192.168.1.101 +# password: +# encryption: 7 +# key: 12090404011C03162E +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - allocate_index: 5000 +# local_as: '200' +# log_neighbor_changes: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 198.51.100.1 +# password: +# encryption: 3 +# key: 13D4D3549493D2877B1DC116EE27A6BE +# remote_as: '65562' +# - description: site-1-nbr-2 +# neighbor_address: 198.51.100.2 +# remote_as: '65562' +# vrf: site-1 +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 203.0.113.2 +# password: +# encryption: 3 +# key: AF92F4C16A0A0EC5BDF56CF58BC030F6 +# remote_as: '65568' +# vrf: site-2 +# +# commands: +# - router bgp 65563 +# - no bestpath as-path multipath-relax +# - no bestpath compare-neighborid +# - no bestpath cost-community ignore +# - no confederation identifier 42 +# - no log-neighbor-changes +# - no maxas-limit 20 +# - no neighbor-down fib-accelerate +# - no router-id 192.168.1.1 +# - no confederation peers 65020 65030 65040 +# - no neighbor 192.168.1.100 +# - no neighbor 192.168.1.101 +# - no vrf site-1 +# - no vrf site-2 +# +# after: +# as_number: '65563' +# +# After state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# address-family ipv4 unicast +# default-metric 400 +# suppress-inactive +# default-information originate +# address-family ipv6 multicast +# wait-igp-convergence +# redistribute eigrp eigrp-1 route-map site-1-rmap +# + +# Using purged + +# Before state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65040 +# bestpath as-path multipath-relax +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 20 +# log-neighbor-changes +# address-family ipv4 unicast +# default-metric 400 +# suppress-inactive +# default-information originate +# address-family ipv6 multicast +# wait-igp-convergence +# redistribute eigrp eigrp-1 route-map site-1-rmap +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# neighbor 192.168.1.101 +# remote-as 65563 +# password 7 12090404011C03162E +# vrf site-1 +# local-as 200 +# log-neighbor-changes +# allocate-index 5000 +# address-family ipv4 multicast +# maximum-paths 40 +# dampen-igp-metric 1200 +# neighbor 198.51.100.1 +# remote-as 65562 +# description site-1-nbr-1 +# password 3 13D4D3549493D2877B1DC116EE27A6BE +# neighbor 198.51.100.2 +# remote-as 65562 +# description site-1-nbr-2 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# remote-as 65568 +# description site-1-nbr-1 +# password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + +- name: Purge all BGP configurations from the device + cisco.nxos.nxos_bgp_global: + state: purged + +# Task output +# ------------- + +# before: +# as_number: '65563' +# bestpath: +# as_path: +# multipath_relax: true +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65040' +# log_neighbor_changes: true +# maxas_limit: 20 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# - neighbor_address: 192.168.1.101 +# password: +# encryption: 7 +# key: 12090404011C03162E +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - allocate_index: 5000 +# local_as: '200' +# log_neighbor_changes: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 198.51.100.1 +# password: +# encryption: 3 +# key: 13D4D3549493D2877B1DC116EE27A6BE +# remote_as: '65562' +# - description: site-1-nbr-2 +# neighbor_address: 198.51.100.2 +# remote_as: '65562' +# vrf: site-1 +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 203.0.113.2 +# password: +# encryption: 3 +# key: AF92F4C16A0A0EC5BDF56CF58BC030F6 +# remote_as: '65568' +# vrf: site-2 +# +# commands: +# - no router bgp 65563 +# +# after: {} +# +# After state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# Nexus9000v# + +# Using rendered + +- name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65563 + router_id: 192.168.1.1 + bestpath: + as_path: + multipath_relax: True + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65040 + log_neighbor_changes: True + maxas_limit: 20 + neighbors: + - neighbor_address: 192.168.1.100 + neighbor_affinity_group: + group_id: 160 + bmp_activate_server: 1 + remote_as: 65563 + description: NBR-1 + low_memory: + exempt: True + - neighbor_address: 192.168.1.101 + remote_as: 65563 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-1 + allocate_index: 5000 + local_as: 200 + log_neighbor_changes: True + neighbors: + - neighbor_address: 198.51.100.1 + description: site-1-nbr-1 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: 65562 + - neighbor_address: 198.51.100.2 + remote_as: 65562 + description: site-1-nbr-2 + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + description: site-1-nbr-1 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: 65568 + neighbor_down: + fib_accelerate: True + +# Task Output (redacted) +# ----------------------- +# rendered: +# - router bgp 65563 +# - bestpath as-path multipath-relax +# - bestpath compare-neighborid +# - bestpath cost-community ignore +# - confederation identifier 42 +# - log-neighbor-changes +# - maxas-limit 20 +# - neighbor-down fib-accelerate +# - router-id 192.168.1.1 +# - confederation peers 65020 65030 65040 +# - neighbor 192.168.1.100 +# - remote-as 65563 +# - affinity-group 160 +# - bmp-activate-server 1 +# - description NBR-1 +# - low-memory exempt +# - neighbor 192.168.1.101 +# - remote-as 65563 +# - password 7 12090404011C03162E +# - vrf site-1 +# - allocate-index 5000 +# - local-as 200 +# - log-neighbor-changes +# - neighbor 198.51.100.1 +# - remote-as 65562 +# - description site-1-nbr-1 +# - password 3 13D4D3549493D2877B1DC116EE27A6BE +# - neighbor 198.51.100.2 +# - remote-as 65562 +# - description site-1-nbr-2 +# - vrf site-2 +# - local-as 300 +# - log-neighbor-changes +# - neighbor-down fib-accelerate +# - neighbor 203.0.113.2 +# - remote-as 65568 +# - description site-1-nbr-1 +# - password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + +# Using parsed + +# parsed.cfg +# ------------ +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65040 +# bestpath as-path multipath-relax +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 20 +# log-neighbor-changes +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# neighbor 192.168.1.101 +# remote-as 65563 +# password 7 12090404011C03162E +# vrf site-1 +# local-as 200 +# log-neighbor-changes +# allocate-index 5000 +# neighbor 198.51.100.1 +# remote-as 65562 +# description site-1-nbr-1 +# password 3 13D4D3549493D2877B1DC116EE27A6BE +# neighbor 198.51.100.2 +# remote-as 65562 +# description site-1-nbr-2 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# remote-as 65568 +# description site-1-nbr-1 +# password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + +- name: Parse externally provided BGP config + cisco.nxos.nxos_bgp_global: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# parsed: +# as_number: '65563' +# bestpath: +# as_path: +# multipath_relax: true +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65040' +# log_neighbor_changes: true +# maxas_limit: 20 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# - neighbor_address: 192.168.1.101 +# password: +# encryption: 7 +# key: 12090404011C03162E +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - allocate_index: 5000 +# local_as: '200' +# log_neighbor_changes: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 198.51.100.1 +# password: +# encryption: 3 +# key: 13D4D3549493D2877B1DC116EE27A6BE +# remote_as: '65562' +# - description: site-1-nbr-2 +# neighbor_address: 198.51.100.2 +# remote_as: '65562' +# vrf: site-1 +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - description: site-1-nbr-1 +# neighbor_address: 203.0.113.2 +# password: +# encryption: 3 +# key: AF92F4C16A0A0EC5BDF56CF58BC030F6 +# remote_as: '65568' +# vrf: site-2 + +# Using gathered + +# existing config +# +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65563 +# router-id 192.168.1.1 +# confederation identifier 42 +# confederation peers 65020 65030 65050 +# bestpath cost-community ignore +# bestpath compare-neighborid +# neighbor-down fib-accelerate +# maxas-limit 40 +# neighbor 192.168.1.100 +# low-memory exempt +# bmp-activate-server 1 +# remote-as 65563 +# description NBR-1 +# affinity-group 160 +# vrf site-1 +# vrf site-2 +# local-as 300 +# neighbor-down fib-accelerate +# log-neighbor-changes +# neighbor 203.0.113.2 +# password 7 12090404011C03162E + +- name: Gather BGP facts using gathered + cisco.nxos.nxos_bgp_global: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# as_number: '65563' +# bestpath: +# compare_neighborid: true +# cost_community_ignore: true +# confederation: +# identifier: '42' +# peers: +# - '65020' +# - '65030' +# - '65050' +# maxas_limit: 40 +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - bmp_activate_server: 1 +# description: NBR-1 +# low_memory: +# exempt: true +# neighbor_address: 192.168.1.100 +# neighbor_affinity_group: +# group_id: 160 +# remote_as: '65563' +# router_id: 192.168.1.1 +# vrfs: +# - vrf: site-1 +# - local_as: '300' +# log_neighbor_changes: true +# neighbor_down: +# fib_accelerate: true +# neighbors: +# - neighbor_address: 203.0.113.2 +# password: +# encryption: 7 +# key: 12090404011C03162E +# vrf: site-2 + +# Remove a neighbor having AF configurations with state replaced (will fail) + +# Before state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65536 +# log-neighbor-changes +# maxas-limit 20 +# router-id 198.51.100.2 +# neighbor 203.0.113.2 +# address-family ipv4 unicast +# next-hop-self +# remote-as 65538 +# affinity-group 160 +# description NBR-1 +# low-memory exempt +# neighbor 192.0.2.1 +# remote-as 65537 +# password 7 12090404011C03162E + +- name: Remove a neighbor having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + state: replaced + +# Task output (redacted) +# ----------------------- +# fatal: [Nexus9000v]: FAILED! => changed=false +# msg: Neighbor 203.0.113.2 has address-family configurations. +# Please use the nxos_bgp_neighbor_af module to remove those first. + +# Remove a VRF having AF configurations with state replaced (will fail) + +# Before state: +# ------------- +# Nexus9000v# show running-config | section "^router bgp" +# router bgp 65536 +# log-neighbor-changes +# maxas-limit 20 +# router-id 198.51.100.2 +# neighbor 192.0.2.1 +# remote-as 65537 +# password 7 12090404011C03162E +# vrf site-1 +# address-family ipv4 unicast +# default-information originate +# neighbor 203.0.113.2 +# remote-as 65538 +# affinity-group 160 +# description NBR-1 +# low-memory exempt +# vrf site-2 +# neighbor-down fib-accelerate + +- name: Remove a VRF having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + vrfs: + - vrf: site-2 + neighbor_down: + fib_accelerate: True + state: replaced + +# Task output (redacted) +# ----------------------- +# fatal: [Nexus9000v]: FAILED! => changed=false +# msg: VRF site-1 has address-family configurations. +# Please use the nxos_bgp_af module to remove those first. +""" + +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: + - router bgp 65563 + - maxas-limit 20 + - router-id 192.168.1.1 + - confederation peers 65020 65030 65040 + - neighbor 192.168.1.100 + - remote-as 65563 + - affinity-group 160 + - bmp-activate-server 1 + - description NBR-1 + - low-memory exempt + - vrf site-1 + - log-neighbor-changes + - neighbor 198.51.100.1 + - remote-as 65562 + - description site-1-nbr-1 + - password 3 13D4D3549493D2877B1DC116EE27A6BE +""" +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.bgp_global.bgp_global import ( + Bgp_globalArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.bgp_global.bgp_global import ( + Bgp_global, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=Bgp_globalArgs.argument_spec, + mutually_exclusive=[["config", "running_config"]], + required_if=[ + ["state", "merged", ["config"]], + ["state", "replaced", ["config"]], + ["state", "rendered", ["config"]], + ["state", "parsed", ["running_config"]], + ], + supports_check_mode=True, + ) + + result = Bgp_global(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor.py new file mode 100644 index 00000000..0b22c916 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor.py @@ -0,0 +1,588 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_bgp_neighbor +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2023-01-27) Manages BGP neighbors configurations. +description: +- Manages BGP neighbors configurations on NX-OS switches. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +deprecated: + alternative: nxos_bgp_global + why: Updated module released with more functionality. + removed_at_date: '2023-01-27' +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the whole BGP neighbor configuration. +- Default, where supported, restores params default value. +options: + asn: + description: + - BGP autonomous system number. Valid values are string, Integer in ASPLAIN or + ASDOT notation. + required: true + type: str + vrf: + description: + - Name of the VRF. The name 'default' is a valid VRF representing the global bgp. + default: default + type: str + neighbor: + description: + - Neighbor Identifier. Valid values are string. Neighbors may use IPv4 or IPv6 + notation, with or without prefix length. + required: true + type: str + description: + description: + - Description of the neighbor. + type: str + bfd: + description: + - Enables/Disables BFD for a given neighbor. + - "Dependency: ''feature bfd''" + type: str + choices: + - enable + - disable + connected_check: + description: + - Configure whether or not to check for directly connected peer. + type: bool + capability_negotiation: + description: + - Configure whether or not to negotiate capability with this neighbor. + type: bool + dynamic_capability: + description: + - Configure whether or not to enable dynamic capability. + type: bool + ebgp_multihop: + description: + - Specify multihop TTL for a remote peer. Valid values are integers between 2 + and 255, or keyword 'default' to disable this property. + type: str + local_as: + description: + - Specify the local-as number for the eBGP neighbor. Valid values are String or + Integer in ASPLAIN or ASDOT notation, or 'default', which means not to configure + it. + type: str + log_neighbor_changes: + description: + - Specify whether or not to enable log messages for neighbor up/down event. + choices: + - enable + - disable + - inherit + type: str + low_memory_exempt: + description: + - Specify whether or not to shut down this neighbor under memory pressure. + type: bool + maximum_peers: + description: + - Specify Maximum number of peers for this neighbor prefix Valid values are between + 1 and 1000, or 'default', which does not impose the limit. Note that this parameter + is accepted only on neighbors with address/prefix. + type: str + pwd: + description: + - Specify the password for neighbor. Valid value is string. + type: str + pwd_type: + description: + - Specify the encryption type the password will use. Valid values are '3des' or + 'cisco_type_7' encryption or keyword 'default'. + choices: + - 3des + - cisco_type_7 + - default + type: str + remote_as: + description: + - Specify Autonomous System Number of the neighbor. Valid values are String or + Integer in ASPLAIN or ASDOT notation, or 'default', which means not to configure + it. + type: str + remove_private_as: + description: + - Specify the config to remove private AS number from outbound updates. Valid + values are 'enable' to enable this config, 'disable' to disable this config, + 'all' to remove all private AS number, or 'replace-as', to replace the private + AS number. + choices: + - enable + - disable + - all + - replace-as + type: str + shutdown: + description: + - Configure to administratively shutdown this neighbor. + type: bool + suppress_4_byte_as: + description: + - Configure to suppress 4-byte AS Capability. + type: bool + timers_keepalive: + description: + - Specify keepalive timer value. Valid values are integers between 0 and 3600 + in terms of seconds, or 'default', which is 60. + type: str + timers_holdtime: + description: + - Specify holdtime timer value. Valid values are integers between 0 and 3600 in + terms of seconds, or 'default', which is 180. + type: str + transport_passive_only: + description: + - Specify whether or not to only allow passive connection setup. Valid values + are 'true', 'false', and 'default', which defaults to 'false'. This property + can only be configured when the neighbor is in 'ip' address format without prefix + length. + type: bool + update_source: + description: + - Specify source interface of BGP session and updates. + type: str + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str + peer_type: + description: + - Specify the peer type for BGP session. + choices: + - fabric_border_leaf + - fabric_external + - disable + type: str + version_added: 1.1.0 +""" +EXAMPLES = """ +# create a new neighbor +- cisco.nxos.nxos_bgp_neighbor: + asn: 65535 + neighbor: 192.0.2.3 + local_as: 20 + remote_as: 30 + bfd: enable + description: just a description + update_source: Ethernet1/3 + state: present + peer_type: fabric_external +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["router bgp 65535", "neighbor 192.0.2.3", + "remote-as 30", "update-source Ethernet1/3", + "description just a description", "local-as 20", "peer-type fabric-external"] +""" + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +BOOL_PARAMS = [ + "capability_negotiation", + "shutdown", + "connected_check", + "dynamic_capability", + "low_memory_exempt", + "suppress_4_byte_as", + "transport_passive_only", +] +PARAM_TO_COMMAND_KEYMAP = { + "asn": "router bgp", + "bfd": "bfd", + "capability_negotiation": "dont-capability-negotiate", + "connected_check": "disable-connected-check", + "description": "description", + "dynamic_capability": "dynamic-capability", + "ebgp_multihop": "ebgp-multihop", + "local_as": "local-as", + "log_neighbor_changes": "log-neighbor-changes", + "low_memory_exempt": "low-memory exempt", + "maximum_peers": "maximum-peers", + "neighbor": "neighbor", + "pwd": "password", + "pwd_type": "password", + "remote_as": "remote-as", + "remove_private_as": "remove-private-as", + "shutdown": "shutdown", + "suppress_4_byte_as": "capability suppress 4-byte-as", + "timers_keepalive": "timers", + "timers_holdtime": "timers", + "transport_passive_only": "transport connection-mode passive", + "update_source": "update-source", + "vrf": "vrf", + "peer_type": "peer-type", +} +PARAM_TO_DEFAULT_KEYMAP = { + "bfd": "disable", + "shutdown": False, + "dynamic_capability": True, + "timers_keepalive": 60, + "timers_holdtime": 180, + "peer_type": "disable", +} + + +def get_value(arg, config): + command = PARAM_TO_COMMAND_KEYMAP[arg] + has_command = re.search(r"^\s+{0}$".format(command), config, re.M) + has_command_val = re.search( + r"(?:\s+{0}\s*)(?P.*)$".format(command), config, re.M + ) + + if arg == "dynamic_capability": + has_no_command = re.search( + r"\s+no\s{0}\s*$".format(command), config, re.M + ) + value = True + if has_no_command: + value = False + elif arg in BOOL_PARAMS: + value = False + if has_command: + value = True + elif arg == "log_neighbor_changes": + value = "" + if has_command: + value = "enable" + elif has_command_val: + value = "disable" + + elif arg == "remove_private_as": + value = "disable" + if has_command: + value = "enable" + elif has_command_val: + value = has_command_val.group("value") + elif arg == "bfd": + value = "enable" if has_command else "disable" + + elif arg == "peer_type": + value = "disable" + if has_command_val: + value = has_command_val.group("value").replace("-", "_") + else: + value = "" + + if has_command_val: + value = has_command_val.group("value") + + if command in ["timers", "password"]: + split_value = value.split() + value = "" + + if arg in ["timers_keepalive", "pwd_type"]: + value = split_value[0] + elif ( + arg in ["timers_holdtime", "pwd"] and len(split_value) == 2 + ): + value = split_value[1] + + return value + + +def get_existing(module, args, warnings): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + + asn_regex = re.compile( + r".*router\sbgp\s(?P\d+(\.\d+)?).*", re.S + ) + match_asn = asn_regex.match(str(netcfg)) + + if match_asn: + existing_asn = match_asn.group("existing_asn") + parents = ["router bgp {0}".format(existing_asn)] + + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + parents.append("neighbor {0}".format(module.params["neighbor"])) + config = netcfg.get_section(parents) + if config: + for arg in args: + if arg not in ["asn", "vrf", "neighbor"]: + existing[arg] = get_value(arg, config) + + existing["asn"] = existing_asn + existing["neighbor"] = module.params["neighbor"] + existing["vrf"] = module.params["vrf"] + else: + warnings.append( + "The BGP process didn't exist but the task" " just created it." + ) + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key in table: + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = table.get(key) + + return new_dict + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, value in proposed_commands.items(): + if value is True: + commands.append(key) + elif value is False: + commands.append("no {0}".format(key)) + elif value == "default": + if existing_commands.get(key): + if key == "password": + commands.append("no password") + else: + existing_value = existing_commands.get(key) + commands.append("no {0} {1}".format(key, existing_value)) + else: + if key == "log-neighbor-changes": + if value == "enable": + commands.append("{0}".format(key)) + elif value == "disable": + commands.append("{0} {1}".format(key, value)) + elif value == "inherit": + if existing_commands.get(key): + commands.append("no {0}".format(key)) + elif key == "password": + pwd_type = module.params["pwd_type"] + if pwd_type == "3des": + pwd_type = 3 + else: + pwd_type = 7 + command = "{0} {1} {2}".format(key, pwd_type, value) + if command not in commands: + commands.append(command) + elif key == "remove-private-as": + if value == "enable": + command = "{0}".format(key) + commands.append(command) + elif value == "disable": + if existing_commands.get(key) != "disable": + command = "no {0}".format(key) + commands.append(command) + else: + command = "{0} {1}".format(key, value) + commands.append(command) + elif key == "timers": + if proposed["timers_keepalive"] != PARAM_TO_DEFAULT_KEYMAP.get( + "timers_keepalive" + ) or proposed[ + "timers_holdtime" + ] != PARAM_TO_DEFAULT_KEYMAP.get( + "timers_holdtime" + ): + command = "timers {0} {1}".format( + proposed["timers_keepalive"], + proposed["timers_holdtime"], + ) + if command not in commands: + commands.append(command) + elif key == "bfd": + no_cmd = "no " if value == "disable" else "" + commands.append(no_cmd + key) + elif key == "peer-type": + if value == "disable": + if existing_commands.get(key) != "disable": + command = "no {0}".format(key) + commands.append(command) + elif value == "fabric_external": + ptype = "fabric-external" + command = "{0} {1}".format(key, ptype) + commands.append(command) + elif value == "fabric_border_leaf": + ptype = "fabric-border-leaf" + command = "{0} {1}".format(key, ptype) + commands.append(command) + else: + command = "{0} {1}".format(key, value) + commands.append(command) + + if commands: + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + parents.append("neighbor {0}".format(module.params["neighbor"])) + + # make sure that local-as is the last command in the list. + local_as_command = "local-as {0}".format(module.params["local_as"]) + if local_as_command in commands: + commands.remove(local_as_command) + commands.append(local_as_command) + candidate.add(commands, parents=parents) + + +def state_absent(module, existing, proposed, candidate): + commands = [] + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + commands.append("no neighbor {0}".format(module.params["neighbor"])) + candidate.add(commands, parents=parents) + + +def main(): + argument_spec = dict( + asn=dict(required=True, type="str"), + vrf=dict(required=False, type="str", default="default"), + neighbor=dict(required=True, type="str"), + description=dict(required=False, type="str"), + bfd=dict(required=False, type="str", choices=["enable", "disable"]), + capability_negotiation=dict(required=False, type="bool"), + connected_check=dict(required=False, type="bool"), + dynamic_capability=dict(required=False, type="bool"), + ebgp_multihop=dict(required=False, type="str"), + local_as=dict(required=False, type="str"), + log_neighbor_changes=dict( + required=False, + type="str", + choices=["enable", "disable", "inherit"], + ), + low_memory_exempt=dict(required=False, type="bool"), + maximum_peers=dict(required=False, type="str"), + pwd=dict(required=False, type="str"), + pwd_type=dict( + required=False, + type="str", + choices=["3des", "cisco_type_7", "default"], + ), + remote_as=dict(required=False, type="str"), + remove_private_as=dict( + required=False, + type="str", + choices=["enable", "disable", "all", "replace-as"], + ), + shutdown=dict(required=False, type="bool"), + suppress_4_byte_as=dict(required=False, type="bool"), + timers_keepalive=dict(required=False, type="str"), + timers_holdtime=dict(required=False, type="str"), + transport_passive_only=dict(required=False, type="bool"), + update_source=dict(required=False, type="str"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + peer_type=dict( + required=False, + type="str", + choices=["disable", "fabric_border_leaf", "fabric_external"], + ), + ) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + required_together=[ + ["timers_holdtime", "timers_keepalive"], + ["pwd", "pwd_type"], + ], + supports_check_mode=True, + ) + + warnings = list() + result = dict(changed=False, warnings=warnings) + + state = module.params["state"] + + if module.params["pwd_type"] == "default": + module.params["pwd_type"] = "0" + + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing = get_existing(module, args, warnings) + + if existing.get("asn") and state == "present": + if existing["asn"] != module.params["asn"]: + module.fail_json( + msg="Another BGP ASN already exists.", + proposed_asn=module.params["asn"], + existing_asn=existing.get("asn"), + ) + + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + proposed = {} + for key, value in proposed_args.items(): + if key not in ["asn", "vrf", "neighbor", "pwd_type"]: + if str(value).lower() == "default": + value = PARAM_TO_DEFAULT_KEYMAP.get(key, "default") + if key == "bfd": + if existing.get("bfd", "disable") != value: + proposed[key] = value + elif existing.get(key) != value: + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + elif state == "absent" and existing: + state_absent(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + if not module.check_mode: + load_config(module, candidate) + result["changed"] = True + result["commands"] = candidate + else: + result["commands"] = [] + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor_af.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor_af.py new file mode 100644 index 00000000..b5e633b5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_bgp_neighbor_af.py @@ -0,0 +1,815 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_bgp_neighbor_af +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages BGP address-family's neighbors configuration. +description: +- Manages BGP address-family's neighbors configurations on NX-OS switches. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the whole BGP address-family's neighbor configuration. +- Default, when supported, removes properties +- In order to default maximum-prefix configuration, only C(max_prefix_limit=default) + is needed. +options: + asn: + description: + - BGP autonomous system number. Valid values are String, Integer in ASPLAIN or + ASDOT notation. + required: true + type: str + vrf: + description: + - Name of the VRF. The name 'default' is a valid VRF representing the global bgp. + default: default + type: str + neighbor: + description: + - Neighbor Identifier. Valid values are string. Neighbors may use IPv4 or IPv6 + notation, with or without prefix length. + required: true + type: str + afi: + description: + - Address Family Identifier. + required: true + choices: + - ipv4 + - ipv6 + - vpnv4 + - vpnv6 + - l2vpn + type: str + safi: + description: + - Sub Address Family Identifier. + required: true + choices: + - unicast + - multicast + - evpn + type: str + additional_paths_receive: + description: + - Valid values are enable for basic command enablement; disable for disabling + the command at the neighbor af level (it adds the disable keyword to the basic + command); and inherit to remove the command at this level (the command value + is inherited from a higher BGP layer). + choices: + - enable + - disable + - inherit + type: str + additional_paths_send: + description: + - Valid values are enable for basic command enablement; disable for disabling + the command at the neighbor af level (it adds the disable keyword to the basic + command); and inherit to remove the command at this level (the command value + is inherited from a higher BGP layer). + choices: + - enable + - disable + - inherit + type: str + advertise_map_exist: + description: + - Conditional route advertisement. This property requires two route maps, an advertise-map + and an exist-map. Valid values are an array specifying both the advertise-map + name and the exist-map name, or simply 'default' e.g. ['my_advertise_map', 'my_exist_map']. + This command is mutually exclusive with the advertise_map_non_exist property. + type: list + elements: str + advertise_map_non_exist: + description: + - Conditional route advertisement. This property requires two route maps, an advertise-map + and an exist-map. Valid values are an array specifying both the advertise-map + name and the non-exist-map name, or simply 'default' e.g. ['my_advertise_map', + 'my_non_exist_map']. This command is mutually exclusive with the advertise_map_exist + property. + type: list + elements: str + allowas_in: + description: + - Activate allowas-in property + type: bool + allowas_in_max: + description: + - Max-occurrences value for allowas_in. Valid values are an integer value or 'default'. + This is mutually exclusive with allowas_in. + type: str + as_override: + description: + - Activate the as-override feature. + type: bool + default_originate: + description: + - Activate the default-originate feature. + type: bool + default_originate_route_map: + description: + - Route-map for the default_originate property. Valid values are a string defining + a route-map name, or 'default'. This is mutually exclusive with default_originate. + type: str + disable_peer_as_check: + description: + - Disable checking of peer AS-number while advertising + type: bool + filter_list_in: + description: + - Valid values are a string defining a filter-list name, or 'default'. + type: str + filter_list_out: + description: + - Valid values are a string defining a filter-list name, or 'default'. + type: str + max_prefix_limit: + description: + - maximum-prefix limit value. Valid values are an integer value or 'default'. + type: str + max_prefix_interval: + description: + - Optional restart interval. Valid values are an integer. Requires max_prefix_limit. + May not be combined with max_prefix_warning. + type: str + max_prefix_threshold: + description: + - Optional threshold percentage at which to generate a warning. Valid values are + an integer value. Requires max_prefix_limit. + type: str + max_prefix_warning: + description: + - Optional warning-only keyword. Requires max_prefix_limit. May not be combined + with max_prefix_interval. + type: bool + next_hop_self: + description: + - Activate the next-hop-self feature. + type: bool + next_hop_third_party: + description: + - Activate the next-hop-third-party feature. + type: bool + prefix_list_in: + description: + - Valid values are a string defining a prefix-list name, or 'default'. + type: str + prefix_list_out: + description: + - Valid values are a string defining a prefix-list name, or 'default'. + type: str + route_map_in: + description: + - Valid values are a string defining a route-map name, or 'default'. + type: str + route_map_out: + description: + - Valid values are a string defining a route-map name, or 'default'. + type: str + route_reflector_client: + description: + - Router reflector client. + type: bool + send_community: + description: + - send-community attribute. + choices: + - none + - both + - extended + - standard + - default + type: str + soft_reconfiguration_in: + description: + - Valid values are 'enable' for basic command enablement; 'always' to add the + always keyword to the basic command; and 'inherit' to remove the command at + this level (the command value is inherited from a higher BGP layer). + choices: + - enable + - always + - inherit + type: str + soo: + description: + - Site-of-origin. Valid values are a string defining a VPN extcommunity or 'default'. + type: str + suppress_inactive: + description: + - suppress-inactive feature. + type: bool + unsuppress_map: + description: + - unsuppress-map. Valid values are a string defining a route-map name or 'default'. + type: str + weight: + description: + - Weight value. Valid values are an integer value or 'default'. + type: str + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str + rewrite_evpn_rt_asn: + description: + - Auto generate route targets for EBGP neighbor. + type: bool + version_added: 1.1.0 +""" +EXAMPLES = """ +- name: configure RR client + cisco.nxos.nxos_bgp_neighbor_af: + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + route_reflector_client: true + state: present + rewrite_evpn_rt_asn: true +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["router bgp 65535", "neighbor 192.0.2.3", + "address-family ipv4 unicast", "route-reflector-client", + "rewrite-evpn-rt-asn"] +""" + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +BOOL_PARAMS = [ + "allowas_in", + "as_override", + "default_originate", + "disable_peer_as_check", + "next_hop_self", + "next_hop_third_party", + "route_reflector_client", + "suppress_inactive", + "rewrite_evpn_rt_asn", +] +PARAM_TO_COMMAND_KEYMAP = { + "afi": "address-family", + "asn": "router bgp", + "neighbor": "neighbor", + "additional_paths_receive": "capability additional-paths receive", + "additional_paths_send": "capability additional-paths send", + "advertise_map_exist": "advertise-map exist-map", + "advertise_map_non_exist": "advertise-map non-exist-map", + "allowas_in": "allowas-in", + "allowas_in_max": "allowas-in", + "as_override": "as-override", + "default_originate": "default-originate", + "default_originate_route_map": "default-originate route-map", + "disable_peer_as_check": "disable-peer-as-check", + "filter_list_in": "filter-list in", + "filter_list_out": "filter-list out", + "max_prefix_limit": "maximum-prefix", + "max_prefix_interval": "maximum-prefix interval", + "max_prefix_threshold": "maximum-prefix threshold", + "max_prefix_warning": "maximum-prefix warning", + "next_hop_self": "next-hop-self", + "next_hop_third_party": "next-hop-third-party", + "prefix_list_in": "prefix-list in", + "prefix_list_out": "prefix-list out", + "route_map_in": "route-map in", + "route_map_out": "route-map out", + "route_reflector_client": "route-reflector-client", + "safi": "address-family", + "send_community": "send-community", + "soft_reconfiguration_in": "soft-reconfiguration inbound", + "soo": "soo", + "suppress_inactive": "suppress-inactive", + "unsuppress_map": "unsuppress-map", + "weight": "weight", + "vrf": "vrf", + "rewrite_evpn_rt_asn": "rewrite-evpn-rt-asn", +} + + +def get_value(arg, config, module): + custom = [ + "additional_paths_send", + "additional_paths_receive", + "max_prefix_limit", + "max_prefix_interval", + "max_prefix_threshold", + "max_prefix_warning", + "send_community", + "soft_reconfiguration_in", + ] + command = PARAM_TO_COMMAND_KEYMAP[arg] + has_command = re.search(r"^\s+{0}\s*".format(command), config, re.M) + has_command_val = re.search( + r"(?:{0}\s)(?P.*)$".format(command), config, re.M + ) + value = "" + + if arg in custom: + value = get_custom_value(arg, config, module) + + elif arg == "next_hop_third_party": + has_no_command = re.search( + r"^\s+no\s+{0}\s*$".format(command), config, re.M + ) + value = False + if not has_no_command: + value = True + + elif arg in BOOL_PARAMS: + value = False + if has_command: + value = True + + elif command.startswith("advertise-map"): + value = [] + has_adv_map = re.search( + r"{0}\s(?P.*)\s{1}\s(?P.*)$".format( + *command.split() + ), + config, + re.M, + ) + if has_adv_map: + value = list(has_adv_map.groups()) + + elif command.split()[0] in ["filter-list", "prefix-list", "route-map"]: + has_cmd_direction_val = re.search( + r"{0}\s(?P.*)\s{1}$".format(*command.split()), config, re.M + ) + if has_cmd_direction_val: + value = has_cmd_direction_val.group("value") + + elif has_command_val: + value = has_command_val.group("value") + + return value + + +def get_custom_value(arg, config, module): + command = PARAM_TO_COMMAND_KEYMAP.get(arg) + splitted_config = config.splitlines() + value = "" + + if arg.startswith("additional_paths"): + value = "inherit" + for line in splitted_config: + if command in line: + if "disable" in line: + value = "disable" + else: + value = "enable" + elif arg.startswith("max_prefix"): + for line in splitted_config: + if "maximum-prefix" in line: + splitted_line = line.split() + if arg == "max_prefix_limit": + value = splitted_line[1] + elif arg == "max_prefix_interval" and "restart" in line: + value = splitted_line[-1] + elif arg == "max_prefix_threshold" and len(splitted_line) > 2: + try: + int(splitted_line[2]) + value = splitted_line[2] + except ValueError: + value = "" + elif arg == "max_prefix_warning": + value = "warning-only" in line + elif arg == "soft_reconfiguration_in": + value = "inherit" + for line in splitted_config: + if command in line: + if "always" in line: + value = "always" + else: + value = "enable" + + elif arg == "send_community": + value = "none" + for line in splitted_config: + if command in line: + if "extended" in line: + if value == "standard": + value = "both" + else: + value = "extended" + elif "both" in line: + value = "both" + else: + value = "standard" + + return value + + +def get_existing(module, args, warnings): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + + asn_regex = re.compile( + r".*router\sbgp\s(?P\d+(\.\d+)?).*", re.S + ) + match_asn = asn_regex.match(str(netcfg)) + + if match_asn: + existing_asn = match_asn.group("existing_asn") + parents = ["router bgp {0}".format(existing_asn)] + + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + parents.append("neighbor {0}".format(module.params["neighbor"])) + parents.append( + "address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + ) + config = netcfg.get_section(parents) + + if config: + for arg in args: + if arg not in ["asn", "vrf", "neighbor", "afi", "safi"]: + existing[arg] = get_value(arg, config, module) + + existing["asn"] = existing_asn + existing["neighbor"] = module.params["neighbor"] + existing["vrf"] = module.params["vrf"] + existing["afi"] = module.params["afi"] + existing["safi"] = module.params["safi"] + else: + warnings.append( + "The BGP process didn't exist but the task just created it." + ) + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key in table: + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = table.get(key) + + return new_dict + + +def get_default_command(key, value, existing_commands): + command = "" + if existing_commands.get(key): + existing_value = existing_commands.get(key) + if value == "inherit": + if existing_value != "inherit": + command = "no {0}".format(key) + else: + if key == "advertise-map exist-map": + command = "no advertise-map {0} exist-map {1}".format( + existing_value[0], existing_value[1] + ) + elif key == "advertise-map non-exist-map": + command = "no advertise-map {0} non-exist-map {1}".format( + existing_value[0], existing_value[1] + ) + elif key == "filter-list in": + command = "no filter-list {0} in".format(existing_value) + elif key == "filter-list out": + command = "no filter-list {0} out".format(existing_value) + elif key == "prefix-list in": + command = "no prefix-list {0} in".format(existing_value) + elif key == "prefix-list out": + command = "no prefix-list {0} out".format(existing_value) + elif key == "route-map in": + command = "no route-map {0} in".format(existing_value) + elif key == "route-map out": + command = "no route-map {0} out".format(existing_value) + elif key.startswith("maximum-prefix"): + command = "no maximum-prefix" + elif key == "allowas-in max": + command = ["no allowas-in {0}".format(existing_value)] + command.append("allowas-in") + else: + command = "no {0} {1}".format(key, existing_value) + else: + if key.replace(" ", "_").replace("-", "_") in BOOL_PARAMS: + command = "no {0}".format(key) + return command + + +def fix_proposed(module, existing, proposed): + allowas_in = proposed.get("allowas_in") + allowas_in_max = proposed.get("allowas_in_max") + + if allowas_in_max and not allowas_in: + proposed.pop("allowas_in_max") + elif allowas_in and allowas_in_max: + proposed.pop("allowas_in") + + if ( + existing.get("send_community") == "none" + and proposed.get("send_community") == "default" + ): + proposed.pop("send_community") + return proposed + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed = fix_proposed(module, existing, proposed) + + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + for key, value in proposed_commands.items(): + if value in ["inherit", "default"]: + command = get_default_command(key, value, existing_commands) + + if isinstance(command, str): + if command and command not in commands: + commands.append(command) + elif isinstance(command, list): + for cmd in command: + if cmd not in commands: + commands.append(cmd) + + elif key.startswith("maximum-prefix"): + if module.params["max_prefix_limit"] != "default": + command = "maximum-prefix {0}".format( + module.params["max_prefix_limit"] + ) + if module.params["max_prefix_threshold"]: + command += " {0}".format( + module.params["max_prefix_threshold"] + ) + if module.params["max_prefix_interval"]: + command += " restart {0}".format( + module.params["max_prefix_interval"] + ) + elif module.params["max_prefix_warning"]: + command += " warning-only" + commands.append(command) + + elif value is True: + commands.append(key) + elif value is False: + commands.append("no {0}".format(key)) + elif key == "address-family": + commands.append( + "address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + ) + elif key.startswith("capability additional-paths"): + command = key + if value == "disable": + command += " disable" + commands.append(command) + elif key.startswith("advertise-map"): + direction = key.split()[1] + commands.append( + "advertise-map {1} {0} {2}".format(direction, *value) + ) + elif key.split()[0] in ["filter-list", "prefix-list", "route-map"]: + commands.append("{1} {0} {2}".format(value, *key.split())) + + elif key == "soft-reconfiguration inbound": + command = "" + if value == "enable": + command = key + elif value == "always": + command = "{0} {1}".format(key, value) + commands.append(command) + elif key == "send-community": + command = key + if value in ["standard", "extended"]: + commands.append("no " + key + " both") + command += " {0}".format(value) + commands.append(command) + else: + command = "{0} {1}".format(key, value) + commands.append(command) + + if commands: + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + parents.append("neighbor {0}".format(module.params["neighbor"])) + + af_command = "address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + parents.append(af_command) + if af_command in commands: + commands.remove(af_command) + candidate.add(commands, parents=parents) + + +def state_absent(module, existing, candidate): + commands = [] + parents = ["router bgp {0}".format(module.params["asn"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + parents.append("neighbor {0}".format(module.params["neighbor"])) + commands.append( + "no address-family {0} {1}".format( + module.params["afi"], module.params["safi"] + ) + ) + candidate.add(commands, parents=parents) + + +def main(): + argument_spec = dict( + asn=dict(required=True, type="str"), + vrf=dict(required=False, type="str", default="default"), + neighbor=dict(required=True, type="str"), + afi=dict( + required=True, + type="str", + choices=["ipv4", "ipv6", "vpnv4", "vpnv6", "l2vpn"], + ), + safi=dict( + required=True, type="str", choices=["unicast", "multicast", "evpn"] + ), + additional_paths_receive=dict( + required=False, + type="str", + choices=["enable", "disable", "inherit"], + ), + additional_paths_send=dict( + required=False, + type="str", + choices=["enable", "disable", "inherit"], + ), + advertise_map_exist=dict(required=False, type="list", elements="str"), + advertise_map_non_exist=dict( + required=False, type="list", elements="str" + ), + allowas_in=dict(required=False, type="bool"), + allowas_in_max=dict(required=False, type="str"), + as_override=dict(required=False, type="bool"), + default_originate=dict(required=False, type="bool"), + default_originate_route_map=dict(required=False, type="str"), + disable_peer_as_check=dict(required=False, type="bool"), + filter_list_in=dict(required=False, type="str"), + filter_list_out=dict(required=False, type="str"), + max_prefix_limit=dict(required=False, type="str"), + max_prefix_interval=dict(required=False, type="str"), + max_prefix_threshold=dict(required=False, type="str"), + max_prefix_warning=dict(required=False, type="bool"), + next_hop_self=dict(required=False, type="bool"), + next_hop_third_party=dict(required=False, type="bool"), + prefix_list_in=dict(required=False, type="str"), + prefix_list_out=dict(required=False, type="str"), + route_map_in=dict(required=False, type="str"), + route_map_out=dict(required=False, type="str"), + route_reflector_client=dict(required=False, type="bool"), + send_community=dict( + required=False, + choices=["none", "both", "extended", "standard", "default"], + ), + soft_reconfiguration_in=dict( + required=False, type="str", choices=["enable", "always", "inherit"] + ), + soo=dict(required=False, type="str"), + suppress_inactive=dict(required=False, type="bool"), + unsuppress_map=dict(required=False, type="str"), + weight=dict(required=False, type="str"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + rewrite_evpn_rt_asn=dict(required=False, type="bool"), + ) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[ + ["advertise_map_exist", "advertise_map_non_exist"], + ["max_prefix_interval", "max_prefix_warning"], + ["default_originate", "default_originate_route_map"], + ["allowas_in", "allowas_in_max"], + ], + supports_check_mode=True, + ) + + warnings = list() + result = dict(changed=False, warnings=warnings) + + state = module.params["state"] + for key in [ + "max_prefix_interval", + "max_prefix_warning", + "max_prefix_threshold", + ]: + if module.params[key] and not module.params["max_prefix_limit"]: + module.fail_json( + msg="max_prefix_limit is required when using %s" % key + ) + if module.params["vrf"] == "default" and module.params["soo"]: + module.fail_json(msg="SOO is only allowed in non-default VRF") + + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing = get_existing(module, args, warnings) + + if existing.get("asn") and state == "present": + if existing.get("asn") != module.params["asn"]: + module.fail_json( + msg="Another BGP ASN already exists.", + proposed_asn=module.params["asn"], + existing_asn=existing.get("asn"), + ) + + for param in ["advertise_map_exist", "advertise_map_non_exist"]: + if module.params[param] == ["default"]: + module.params[param] = "default" + + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + proposed = {} + for key, value in proposed_args.items(): + if key not in ["asn", "vrf", "neighbor"]: + if not isinstance(value, list): + if str(value).lower() == "true": + value = True + elif str(value).lower() == "false": + value = False + elif str(value).lower() == "default": + if key in BOOL_PARAMS: + value = False + else: + value = "default" + elif key == "send_community" and str(value).lower() == "none": + value = "default" + if existing.get(key) != value: + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + elif state == "absent" and existing: + state_absent(module, existing, candidate) + + if candidate: + candidate = candidate.items_text() + if not module.check_mode: + responses = load_config(module, candidate) + if responses: + for resp in responses: + if resp: + if resp.endswith("is valid only for EBGP peers"): + module.fail_json(msg=resp) + result["changed"] = True + result["commands"] = candidate + else: + result["commands"] = [] + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_command.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_command.py new file mode 100644 index 00000000..c90133f5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_command.py @@ -0,0 +1,235 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 = """ +module: nxos_command +extends_documentation_fragment: +- cisco.nxos.nxos +author: Peter Sprygada (@privateip) +short_description: Run arbitrary command on Cisco NXOS devices +description: +- Sends an arbitrary command to an NXOS 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. +version_added: 1.0.0 +options: + commands: + description: + - The commands to send to the remote NXOS device. The resulting output from the + command is returned. If the I(wait_for) argument is provided, the module is + not returned until the condition is satisfied or the number of retires as expired. + - The I(commands) argument also accepts an alternative form that allows for complex + values that specify the command to run and the output format to return. This + can be done on a command by command basis. The complex argument supports the + keywords C(command) and C(output) where C(command) is the command to run and + C(output) is one of 'text' or 'json'. + - If a command sent to the device requires answering a prompt, it is possible to pass + a dict containing command, answer and prompt. Common answers are 'y' or "\\r" + (carriage return, must be double quotes). See examples. + required: true + type: list + elements: raw + wait_for: + description: + - 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. See examples. + aliases: + - waitfor + type: list + elements: str + match: + description: + - The I(match) argument is used in conjunction with the I(wait_for) argument to + specify the match policy. Valid values are C(all) or C(any). If the value + is set to C(all) then all conditionals in the I(wait_for) must be satisfied. If + the value is set to C(any) then only one of the values must be satisfied. + default: all + choices: ['any', 'all'] + type: str + retries: + description: + - Specifies the number of retries a command should by tried before it is considered + failed. The command is run on the target device every retry and evaluated against + the I(wait_for) conditionals. + default: 10 + type: int + interval: + description: + - 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. + default: 1 + type: int +""" + +EXAMPLES = """ +- name: run show version on remote devices + cisco.nxos.nxos_command: + commands: show version + +- name: run show version and check to see if output contains Cisco + cisco.nxos.nxos_command: + commands: show version + wait_for: result[0] contains Cisco + +- name: run multiple commands on remote nodes + cisco.nxos.nxos_command: + commands: + - show version + - show interfaces + +- name: run multiple commands and evaluate the output + cisco.nxos.nxos_command: + commands: + - show version + - show interfaces + wait_for: + - result[0] contains Cisco + - result[1] contains loopback0 + +- name: run commands and specify the output format + cisco.nxos.nxos_command: + commands: + - command: show version + output: json + +- name: run commands that require answering a prompt + cisco.nxos.nxos_command: + commands: + - configure terminal + - command: no feature npv + prompt: Do you want to continue + answer: y + +""" + +RETURN = """ +stdout: + description: The set of responses from the commands + returned: always apart from low level errors (such as action plugin) + type: list + sample: ['...', '...'] +stdout_lines: + description: The value of stdout split into a list + returned: always apart from low level errors (such as action plugin) + type: list + sample: [['...', '...'], ['...'], ['...']] +failed_conditions: + description: The list of conditionals that have failed + returned: failed + type: list + sample: ['...', '...'] +""" +import time + +from ansible.module_utils._text import to_text +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.parsing import ( + Conditional, + FailedConditionalError, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + transform_commands, + to_lines, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + run_commands, +) + + +def parse_commands(module, warnings): + commands = transform_commands(module) + + if module.check_mode: + for item in list(commands): + if not item["command"].startswith("show"): + warnings.append( + "Only show commands are supported when using check mode, not " + "executing %s" % item["command"] + ) + commands.remove(item) + + return commands + + +def to_cli(obj): + cmd = obj["command"] + if obj.get("output") == "json": + cmd += " | json" + return cmd + + +def main(): + """entry point for module execution + """ + argument_spec = dict( + # { command: , output: , prompt: , response: } + commands=dict(type="list", required=True, elements="raw"), + wait_for=dict(type="list", aliases=["waitfor"], elements="str"), + match=dict(default="all", choices=["any", "all"]), + retries=dict(default=10, type="int"), + interval=dict(default=1, type="int"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + result = {"changed": False, "warnings": warnings} + commands = parse_commands(module, warnings) + wait_for = module.params["wait_for"] or list() + + try: + conditionals = [Conditional(c) for c in wait_for] + except AttributeError as exc: + module.fail_json(msg=to_text(exc)) + + retries = module.params["retries"] + interval = module.params["interval"] + match = module.params["match"] + + while retries > 0: + responses = run_commands(module, commands) + + for item in list(conditionals): + try: + if item(responses): + if match == "any": + conditionals = list() + break + conditionals.remove(item) + except FailedConditionalError as exc: + module.fail_json(msg=to_text(exc)) + + if not conditionals: + break + + time.sleep(interval) + retries -= 1 + + if conditionals: + failed_conditions = [item.raw for item in conditionals] + msg = "One or more conditional statements have not been satisfied" + module.fail_json(msg=msg, failed_conditions=failed_conditions) + + result.update( + {"stdout": responses, "stdout_lines": list(to_lines(responses))} + ) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_config.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_config.py new file mode 100644 index 00000000..586ebeec --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_config.py @@ -0,0 +1,598 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_config +extends_documentation_fragment: +- cisco.nxos.nxos +author: Peter Sprygada (@privateip) +short_description: Manage Cisco NXOS configuration sections +description: +- Cisco NXOS configurations use a simple block indent file syntax for segmenting configuration + into sections. This module provides an implementation for working with NXOS configuration + sections in a deterministic way. This module works with either CLI or NXAPI transports. +version_added: 1.0.0 +options: + lines: + description: + - 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 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. + type: list + aliases: + - commands + elements: str + parents: + description: + - 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. + type: list + elements: str + src: + description: + - The I(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 I(lines) and I(parents) + arguments. The configuration lines in the source file should be similar to how it + will appear if present in the running-configuration of the device including indentation + to ensure idempotency and correct diff. + type: path + replace_src: + description: + - The I(replace_src) argument provides path to the configuration file to load + into the remote system. This argument is used to replace the entire config with + a flat-file. This is used with argument I(replace) with value I(config). This + is mutually exclusive with the I(lines) and I(src) arguments. This argument + will only work for NX-OS versions that support `config replace`. Use I(nxos_file_copy) + module to copy the flat file to remote device and then use the path with this argument. + The configuration lines in the file 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. + type: str + before: + description: + - 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. + type: list + elements: str + after: + description: + - The ordered set of commands to append to the end of the command stack if a change + needs to be made. Just like with I(before) this allows the playbook designer + to append a set of commands to be executed after the command set. + type: list + elements: str + match: + description: + - 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 I(line), commands are + matched line by line. If match is set to I(strict), command lines are matched + with respect to position. If match is set to I(exact), command lines must be + an equal match. Finally, if match is set to I(none), the module will not attempt + to compare the source configuration with the running configuration on the remote + device. + default: line + choices: + - line + - strict + - exact + - none + type: str + replace: + description: + - Instructs the module on the way to perform the configuration on the device. If + the replace argument is set to I(line) then the modified lines are pushed to + the device in configuration mode. If the replace argument is set to I(block) + then the entire command block is pushed to the device in configuration mode + if any line is not correct. replace I(config) will only work for NX-OS versions + that support `config replace`. + default: line + choices: + - line + - block + - config + type: str + backup: + description: + - This argument will cause the module to create a full backup of the current C(running-config) + from the remote device before any changes are made. If the C(backup_options) + value is not given, the backup file is written to the C(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. + type: bool + default: no + running_config: + description: + - 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 I(running_config) argument allows the implementer + to pass in the configuration to use as the base config for comparison. + 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 + type: str + defaults: + description: + - The I(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 + type: bool + default: no + save_when: + description: + - 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 I(always), then the running-config will + always be copied to the startup-config and the I(modified) flag will always + be set to True. If the argument is set to I(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 I(never), the running-config will + never be copied to the startup-config. If the argument is set to I(changed), + then the running-config will only be copied to the startup-config if the task + has made a change. I(changed) was added in Ansible 2.6. + default: never + choices: + - always + - never + - modified + - changed + type: str + diff_against: + description: + - When using the C(ansible-playbook --diff) command line argument the module can + generate diffs against different sources. + - When this option is configure as I(startup), the module will return the diff + of the running-config against the startup-config. + - When this option is configured as I(intended), the module will return the diff + of the running-config against the configuration provided in the C(intended_config) + argument. + - When this option is configured as I(running), the module will return the before + and after diff of the running-config with respect to any changes made to the + device configuration. + choices: + - startup + - intended + - running + type: str + diff_ignore_lines: + description: + - 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. + type: list + elements: str + intended_config: + description: + - The C(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 C(diff_against) value and set + it to I(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. + type: str + backup_options: + description: + - This is a dict object containing configurable options related to backup file + path. The value of this option is read only when C(backup) is set to I(True), + if C(backup) is set to I(false) this option will be silently ignored. + suboptions: + filename: + description: + - 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 _config.@ + type: str + dir_path: + description: + - 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 created and the filename is either the value of C(filename) or default + filename as described in C(filename) options description. If the path value + is not given in that case a I(backup) directory will be created in the current + working directory and backup configuration will be copied in C(filename) + within I(backup) directory. + type: path + type: dict +notes: +- Abbreviated commands are NOT idempotent, see + L(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 = """ +- name: configure top level configuration and save it + cisco.nxos.nxos_config: + lines: hostname {{ inventory_hostname }} + save_when: modified + +- name: diff the running-config against a provided config + cisco.nxos.nxos_config: + diff_against: intended + intended_config: "{{ lookup('file', 'master.cfg') }}" + +- cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + before: no ip access-list test + match: exact + +- cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + before: no ip access-list test + replace: block + +- name: replace config with flat file + cisco.nxos.nxos_config: + replace_src: config.txt + replace: config + +- name: for idempotency, use full-form commands + cisco.nxos.nxos_config: + lines: + # - shut + - shutdown + # parents: int eth1/1 + parents: interface Ethernet1/1 + +- name: configurable backup path + cisco.nxos.nxos_config: + backup: yes + backup_options: + filename: backup.cfg + dir_path: /home/user +""" + +RETURN = """ +commands: + description: The set of commands that will be pushed to the remote device + returned: always + type: list + sample: ['hostname foo', 'vlan 1', 'name default'] +updates: + description: The set of commands that will be pushed to the remote device + returned: always + type: list + sample: ['hostname foo', 'vlan 1', 'name default'] +backup_path: + description: The full path to the backup file + returned: when backup is yes + type: str + sample: /playbooks/ansible/backup/nxos_config.2016-07-16@22:28:34 +filename: + description: The name of the backup file + returned: when backup is yes and filename is not specified in backup options + type: str + sample: nxos_config.2016-07-16@22:28:34 +shortname: + description: The full path to the backup file excluding the timestamp + returned: when backup is yes and filename is not specified in backup options + type: str + sample: /playbooks/ansible/backup/nxos_config +date: + description: The date extracted from the backup file name + returned: when backup is yes + type: str + sample: "2016-07-16" +time: + description: The time extracted from the backup file name + returned: when backup is yes + type: str + sample: "22:28:34" +""" +from ansible.module_utils._text import to_text +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.connection import ConnectionError +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + NetworkConfig, + dumps, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, + get_connection, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) + + +def get_running_config(module, config=None, flags=None): + contents = module.params["running_config"] + if not contents: + if config: + contents = config + else: + contents = get_config(module, flags=flags) + return contents + + +def get_candidate(module): + candidate = "" + if module.params["src"]: + if module.params["replace"] != "config": + candidate = module.params["src"] + if module.params["replace"] == "config": + candidate = "config replace {0}".format(module.params["replace_src"]) + elif module.params["lines"]: + candidate_obj = NetworkConfig(indent=2) + parents = module.params["parents"] or list() + candidate_obj.add(module.params["lines"], parents=parents) + candidate = dumps(candidate_obj, "raw") + return candidate + + +def execute_show_commands(module, commands, output="text"): + cmds = [] + for command in to_list(commands): + cmd = {"command": command, "output": output} + cmds.append(cmd) + body = run_commands(module, cmds) + return body + + +def save_config(module, result): + result["changed"] = True + if not module.check_mode: + cmd = { + "command": "copy running-config startup-config", + "output": "text", + } + run_commands(module, [cmd]) + else: + module.warn( + "Skipping command `copy running-config startup-config` " + "due to check_mode. Configuration not copied to " + "non-volatile storage" + ) + + +def main(): + """ main entry point for module execution + """ + backup_spec = dict(filename=dict(), dir_path=dict(type="path")) + argument_spec = dict( + src=dict(type="path"), + replace_src=dict(), + lines=dict(aliases=["commands"], type="list", elements="str"), + parents=dict(type="list", elements="str"), + before=dict(type="list", elements="str"), + after=dict(type="list", elements="str"), + match=dict( + default="line", choices=["line", "strict", "exact", "none"] + ), + replace=dict(default="line", choices=["line", "block", "config"]), + running_config=dict(aliases=["config"]), + intended_config=dict(), + defaults=dict(type="bool", default=False), + backup=dict(type="bool", default=False), + backup_options=dict(type="dict", options=backup_spec), + save_when=dict( + choices=["always", "never", "modified", "changed"], default="never" + ), + diff_against=dict(choices=["running", "startup", "intended"]), + diff_ignore_lines=dict(type="list", elements="str"), + ) + + argument_spec.update(nxos_argument_spec) + + mutually_exclusive = [("lines", "src", "replace_src"), ("parents", "src")] + + required_if = [ + ("match", "strict", ["lines"]), + ("match", "exact", ["lines"]), + ("replace", "block", ["lines"]), + ("replace", "config", ["replace_src"]), + ("diff_against", "intended", ["intended_config"]), + ] + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + required_if=required_if, + supports_check_mode=True, + ) + + warnings = list() + + result = {"changed": False, "warnings": warnings} + + config = None + + diff_ignore_lines = module.params["diff_ignore_lines"] + path = module.params["parents"] + connection = get_connection(module) + contents = None + flags = ["all"] if module.params["defaults"] else [] + replace_src = module.params["replace_src"] + if replace_src: + if module.params["replace"] != "config": + module.fail_json( + msg="replace: config is required with replace_src" + ) + + if module.params["backup"] or ( + module._diff and module.params["diff_against"] == "running" + ): + contents = get_config(module, flags=flags) + config = NetworkConfig(indent=2, contents=contents) + if module.params["backup"]: + result["__backup__"] = contents + + if any((module.params["src"], module.params["lines"], replace_src)): + msg = ( + "To ensure idempotency and correct diff the input configuration lines should be" + " similar to how they appear if present in the running configuration on device" + ) + if module.params["src"] or replace_src: + msg += " including the indentation" + warnings.append(msg) + match = module.params["match"] + replace = module.params["replace"] + + commit = not module.check_mode + candidate = get_candidate(module) + running = get_running_config(module, contents, flags=flags) + if replace_src: + commands = candidate.split("\n") + result["commands"] = result["updates"] = commands + if commit: + load_config(module, commands, replace=replace_src) + + result["changed"] = True + else: + try: + response = connection.get_diff( + candidate=candidate, + running=running, + diff_match=match, + diff_ignore_lines=diff_ignore_lines, + path=path, + diff_replace=replace, + ) + except ConnectionError as exc: + module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace") + ) + + config_diff = response["config_diff"] + if config_diff: + commands = config_diff.split("\n") + + if module.params["before"]: + commands[:0] = module.params["before"] + + if module.params["after"]: + commands.extend(module.params["after"]) + + result["commands"] = commands + result["updates"] = commands + + if commit: + load_config(module, commands, replace=replace_src) + + result["changed"] = True + + running_config = module.params["running_config"] + startup_config = None + + if module.params["save_when"] == "always": + save_config(module, result) + elif module.params["save_when"] == "modified": + output = execute_show_commands( + module, ["show running-config", "show startup-config"] + ) + + running_config = NetworkConfig( + indent=2, contents=output[0], ignore_lines=diff_ignore_lines + ) + startup_config = NetworkConfig( + indent=2, contents=output[1], ignore_lines=diff_ignore_lines + ) + + if running_config.sha1 != startup_config.sha1: + save_config(module, result) + elif module.params["save_when"] == "changed" and result["changed"]: + save_config(module, result) + + if module._diff: + if not running_config: + output = execute_show_commands(module, "show running-config") + contents = output[0] + else: + contents = running_config + + # recreate the object in order to process diff_ignore_lines + running_config = NetworkConfig( + indent=2, contents=contents, ignore_lines=diff_ignore_lines + ) + + if module.params["diff_against"] == "running": + if module.check_mode: + module.warn( + "unable to perform diff against running-config due to check mode" + ) + contents = None + else: + contents = config.config_text + + elif module.params["diff_against"] == "startup": + if not startup_config: + output = execute_show_commands(module, "show startup-config") + contents = output[0] + else: + contents = startup_config.config_text + + elif module.params["diff_against"] == "intended": + contents = module.params["intended_config"] + + if contents is not None: + base_config = NetworkConfig( + indent=2, contents=contents, ignore_lines=diff_ignore_lines + ) + + if running_config.sha1 != base_config.sha1: + if module.params["diff_against"] == "intended": + before = running_config + after = base_config + elif module.params["diff_against"] in ("startup", "running"): + before = base_config + after = running_config + + result.update( + { + "changed": True, + "diff": {"before": str(before), "after": str(after)}, + } + ) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_devicealias.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_devicealias.py new file mode 100644 index 00000000..30edfc75 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_devicealias.py @@ -0,0 +1,593 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 + + +DOCUMENTATION = """ +module: nxos_devicealias +short_description: Configuration of device alias for Cisco NXOS MDS Switches. +description: +- Configuration of device alias for Cisco MDS NXOS. +version_added: 1.0.0 +author: +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) +notes: +- Tested against NX-OS 8.4(1) +options: + distribute: + description: + - Enable/Disable device-alias distribution + type: bool + mode: + description: + - Mode of devices-alias, basic or enhanced + choices: + - basic + - enhanced + type: str + da: + description: + - List of device-alias to be added or removed + type: list + elements: dict + suboptions: + name: + description: + - Name of the device-alias to be added or removed + required: true + type: str + pwwn: + description: + - pwwn to which the name needs to be associated with + type: str + remove: + description: + - Removes the device-alias if set to True + type: bool + default: false + rename: + description: + - List of device-alias to be renamed + type: list + elements: dict + suboptions: + old_name: + description: + - Old name of the device-alias that needs to be renamed + required: true + type: str + new_name: + description: + - New name of the device-alias + required: true + type: str +""" + +EXAMPLES = """ +- name: Test that device alias module works + cisco.nxos.nxos_devicealias: + da: + - name: test1_add + pwwn: 56:2:22:11:22:88:11:67 + - name: test2_add + pwwn: 65:22:22:11:22:22:11:d + - name: dev1 + remove: true + - name: dev2 + remove: true + distribute: true + mode: enhanced + rename: + - new_name: bcd + old_name: abc + - new_name: bcd1 + old_name: abc1 + + +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - terminal dont-ask + - device-alias database + - device-alias name somename pwwn 10:00:00:00:89:a1:01:03 + - device-alias name somename1 pwwn 10:00:00:00:89:a1:02:03 + - device-alias commit + - no terminal dont-ask +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +import string + +__metaclass__ = type + +VALID_DA_CHARS = ("-", "_", "$", "^") + + +class showDeviceAliasStatus(object): + """docstring for showDeviceAliasStatus""" + + def __init__(self, module): + self.module = module + self.distribute = "" + self.mode = "" + self.locked = False + self.update() + + def execute_show_cmd(self, cmd): + output = execute_show_command(cmd, self.module)[0] + return output + + def update(self): + command = "show device-alias status" + output = self.execute_show_cmd(command).split("\n") + for o in output: + if "Fabric Distribution" in o: + self.distribute = o.split(":")[1].strip().lower() + if "Mode" in o: + self.mode = o.split("Mode:")[1].strip().lower() + if "Locked" in o: + self.locked = True + + def isLocked(self): + return self.locked + + def getDistribute(self): + return self.distribute + + def getMode(self): + return self.mode + + +class showDeviceAliasDatabase(object): + """docstring for showDeviceAliasDatabase""" + + def __init__(self, module): + self.module = module + self.da_dict = {} + self.update() + + def execute_show_cmd(self, cmd): + output = execute_show_command(cmd, self.module)[0] + return output + + def update(self): + command = "show device-alias database" + # output = execute_show_command(command, self.module)[0].split("\n") + output = self.execute_show_cmd(command) + self.da_list = output.split("\n") + for eachline in self.da_list: + if "device-alias" in eachline: + sv = eachline.strip().split() + self.da_dict[sv[2]] = sv[4] + + def isNameInDaDatabase(self, name): + return name in self.da_dict.keys() + + def isPwwnInDaDatabase(self, pwwn): + newpwwn = ":".join( + ["0" + str(ep) if len(ep) == 1 else ep for ep in pwwn.split(":")] + ) + return newpwwn in self.da_dict.values() + + def isNamePwwnPresentInDatabase(self, name, pwwn): + newpwwn = ":".join( + ["0" + str(ep) if len(ep) == 1 else ep for ep in pwwn.split(":")] + ) + if name in self.da_dict.keys(): + if newpwwn == self.da_dict[name]: + return True + return False + + def getPwwnByName(self, name): + if name in self.da_dict.keys(): + return self.da_dict[name] + else: + return None + + def getNameByPwwn(self, pwwn): + newpwwn = ":".join( + ["0" + str(ep) if len(ep) == 1 else ep for ep in pwwn.split(":")] + ) + for n, p in self.da_dict.items(): + if p == newpwwn: + return n + return None + + +def isPwwnValid(pwwn): + pwwnsplit = pwwn.split(":") + if len(pwwnsplit) != 8: + return False + for eachpwwnsplit in pwwnsplit: + if len(eachpwwnsplit) > 2 or len(eachpwwnsplit) < 1: + return False + if not all(c in string.hexdigits for c in eachpwwnsplit): + return False + return True + + +def isNameValid(name): + if not name[0].isalpha(): + # Illegal first character. Name must start with a letter + return False + if len(name) > 64: + return False + for character in name: + if not character.isalnum() and character not in VALID_DA_CHARS: + return False + return True + + +def execute_show_command(command, module, command_type="cli_show"): + output = "text" + commands = [{"command": command, "output": output}] + out = run_commands(module, commands) + return out + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def main(): + element_spec = dict( + name=dict(required=True, type="str"), + pwwn=dict(type="str"), + remove=dict(type="bool", default=False), + ) + + element_spec_rename = dict( + old_name=dict(required=True, type="str"), + new_name=dict(required=True, type="str"), + ) + + argument_spec = dict( + distribute=dict(type="bool"), + mode=dict(type="str", choices=["enhanced", "basic"]), + da=dict(type="list", elements="dict", options=element_spec), + rename=dict(type="list", elements="dict", options=element_spec_rename), + ) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + messages = list() + commands_to_execute = list() + result = {"changed": False} + + distribute = module.params["distribute"] + mode = module.params["mode"] + da = module.params["da"] + rename = module.params["rename"] + + # Step 0.0: Validate syntax of name and pwwn + # Also validate syntax of rename arguments + if da is not None: + for eachdict in da: + name = eachdict["name"] + pwwn = eachdict["pwwn"] + remove = eachdict["remove"] + if pwwn is not None: + pwwn = pwwn.lower() + if not remove: + if pwwn is None: + module.fail_json( + msg="This device alias name " + + str(name) + + " which needs to be added, does not have pwwn specified. Please specify a valid pwwn" + ) + if not isNameValid(name): + module.fail_json( + msg="This pwwn name is invalid : " + + str(name) + + ". Note that name cannot be more than 64 alphanumeric chars, " + + "it must start with a letter, and can only contain these characters: " + + ", ".join( + ["'{0}'".format(c) for c in VALID_DA_CHARS] + ) + ) + if not isPwwnValid(pwwn): + module.fail_json( + msg="This pwwn is invalid : " + + str(pwwn) + + ". Please check that its a valid pwwn" + ) + if rename is not None: + for eachdict in rename: + oldname = eachdict["old_name"] + newname = eachdict["new_name"] + if not isNameValid(oldname): + module.fail_json( + msg="This pwwn name is invalid : " + + str(oldname) + + ". Note that name cannot be more than 64 alphanumeric chars, " + + "it must start with a letter, and can only contain these characters: " + + ", ".join(["'{0}'".format(c) for c in VALID_DA_CHARS]) + ) + if not isNameValid(newname): + module.fail_json( + msg="This pwwn name is invalid : " + + str(newname) + + ". Note that name cannot be more than 64 alphanumeric chars, " + + "it must start with a letter, and can only contain these characters: " + + ", ".join(["'{0}'".format(c) for c in VALID_DA_CHARS]) + ) + + # Step 0.1: Check DA status + shDAStausObj = showDeviceAliasStatus(module) + d = shDAStausObj.getDistribute() + m = shDAStausObj.getMode() + if shDAStausObj.isLocked(): + module.fail_json( + msg="device-alias has acquired lock on the switch. Hence cannot procced." + ) + + # Step 1: Process distribute + commands = [] + if distribute is not None: + if distribute: + # playbook has distribute as True(enabled) + if d == "disabled": + # but switch distribute is disabled(false), so set it to + # true(enabled) + commands.append("device-alias distribute") + messages.append( + "device-alias distribute changed from disabled to enabled" + ) + else: + messages.append( + "device-alias distribute remains unchanged. current distribution mode is enabled" + ) + else: + # playbook has distribute as False(disabled) + if d == "enabled": + # but switch distribute is enabled(true), so set it to + # false(disabled) + commands.append("no device-alias distribute") + messages.append( + "device-alias distribute changed from enabled to disabled" + ) + else: + messages.append( + "device-alias distribute remains unchanged. current distribution mode is disabled" + ) + + cmds = flatten_list(commands) + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the da_add/da_remove stage + pass + else: + result["changed"] = True + load_config(module, cmds) + + # Step 2: Process mode + commands = [] + if mode is not None: + if mode == "basic": + # playbook has mode as basic + if m == "enhanced": + # but switch mode is enhanced, so set it to basic + commands.append("no device-alias mode enhanced") + messages.append( + "device-alias mode changed from enhanced to basic" + ) + else: + messages.append( + "device-alias mode remains unchanged. current mode is basic" + ) + + else: + # playbook has mode as enhanced + if m == "basic": + # but switch mode is basic, so set it to enhanced + commands.append("device-alias mode enhanced") + messages.append( + "device-alias mode changed from basic to enhanced" + ) + else: + messages.append( + "device-alias mode remains unchanged. current mode is enhanced" + ) + + if commands: + if distribute: + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + else: + if distribute is None and d == "enabled": + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands) + + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the end + pass + else: + result["changed"] = True + load_config(module, cmds) + + # Step 3: Process da + commands = [] + shDADatabaseObj = showDeviceAliasDatabase(module) + if da is not None: + da_remove_list = [] + da_add_list = [] + for eachdict in da: + name = eachdict["name"] + pwwn = eachdict["pwwn"] + remove = eachdict["remove"] + if pwwn is not None: + pwwn = pwwn.lower() + if remove: + if shDADatabaseObj.isNameInDaDatabase(name): + commands.append("no device-alias name " + name) + da_remove_list.append(name) + else: + messages.append( + name + + " - This device alias name is not in switch device-alias database, hence cannot be removed." + ) + else: + if shDADatabaseObj.isNamePwwnPresentInDatabase(name, pwwn): + messages.append( + name + + " : " + + pwwn + + " - This device alias name,pwwn is already in switch device-alias database, hence nothing to configure" + ) + else: + if shDADatabaseObj.isNameInDaDatabase(name): + module.fail_json( + msg=name + + " - This device alias name is already present in switch device-alias database but assigned to another pwwn (" + + shDADatabaseObj.getPwwnByName(name) + + ") hence cannot be added" + ) + + elif shDADatabaseObj.isPwwnInDaDatabase(pwwn): + module.fail_json( + msg=pwwn + + " - This device alias pwwn is already present in switch device-alias database but assigned to another name (" + + shDADatabaseObj.getNameByPwwn(pwwn) + + ") hence cannot be added" + ) + + else: + commands.append( + "device-alias name " + name + " pwwn " + pwwn + ) + da_add_list.append(name) + + if len(da_add_list) != 0 or len(da_remove_list) != 0: + commands = ["device-alias database"] + commands + if distribute: + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + else: + if distribute is None and d == "enabled": + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + + commands + + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands) + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the end + pass + else: + result["changed"] = True + load_config(module, cmds) + if len(da_remove_list) != 0: + messages.append( + "the required device-alias were removed. " + + ",".join(da_remove_list) + ) + if len(da_add_list) != 0: + messages.append( + "the required device-alias were added. " + + ",".join(da_add_list) + ) + + # Step 5: Process rename + commands = [] + if rename is not None: + for eachdict in rename: + oldname = eachdict["old_name"] + newname = eachdict["new_name"] + if shDADatabaseObj.isNameInDaDatabase(newname): + module.fail_json( + changed=False, + commands=cmds, + msg=newname + + " - this name is already present in the device-alias database, hence we cannot rename " + + oldname + + " with this one", + ) + if shDADatabaseObj.isNameInDaDatabase(oldname): + commands.append( + "device-alias rename " + oldname + " " + newname + ) + else: + module.fail_json( + changed=False, + commands=cmds, + msg=oldname + + " - this name is not present in the device-alias database, hence we cannot rename.", + ) + + if len(commands) != 0: + commands = ["device-alias database"] + commands + if distribute: + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + else: + if distribute is None and d == "enabled": + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + + commands + + ["no terminal dont-ask"] + ) + cmds = flatten_list(commands) + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the end + pass + else: + result["changed"] = True + load_config(module, cmds) + + # Step END: check for 'check' mode + if module.check_mode: + module.exit_json( + changed=False, + commands=commands_to_execute, + msg="Check Mode: No cmds issued to the hosts", + ) + + result["messages"] = messages + result["commands"] = commands_to_execute + result["warnings"] = warnings + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_global.py new file mode 100644 index 00000000..29aa1bf4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_global.py @@ -0,0 +1,109 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_evpn_global +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Handles the EVPN control plane for VXLAN. +description: +- Handles the EVPN control plane for VXLAN. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- This module is not supported on Nexus 3000 series of switches. +options: + nv_overlay_evpn: + description: + - EVPN control plane. + required: true + type: bool +""" + +EXAMPLES = """ +- cisco.nxos.nxos_evpn_global: + nv_overlay_evpn: true +""" + +RETURN = """ +commands: + description: The set of commands to be sent to the remote device + returned: always + type: list + sample: ['nv overlay evpn'] +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, + nxos_argument_spec, +) + + +def main(): + argument_spec = dict(nv_overlay_evpn=dict(required=True, type="bool")) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + result = {"changed": False} + + warnings = list() + if warnings: + result["warnings"] = warnings + + config = get_config(module) + commands = list() + + info = get_capabilities(module).get("device_info", {}) + os_platform = info.get("network_os_platform", "") + + if "3K" in os_platform: + module.fail_json( + msg="This module is not supported on Nexus 3000 series" + ) + + if module.params["nv_overlay_evpn"] is True: + if "nv overlay evpn" not in config: + commands.append("nv overlay evpn") + elif "nv overlay evpn" in config: + commands.append("no nv overlay evpn") + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + result["commands"] = commands + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_vni.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_vni.py new file mode 100644 index 00000000..bd3dcb10 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_evpn_vni.py @@ -0,0 +1,310 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_evpn_vni +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages Cisco EVPN VXLAN Network Identifier (VNI). +description: +- Manages Cisco Ethernet Virtual Private Network (EVPN) VXLAN Network Identifier (VNI) + configurations of a Nexus device. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- default, where supported, restores params default value. +- RD override is not permitted. You should set it to the default values first and + then reconfigure it. +- C(route_target_both), C(route_target_import) and C(route_target_export valid) values + are a list of extended communities, (i.e. ['1.2.3.4:5', '33:55']) or the keywords + 'auto' or 'default'. +- The C(route_target_both) property is discouraged due to the inconsistent behavior + of the property across Nexus platforms and image versions. For this reason it is + recommended to use explicit C(route_target_export) and C(route_target_import) properties + instead of C(route_target_both). +- RD valid values are a string in one of the route-distinguisher formats, the keyword + 'auto', or the keyword 'default'. +options: + vni: + description: + - The EVPN VXLAN Network Identifier. + required: true + type: str + route_distinguisher: + description: + - The VPN Route Distinguisher (RD). The RD is combined with the IPv4 or IPv6 prefix + learned by the PE router to create a globally unique address. + type: str + route_target_both: + description: + - Enables/Disables route-target settings for both import and export target communities + using a single property. + type: list + elements: str + route_target_import: + description: + - Sets the route-target 'import' extended communities. + type: list + elements: str + route_target_export: + description: + - Sets the route-target 'export' extended communities. + type: list + elements: str + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- name: vni configuration + cisco.nxos.nxos_evpn_vni: + vni: 6000 + route_distinguisher: 60:10 + route_target_import: + - 5000:10 + - 4100:100 + route_target_export: auto + route_target_both: default +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["evpn", "vni 6000 l2", "route-target import 5001:10"] +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +PARAM_TO_COMMAND_KEYMAP = { + "vni": "vni", + "route_distinguisher": "rd", + "route_target_both": "route-target both", + "route_target_import": "route-target import", + "route_target_export": "route-target export", +} + + +def get_value(arg, config, module): + command = PARAM_TO_COMMAND_KEYMAP.get(arg) + command_re = re.compile(r"(?:{0}\s)(?P.*)$".format(command), re.M) + value = "" + if command in config: + value = command_re.search(config).group("value") + return value + + +def get_route_target_value(arg, config, module): + splitted_config = config.splitlines() + value_list = [] + command = PARAM_TO_COMMAND_KEYMAP.get(arg) + command_re = re.compile(r"(?:{0}\s)(?P.*)$".format(command), re.M) + + for line in splitted_config: + value = "" + if command in line.strip(): + value = command_re.search(line).group("value") + value_list.append(value) + return value_list + + +def get_existing(module, args): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + parents = ["evpn", "vni {0} l2".format(module.params["vni"])] + config = netcfg.get_section(parents) + + if config: + for arg in args: + if arg != "vni": + if arg == "route_distinguisher": + existing[arg] = get_value(arg, config, module) + else: + existing[arg] = get_route_target_value(arg, config, module) + + existing_fix = dict((k, v) for k, v in existing.items() if v) + if not existing_fix: + existing = existing_fix + + existing["vni"] = module.params["vni"] + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key in table: + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = table.get(key) + return new_dict + + +def fix_proposed(proposed_commands): + new_proposed = {} + for key, value in proposed_commands.items(): + if key == "route-target both": + new_proposed["route-target export"] = value + new_proposed["route-target import"] = value + else: + new_proposed[key] = value + return new_proposed + + +def state_present(module, existing, proposed): + commands = list() + parents = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + if proposed_commands.get("route-target both"): + proposed_commands = fix_proposed(proposed_commands) + + for key, value in proposed_commands.items(): + if key.startswith("route-target"): + if value == ["default"]: + existing_value = existing_commands.get(key) + + if existing_value: + for target in existing_value: + commands.append("no {0} {1}".format(key, target)) + elif not isinstance(value, list): + value = [value] + + for target in value: + if target == "default": + continue + if existing: + if target not in existing.get( + key.replace("-", "_").replace(" ", "_") + ): + commands.append("{0} {1}".format(key, target)) + else: + commands.append("{0} {1}".format(key, target)) + + if existing.get(key.replace("-", "_").replace(" ", "_")): + for exi in existing.get( + key.replace("-", "_").replace(" ", "_") + ): + if exi not in value: + commands.append("no {0} {1}".format(key, exi)) + + elif value == "default": + existing_value = existing_commands.get(key) + if existing_value: + commands.append("no {0} {1}".format(key, existing_value)) + else: + command = "{0} {1}".format(key, value) + commands.append(command) + + if commands: + parents = ["evpn", "vni {0} l2".format(module.params["vni"])] + + return commands, parents + + +def state_absent(module, existing, proposed): + commands = ["no vni {0} l2".format(module.params["vni"])] + parents = ["evpn"] + return commands, parents + + +def main(): + argument_spec = dict( + vni=dict(required=True, type="str"), + route_distinguisher=dict(required=False, type="str"), + route_target_both=dict(required=False, type="list", elements="str"), + route_target_import=dict(required=False, type="list", elements="str"), + route_target_export=dict(required=False, type="list", elements="str"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = dict(changed=False, warnings=warnings) + + state = module.params["state"] + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing = get_existing(module, args) + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + commands = [] + parents = [] + + proposed = {} + for key, value in proposed_args.items(): + if key != "vni": + if value == "true": + value = True + elif value == "false": + value = False + if existing.get(key) != value: + proposed[key] = value + + if state == "present": + commands, parents = state_present(module, existing, proposed) + elif state == "absent" and existing: + commands, parents = state_absent(module, existing, proposed) + + if commands: + candidate = CustomNetworkConfig(indent=3) + candidate.add(commands, parents=parents) + candidate = candidate.items_text() + if not module.check_mode: + load_config(module, candidate) + results["changed"] = True + results["commands"] = candidate + else: + results["commands"] = [] + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_facts.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_facts.py new file mode 100644 index 00000000..5b23d9ac --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_facts.py @@ -0,0 +1,248 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_facts +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Gets facts about NX-OS switches +description: +- Collects facts from Cisco Nexus devices running the NX-OS operating system. Fact + collection is supported over both Cli and Nxapi transports. This module prepends + all of the base network fact keys with C(ansible_net_). The facts module + will always collect a base set of facts from the device and can enable or disable + collection of additional facts. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +options: + gather_subset: + description: + - When supplied, this argument will restrict the facts collected to a given subset. Possible + values for this argument include all, hardware, config, legacy, and interfaces. Can + specify a list of values to include a larger subset. Values can also be used + with an initial C(!) to specify that a specific subset should not be collected. + required: false + default: '!config' + type: list + elements: str + gather_network_resources: + description: + - 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 C(!) to specify that a specific subset should + not be collected. Valid subsets are 'all', 'bfd_interfaces', 'lag_interfaces', + 'telemetry', 'vlans', 'lacp', 'lacp_interfaces', 'interfaces', 'l3_interfaces', + 'l2_interfaces', 'lldp_global', 'acls', 'acl_interfaces', 'ospfv2'. + required: false + type: list + elements: str +""" + +EXAMPLES = """ +- name: Gather all legacy facts + cisco.nxos.nxos_facts: + gather_subset: all +- name: Gather only the config and default facts + cisco.nxos.nxos_facts: + gather_subset: + - config +- name: Do not gather hardware facts + cisco.nxos.nxos_facts: + gather_subset: + - '!hardware' +- name: Gather legacy and resource facts + cisco.nxos.nxos_facts: + gather_subset: all + gather_network_resources: all +- name: Gather only the interfaces resource facts and no legacy facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - interfaces +- name: Gather interfaces resource and minimal legacy facts + cisco.nxos.nxos_facts: + gather_subset: min + gather_network_resources: interfaces +""" + +RETURN = """ +ansible_net_gather_subset: + description: The list of fact subsets collected from the device + returned: always + type: list +ansible_net_gather_network_resources: + description: The list of fact for network resource subsets collected from the device + returned: when the resource is configured + type: list +# default +ansible_net_model: + description: The model name returned from the device + returned: always + type: str +ansible_net_serialnum: + description: The serial number of the remote device + returned: always + type: str +ansible_net_version: + description: The operating system version running on the remote device + returned: always + type: str +ansible_net_hostname: + description: The configured hostname of the device + returned: always + type: str +ansible_net_image: + description: The image file the device is running + returned: always + type: str +ansible_net_api: + description: The name of the transport + returned: always + type: str +ansible_net_license_hostid: + description: The License host id of the device + returned: always + type: str +ansible_net_python_version: + description: The Python version Ansible controller is using + returned: always + type: str +# hardware +ansible_net_filesystems: + description: All file system names available on the device + returned: when hardware is configured + type: list +ansible_net_memfree_mb: + description: The available free memory on the remote device in Mb + returned: when hardware is configured + type: int +ansible_net_memtotal_mb: + description: The total memory on the remote device in Mb + returned: when hardware is configured + type: int +# config +ansible_net_config: + description: The current active config from the device + returned: when config is configured + type: str +# interfaces +ansible_net_all_ipv4_addresses: + description: All IPv4 addresses configured on the device + returned: when interfaces is configured + type: list +ansible_net_all_ipv6_addresses: + description: All IPv6 addresses configured on the device + returned: when interfaces is configured + type: list +ansible_net_interfaces: + description: A hash of all interfaces running on the system + returned: when interfaces is configured + type: dict +ansible_net_neighbors: + description: + - The list of LLDP and CDP neighbors from the device. If both, + CDP and LLDP neighbor data is present on one port, CDP is preferred. + returned: when interfaces is configured + type: dict +# legacy (pre Ansible 2.2) +fan_info: + description: A hash of facts about fans in the remote device + returned: when legacy is configured + type: dict +hostname: + description: The configured hostname of the remote device + returned: when legacy is configured + type: dict +interfaces_list: + description: The list of interface names on the remote device + returned: when legacy is configured + type: dict +kickstart: + description: The software version used to boot the system + returned: when legacy is configured + type: str +module: + description: A hash of facts about the modules in a remote device + returned: when legacy is configured + type: dict +platform: + description: The hardware platform reported by the remote device + returned: when legacy is configured + type: str +power_supply_info: + description: A hash of facts about the power supplies in the remote device + returned: when legacy is configured + type: str +vlan_list: + description: The list of VLAN IDs configured on the remote device + returned: when legacy is configured + type: list +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.facts.facts import ( + FactsArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts import ( + Facts, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) + + +def main(): + """ + Main entry point for module execution + + :returns: ansible_facts + """ + argument_spec = FactsArgs.argument_spec + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = [] + if module.params["gather_subset"] == "!config": + warnings.append( + "default value for `gather_subset` will be changed to `min` from `!config` v2.11 onwards" + ) + + result = Facts(module).get_facts() + + ansible_facts, additional_warnings = result + warnings.extend(additional_warnings) + + module.exit_json(ansible_facts=ansible_facts, warnings=warnings) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_feature.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_feature.py new file mode 100644 index 00000000..77a7e3c7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_feature.py @@ -0,0 +1,285 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_feature +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manage features in NX-OS switches. +description: +- Offers ability to enable and disable features in NX-OS. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +options: + feature: + description: + - Name of feature. + required: true + type: str + state: + description: + - Desired state of the feature. + required: false + default: enabled + choices: + - enabled + - disabled + type: str +""" + +EXAMPLES = """ +- name: Ensure lacp is enabled + cisco.nxos.nxos_feature: + feature: lacp + state: enabled + +- name: Ensure ospf is disabled + cisco.nxos.nxos_feature: + feature: ospf + state: disabled + +- name: Ensure vpc is enabled + cisco.nxos.nxos_feature: + feature: vpc + state: enabled +""" + +RETURN = """ +commands: + description: The set of commands to be sent to the remote device + returned: always + type: list + sample: ['nv overlay evpn'] +""" + +import re + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.connection import ConnectionError +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, + get_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, + nxos_argument_spec, +) + + +def get_available_features(feature, module): + available_features = {} + feature_regex = r"(?P\S+)\s+\d+\s+(?P.*)" + command = {"command": "show feature", "output": "text"} + + try: + body = run_commands(module, [command])[0] + split_body = body.splitlines() + except (KeyError, IndexError): + return {} + + for line in split_body: + try: + match_feature = re.match(feature_regex, line, re.DOTALL) + feature_group = match_feature.groupdict() + feature = feature_group["feature"] + state = feature_group["state"] + except AttributeError: + feature = "" + state = "" + + if feature and state: + if "enabled" in state: + state = "enabled" + + if feature not in available_features: + available_features[feature] = state + else: + if ( + available_features[feature] == "disabled" + and state == "enabled" + ): + available_features[feature] = state + + # certain configurable features do not + # show up in the output of "show feature" + # but appear in running-config when set + run_cfg = get_config(module, flags=["| include ^feature"]) + for item in re.findall(r"feature\s(.*)", run_cfg): + if item not in available_features: + available_features[item] = "enabled" + + if "fabric forwarding" not in available_features: + available_features["fabric forwarding"] = "disabled" + + return available_features + + +def get_commands(proposed, existing, state, module): + feature = validate_feature(module, mode="config") + commands = [] + feature_check = proposed == existing + if not feature_check: + if state == "enabled": + command = "feature {0}".format(feature) + commands.append(command) + elif state == "disabled": + command = "no feature {0}".format(feature) + commands.append(command) + return commands + + +def validate_feature(module, mode="show"): + """Some features may need to be mapped due to inconsistency + between how they appear from "show feature" output and + how they are configured""" + + feature = module.params["feature"] + + try: + info = get_capabilities(module) + device_info = info.get("device_info", {}) + os_version = device_info.get("network_os_version", "") + except ConnectionError: + os_version = "" + + if "8.1" in os_version: + feature_to_be_mapped = { + "show": { + "nv overlay": "nve", + "vn-segment-vlan-based": "vnseg_vlan", + "hsrp": "hsrp_engine", + "fabric multicast": "fabric_mcast", + "scp-server": "scpServer", + "sftp-server": "sftpServer", + "sla responder": "sla_responder", + "sla sender": "sla_sender", + "ssh": "sshServer", + "tacacs+": "tacacs", + "telnet": "telnetServer", + "ethernet-link-oam": "elo", + }, + "config": { + "nve": "nv overlay", + "vnseg_vlan": "vn-segment-vlan-based", + "hsrp_engine": "hsrp", + "fabric_mcast": "fabric multicast", + "scpServer": "scp-server", + "sftpServer": "sftp-server", + "sla_sender": "sla sender", + "sla_responder": "sla responder", + "sshServer": "ssh", + "tacacs": "tacacs+", + "telnetServer": "telnet", + "elo": "ethernet-link-oam", + }, + } + else: + feature_to_be_mapped = { + "show": { + "nv overlay": "nve", + "vn-segment-vlan-based": "vnseg_vlan", + "hsrp": "hsrp_engine", + "fabric multicast": "fabric_mcast", + "scp-server": "scpServer", + "sftp-server": "sftpServer", + "sla responder": "sla_responder", + "sla sender": "sla_sender", + "ssh": "sshServer", + "tacacs+": "tacacs", + "telnet": "telnetServer", + "ethernet-link-oam": "elo", + "port-security": "eth_port_sec", + }, + "config": { + "nve": "nv overlay", + "vnseg_vlan": "vn-segment-vlan-based", + "hsrp_engine": "hsrp", + "fabric_mcast": "fabric multicast", + "scpServer": "scp-server", + "sftpServer": "sftp-server", + "sla_sender": "sla sender", + "sla_responder": "sla responder", + "sshServer": "ssh", + "tacacs": "tacacs+", + "telnetServer": "telnet", + "elo": "ethernet-link-oam", + "eth_port_sec": "port-security", + }, + } + + if feature in feature_to_be_mapped[mode]: + feature = feature_to_be_mapped[mode][feature] + + return feature + + +def main(): + argument_spec = dict( + feature=dict(type="str", required=True), + state=dict(choices=["enabled", "disabled"], default="enabled"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = dict(changed=False, warnings=warnings) + + feature = validate_feature(module) + state = module.params["state"].lower() + + available_features = get_available_features(feature, module) + if feature not in available_features: + module.fail_json( + msg="Invalid feature name.", + features_currently_supported=available_features, + invalid_feature=feature, + ) + else: + existstate = available_features[feature] + + existing = dict(state=existstate) + proposed = dict(state=state) + results["changed"] = False + + cmds = get_commands(proposed, existing, state, module) + + if cmds: + # On N35 A8 images, some features return a yes/no prompt + # on enablement or disablement. Bypass using terminal dont-ask + cmds.insert(0, "terminal dont-ask") + if not module.check_mode: + load_config(module, cmds) + results["changed"] = True + + results["commands"] = cmds + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_file_copy.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_file_copy.py new file mode 100644 index 00000000..d338a201 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_file_copy.py @@ -0,0 +1,201 @@ +#!/usr/bin/python +# +# 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 . +# + + +DOCUMENTATION = """ +module: nxos_file_copy +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Copy a file to a remote NXOS device. +description: +- This module supports two different workflows for copying a file to flash (or bootflash) + on NXOS devices. Files can either be (1) pushed from the Ansible controller to + the device or (2) pulled from a remote SCP file server to the device. File copies + are initiated from the NXOS device to the remote SCP server. This module only supports + the use of connection C(network_cli) or C(Cli) transport with connection C(local). +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +- Rewritten as a plugin by (@mikewiebe) +notes: +- Tested against NXOS 7.0(3)I2(5), 7.0(3)I4(6), 7.0(3)I5(3), 7.0(3)I6(1), 7.0(3)I7(3), + 6.0(2)A8(8), 7.0(3)F3(4), 7.3(0)D1(1), 8.3(0), 9.2, 9.3 +- When pushing files (file_pull is False) to the NXOS device, feature scp-server must + be enabled. +- When pulling files (file_pull is True) to the NXOS device, feature scp-server is + not required. +- When pulling files (file_pull is True) to the NXOS device, no transfer will take + place if the file is already present. +- Check mode will tell you if the file would be copied. +requirements: +- paramiko (required when file_pull is False) +- SCPClient (required when file_pull is False) +- pexpect (required when file_pull is True) +options: + local_file: + description: + - When (file_pull is False) this is the path to the local file on the Ansible + controller. The local directory must exist. + - When (file_pull is True) this is the target file name on the NXOS device. + remote_file: + description: + - When (file_pull is False) this is the remote file path on the NXOS device. If + omitted, the name of the local file will be used. The remote directory must + exist. + - When (file_pull is True) this is the full path to the file on the remote SCP + server to be copied to the NXOS device. + file_system: + description: + - The remote file system on the nxos device. If omitted, devices that support + a I(file_system) parameter will use their default values. + default: 'bootflash:' + connect_ssh_port: + description: + - SSH server port used for file transfer. + default: 22 + file_pull: + description: + - When (False) file is copied from the Ansible controller to the NXOS device. + - When (True) file is copied from a remote SCP server to the NXOS device. In this + mode, the file copy is initiated from the NXOS device. + - If the file is already present on the device it will be overwritten and therefore + the operation is NOT idempotent. + type: bool + default: false + file_pull_protocol: + description: + - When file_pull is True, this can be used to define the transfer protocol for + copying file from remote to the NXOS device. + - When (file_pull is False), this is not used. + default: 'scp' + choices: + - scp + - sftp + - ftp + - http + - https + - tftp + type: str + file_pull_compact: + description: + - When file_pull is True, this is used to compact nxos image files. This option + can only be used with nxos image files. + - When (file_pull is False), this is not used. + type: bool + default: false + file_pull_kstack: + description: + - When file_pull is True, this can be used to speed up file copies when the nxos + running image supports the use-kstack option. + - When (file_pull is False), this is not used. + type: bool + default: false + local_file_directory: + description: + - When (file_pull is True) file is copied from a remote SCP server to the NXOS + device, and written to this directory on the NXOS device. If the directory does + not exist, it will be created under the file_system. This is an optional parameter. + - When (file_pull is False), this is not used. + file_pull_timeout: + description: + - Use this parameter to set timeout in seconds, when transferring large files + or when the network is slow. + - When (file_pull is False), this is not used. + default: 300 + remote_scp_server: + description: + - The remote scp server address when file_pull is True. This is required if file_pull + is True. + - When (file_pull is False), this is not used. + remote_scp_server_user: + description: + - The remote scp server username when file_pull is True. This is required if file_pull + is True. + - When (file_pull is False), this is not used. + remote_scp_server_password: + description: + - The remote scp server password when file_pull is True. This is required if file_pull + is True. + - When (file_pull is False), this is not used. + vrf: + description: + - The VRF used to pull the file. Useful when no vrf management is defined + default: management +""" + +EXAMPLES = """ +# File copy from ansible controller to nxos device +- name: copy from server to device + cisco.nxos.nxos_file_copy: + local_file: ./test_file.txt + remote_file: test_file.txt + +# Initiate file copy from the nxos device to transfer file from an SCP server back to the nxos device +- name: initiate file copy from device + cisco.nxos.nxos_file_copy: + file_pull: true + local_file: xyz + local_file_directory: dir1/dir2/dir3 + remote_file: /mydir/abc + remote_scp_server: 192.168.0.1 + remote_scp_server_user: myUser + remote_scp_server_password: myPassword + vrf: management + +# Initiate file copy from the nxos device to transfer file from a ftp server back to the nxos device. +# remote_scp_server_user and remote_scp_server_password are used to login to the FTP server. +- name: initiate file copy from device + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_protocol: ftp + local_file: xyz + remote_file: /mydir/abc + remote_scp_server: 192.168.0.1 + remote_scp_server_user: myUser + remote_scp_server_password: myPassword + vrf: management +""" + +RETURN = """ +transfer_status: + description: Whether a file was transferred to the nxos device. + returned: success + type: str + sample: 'Sent' +local_file: + description: The path of the local file. + returned: success + type: str + sample: '/path/to/local/file' +remote_file: + description: The path of the remote file. + returned: success + type: str + sample: '/path/to/remote/file' +remote_scp_server: + description: The name of the scp server when file_pull is True. + returned: success + type: str + sample: 'fileserver.example.com' +changed: + description: Indicates whether or not the file was copied. + returned: success + type: bool + sample: true +""" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir.py new file mode 100644 index 00000000..88912af4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir.py @@ -0,0 +1,371 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_gir +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Trigger a graceful removal or insertion (GIR) of the switch. +description: +- Trigger a graceful removal or insertion (GIR) of the switch. +- GIR processing may take more than 2 minutes. Timeout settings are automatically + extended to 200s when user timeout settings are insufficient. +version_added: 1.0.0 +author: +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state) has effect only in combination with C(system_mode_maintenance_timeout) + or C(system_mode_maintenance_on_reload_reset_reason). +- Using C(system_mode_maintenance) and C(system_mode_maintenance_dont_generate_profile) + would make the module fail, but the system mode will be triggered anyway. +options: + system_mode_maintenance: + description: + - When C(system_mode_maintenance=true) it puts all enabled protocols in maintenance + mode (using the isolate command). When C(system_mode_maintenance=false) it puts + all enabled protocols in normal mode (using the no isolate command). + type: bool + system_mode_maintenance_dont_generate_profile: + description: + - When C(system_mode_maintenance_dont_generate_profile=true) it prevents the dynamic + searching of enabled protocols and executes commands configured in a maintenance-mode + profile. Use this option if you want the system to use a maintenance-mode profile + that you have created. When C(system_mode_maintenance_dont_generate_profile=false) + it prevents the dynamic searching of enabled protocols and executes commands + configured in a normal-mode profile. Use this option if you want the system + to use a normal-mode profile that you have created. + type: bool + system_mode_maintenance_timeout: + description: + - Keeps the switch in maintenance mode for a specified number of minutes. Range + is 5-65535. + type: str + system_mode_maintenance_shutdown: + description: + - Shuts down all protocols, vPC domains, and interfaces except the management + interface (using the shutdown command). This option is disruptive while C(system_mode_maintenance) + (which uses the isolate command) is not. + type: bool + system_mode_maintenance_on_reload_reset_reason: + description: + - Boots the switch into maintenance mode automatically in the event of a specified + system crash. Note that not all reset reasons are applicable for all platforms. + Also if reset reason is set to match_any, it is not idempotent as it turns on + all reset reasons. If reset reason is match_any and state is absent, it turns + off all the reset reasons. + choices: + - hw_error + - svc_failure + - kern_failure + - wdog_timeout + - fatal_error + - lc_failure + - match_any + - manual_reload + - any_other + - maintenance + type: str + state: + description: + - Specify desired state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# Trigger system maintenance mode +- cisco.nxos.nxos_gir: + system_mode_maintenance: true + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +# Trigger system normal mode +- cisco.nxos.nxos_gir: + system_mode_maintenance: false + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +# Configure on-reload reset-reason for maintenance mode +- cisco.nxos.nxos_gir: + system_mode_maintenance_on_reload_reset_reason: manual_reload + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +# Add on-reload reset-reason for maintenance mode +- cisco.nxos.nxos_gir: + system_mode_maintenance_on_reload_reset_reason: hw_error + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +# Remove on-reload reset-reason for maintenance mode +- cisco.nxos.nxos_gir: + system_mode_maintenance_on_reload_reset_reason: manual_reload + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +# Set timeout for maintenance mode +- cisco.nxos.nxos_gir: + system_mode_maintenance_timeout: 30 + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +# Remove timeout for maintenance mode +- cisco.nxos.nxos_gir: + system_mode_maintenance_timeout: 30 + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +final_system_mode: + description: describe the last system mode + returned: verbose mode + type: str + sample: normal +updates: + description: commands sent to the device + returned: verbose mode + type: list + sample: ["terminal dont-ask", "system mode maintenance timeout 10"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def get_system_mode(module): + command = {"command": "show system mode", "output": "text"} + body = run_commands(module, [command])[0] + if body and "normal" in body.lower(): + mode = "normal" + else: + mode = "maintenance" + return mode + + +def get_maintenance_timeout(module): + command = {"command": "show maintenance timeout", "output": "text"} + body = run_commands(module, [command])[0] + timeout = body.split()[4] + return timeout + + +def get_reset_reasons(module): + command = { + "command": "show maintenance on-reload reset-reasons", + "output": "text", + } + body = run_commands(module, [command])[0] + return body + + +def get_commands(module, state, mode): + commands = list() + if module.params["system_mode_maintenance"] is True and mode == "normal": + commands.append("system mode maintenance") + elif ( + module.params["system_mode_maintenance"] is False + and mode == "maintenance" + ): + commands.append("no system mode maintenance") + + elif ( + module.params["system_mode_maintenance_dont_generate_profile"] is True + and mode == "normal" + ): + commands.append("system mode maintenance dont-generate-profile") + elif ( + module.params["system_mode_maintenance_dont_generate_profile"] is False + and mode == "maintenance" + ): + commands.append("no system mode maintenance dont-generate-profile") + + elif module.params["system_mode_maintenance_timeout"]: + timeout = get_maintenance_timeout(module) + if ( + state == "present" + and timeout != module.params["system_mode_maintenance_timeout"] + ): + commands.append( + "system mode maintenance timeout {0}".format( + module.params["system_mode_maintenance_timeout"] + ) + ) + elif ( + state == "absent" + and timeout == module.params["system_mode_maintenance_timeout"] + ): + commands.append( + "no system mode maintenance timeout {0}".format( + module.params["system_mode_maintenance_timeout"] + ) + ) + + elif ( + module.params["system_mode_maintenance_shutdown"] and mode == "normal" + ): + commands.append("system mode maintenance shutdown") + elif ( + module.params["system_mode_maintenance_shutdown"] is False + and mode == "maintenance" + ): + commands.append("no system mode maintenance") + + elif module.params["system_mode_maintenance_on_reload_reset_reason"]: + reset_reasons = get_reset_reasons(module) + if ( + state == "present" + and module.params[ + "system_mode_maintenance_on_reload_reset_reason" + ].lower() + not in reset_reasons.lower() + ): + commands.append( + "system mode maintenance on-reload " + "reset-reason {0}".format( + module.params[ + "system_mode_maintenance_on_reload_reset_reason" + ] + ) + ) + elif ( + state == "absent" + and module.params[ + "system_mode_maintenance_on_reload_reset_reason" + ].lower() + in reset_reasons.lower() + ): + commands.append( + "no system mode maintenance on-reload " + "reset-reason {0}".format( + module.params[ + "system_mode_maintenance_on_reload_reset_reason" + ] + ) + ) + + if commands: + commands.insert(0, "terminal dont-ask") + return commands + + +def main(): + argument_spec = dict( + system_mode_maintenance=dict(required=False, type="bool"), + system_mode_maintenance_dont_generate_profile=dict( + required=False, type="bool" + ), + system_mode_maintenance_timeout=dict(required=False, type="str"), + system_mode_maintenance_shutdown=dict(required=False, type="bool"), + system_mode_maintenance_on_reload_reset_reason=dict( + required=False, + choices=[ + "hw_error", + "svc_failure", + "kern_failure", + "wdog_timeout", + "fatal_error", + "lc_failure", + "match_any", + "manual_reload", + "any_other", + "maintenance", + ], + ), + state=dict( + choices=["absent", "present"], default="present", required=False + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[ + [ + "system_mode_maintenance", + "system_mode_maintenance_dont_generate_profile", + "system_mode_maintenance_timeout", + "system_mode_maintenance_shutdown", + "system_mode_maintenance_on_reload_reset_reason", + ] + ], + required_one_of=[ + [ + "system_mode_maintenance", + "system_mode_maintenance_dont_generate_profile", + "system_mode_maintenance_timeout", + "system_mode_maintenance_shutdown", + "system_mode_maintenance_on_reload_reset_reason", + ] + ], + supports_check_mode=True, + ) + + warnings = list() + + state = module.params["state"] + mode = get_system_mode(module) + commands = get_commands(module, state, mode) + changed = False + if commands: + if module.check_mode: + module.exit_json(changed=True, commands=commands) + else: + load_config(module, commands) + changed = True + + result = {} + result["changed"] = changed + if module._verbosity > 0: + final_system_mode = get_system_mode(module) + result["final_system_mode"] = final_system_mode + result["updates"] = commands + + result["warnings"] = warnings + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir_profile_management.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir_profile_management.py new file mode 100644 index 00000000..298c45da --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_gir_profile_management.py @@ -0,0 +1,218 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_gir_profile_management +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Create a maintenance-mode or normal-mode profile for GIR. +description: +- Manage a maintenance-mode or normal-mode profile with configuration commands that + can be applied during graceful removal or graceful insertion. +version_added: 1.0.0 +author: +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the whole profile. +options: + commands: + description: + - List of commands to be included into the profile. + type: list + elements: str + mode: + description: + - Configure the profile as Maintenance or Normal mode. + required: true + choices: + - maintenance + - normal + type: str + state: + description: + - Specify desired state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# Create a maintenance-mode profile +- cisco.nxos.nxos_gir_profile_management: + mode: maintenance + commands: + - router eigrp 11 + - isolate + +# Remove the maintenance-mode profile +- cisco.nxos.nxos_gir_profile_management: + mode: maintenance + state: absent +""" + +RETURN = """ +proposed: + description: list of commands passed into module. + returned: verbose mode + type: list + sample: ["router eigrp 11", "isolate"] +existing: + description: list of existing profile commands. + returned: verbose mode + type: list + sample: ["router bgp 65535","isolate","router eigrp 10","isolate", + "diagnostic bootup level complete"] +end_state: + description: list of profile entries after module execution. + returned: verbose mode + type: list + sample: ["router bgp 65535","isolate","router eigrp 10","isolate", + "diagnostic bootup level complete","router eigrp 11", "isolate"] +updates: + description: commands sent to the device + returned: always + type: list + sample: ["configure maintenance profile maintenance-mode", + "router eigrp 11","isolate"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +def get_existing(module): + existing = [] + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + + if module.params["mode"] == "maintenance": + parents = ["configure maintenance profile maintenance-mode"] + else: + parents = ["configure maintenance profile normal-mode"] + + config = netcfg.get_section(parents) + if config: + existing = config.splitlines() + existing = [cmd.strip() for cmd in existing] + existing.pop(0) + + return existing + + +def state_present(module, existing, commands): + cmds = list() + if existing == commands: + # Idempotent case + return cmds + cmds.extend(commands) + if module.params["mode"] == "maintenance": + cmds.insert(0, "configure maintenance profile maintenance-mode") + else: + cmds.insert(0, "configure maintenance profile normal-mode") + + return cmds + + +def state_absent(module, existing, commands): + if module.params["mode"] == "maintenance": + cmds = ["no configure maintenance profile maintenance-mode"] + else: + cmds = ["no configure maintenance profile normal-mode"] + return cmds + + +def invoke(name, *args, **kwargs): + func = globals().get(name) + if func: + return func(*args, **kwargs) + + +def main(): + argument_spec = dict( + commands=dict(required=False, type="list", elements="str"), + mode=dict(required=True, choices=["maintenance", "normal"]), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + state = module.params["state"] + commands = module.params["commands"] or [] + + if state == "absent" and commands: + module.fail_json(msg="when state is absent, no command can be used.") + + existing = invoke("get_existing", module) + end_state = existing + changed = False + + result = {} + cmds = [] + if state == "present" or (state == "absent" and existing): + cmds = invoke("state_%s" % state, module, existing, commands) + + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + if cmds: + load_config(module, cmds) + changed = True + end_state = invoke("get_existing", module) + + result["changed"] = changed + if module._verbosity > 0: + end_state = invoke("get_existing", module) + result["end_state"] = end_state + result["existing"] = existing + result["proposed"] = commands + result["updates"] = cmds + + result["warnings"] = warnings + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp.py new file mode 100644 index 00000000..9d051e12 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp.py @@ -0,0 +1,537 @@ +#!/usr/bin/python +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +DOCUMENTATION = """ +module: nxos_hsrp +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages HSRP configuration on NX-OS switches. +description: +- Manages HSRP configuration on NX-OS switches. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- HSRP feature needs to be enabled first on the system. +- SVIs must exist before using this module. +- Interface must be a L3 port before using this module. +- HSRP cannot be configured on loopback interfaces. +- MD5 authentication is only possible with HSRPv2 while it is ignored if HSRPv1 is + used instead, while it will not raise any error. Here we allow MD5 authentication + only with HSRPv2 in order to enforce better practice. +options: + group: + description: + - HSRP group number. + required: true + type: str + interface: + description: + - Full name of interface that is being managed for HSRP. + required: true + type: str + version: + description: + - HSRP version. + default: 1 + choices: + - '1' + - '2' + type: str + priority: + description: + - HSRP priority or keyword 'default'. + type: str + preempt: + description: + - Enable/Disable preempt. + choices: + - enabled + - disabled + type: str + vip: + description: + - HSRP virtual IP address or keyword 'default' + type: str + auth_string: + description: + - Authentication string. If this needs to be hidden(for md5 type), the string + should be 7 followed by the key string. Otherwise, it can be 0 followed by key + string or just key string (for backward compatibility). For text type, this + should be just be a key string. if this is 'default', authentication is removed. + type: str + auth_type: + description: + - Authentication type. + choices: + - text + - md5 + type: str + state: + description: + - Specify desired state of the resource. + choices: + - present + - absent + default: present + type: str +""" + +EXAMPLES = """ +- name: Ensure HSRP is configured with following params on a SVI + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + +- name: Ensure HSRP is configured with following params on a SVI with clear text authentication + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + auth_type: text + auth_string: CISCO + +- name: Ensure HSRP is configured with md5 authentication and clear authentication + string + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + auth_type: md5 + auth_string: 0 1234 + +- name: Ensure HSRP is configured with md5 authentication and hidden authentication + string + cisco.nxos.nxos_hsrp: + group: 10 + vip: 10.1.1.1 + priority: 150 + interface: vlan10 + preempt: enabled + auth_type: md5 + auth_string: 7 1234 + +- name: Remove HSRP config for given interface, group, and VIP + cisco.nxos.nxos_hsrp: + group: 10 + interface: vlan10 + vip: 10.1.1.1 + state: absent +""" + +RETURN = r""" +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface vlan10", "hsrp version 2", "hsrp 30", "ip 10.30.1.1"] +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_interface_type, +) +from ansible.module_utils.basic import AnsibleModule + + +PARAM_TO_DEFAULT_KEYMAP = { + "vip": None, + "priority": "100", + "auth_type": "text", + "auth_string": "cisco", +} + + +def apply_key_map(key_map, table): + new_dict = {} + for key in table: + new_key = key_map.get(key) + if new_key: + value = table.get(key) + if value: + new_dict[new_key] = str(value) + else: + new_dict[new_key] = value + return new_dict + + +def get_interface_mode(interface, intf_type, module): + command = "show interface {0} | json".format(interface) + interface = {} + mode = "unknown" + try: + body = run_commands(module, [command])[0] + except IndexError: + return None + + if intf_type in ["ethernet", "portchannel"]: + interface_table = body["TABLE_interface"]["ROW_interface"] + mode = str(interface_table.get("eth_mode", "layer3")) + if mode == "access" or mode == "trunk": + mode = "layer2" + elif intf_type == "svi": + mode = "layer3" + return mode + + +def get_hsrp_group(group, interface, module): + command = "show hsrp group {0} all | json".format(group) + hsrp = {} + + hsrp_key = { + "sh_if_index": "interface", + "sh_group_num": "group", + "sh_group_version": "version", + "sh_cfg_prio": "priority", + "sh_preempt": "preempt", + "sh_vip": "vip", + "sh_authentication_type": "auth_type", + "sh_keystring_attr": "auth_enc", + "sh_authentication_data": "auth_string", + } + + try: + body = run_commands(module, [command])[0] + hsrp_table = body["TABLE_grp_detail"]["ROW_grp_detail"] + if "sh_keystring_attr" not in hsrp_table: + del hsrp_key["sh_keystring_attr"] + if "unknown enum:" in str(hsrp_table): + hsrp_table = get_hsrp_group_unknown_enum( + module, command, hsrp_table + ) + except (AttributeError, IndexError, TypeError, KeyError): + return {} + + if isinstance(hsrp_table, dict): + hsrp_table = [hsrp_table] + + for hsrp_group in hsrp_table: + parsed_hsrp = apply_key_map(hsrp_key, hsrp_group) + + parsed_hsrp["interface"] = parsed_hsrp["interface"].lower() + + if parsed_hsrp["version"] == "v1": + parsed_hsrp["version"] = "1" + elif parsed_hsrp["version"] == "v2": + parsed_hsrp["version"] = "2" + + if parsed_hsrp["auth_type"] == "md5": + if parsed_hsrp["auth_enc"] == "hidden": + parsed_hsrp["auth_enc"] = "7" + else: + parsed_hsrp["auth_enc"] = "0" + + if parsed_hsrp["interface"] == interface: + return parsed_hsrp + + return hsrp + + +def get_hsrp_group_unknown_enum(module, command, hsrp_table): + """Some older NXOS images fail to set the attr values when using structured output and + instead set the values to . This fallback method is a workaround that + uses an unstructured (text) request to query the device a second time. + 'sh_preempt' is currently the only attr affected. Add checks for other attrs as needed. + """ + if "unknown enum:" in hsrp_table["sh_preempt"]: + cmd = {"output": "text", "command": command.split("|")[0]} + out = run_commands(module, cmd)[0] + hsrp_table["sh_preempt"] = ( + "enabled" if ("may preempt" in out) else "disabled" + ) + return hsrp_table + + +def get_commands_remove_hsrp(group, interface): + commands = ["interface {0}".format(interface), "no hsrp {0}".format(group)] + return commands + + +def get_commands_config_hsrp(delta, interface, args, existing): + commands = [] + + config_args = { + "group": "hsrp {group}", + "priority": "{priority}", + "preempt": "{preempt}", + "vip": "{vip}", + } + + preempt = delta.get("preempt", None) + group = delta.get("group", None) + vip = delta.get("vip", None) + priority = delta.get("priority", None) + + if preempt: + if preempt == "enabled": + delta["preempt"] = "preempt" + elif preempt == "disabled": + delta["preempt"] = "no preempt" + + if priority: + if priority == "default": + if existing and existing.get( + "priority" + ) != PARAM_TO_DEFAULT_KEYMAP.get("priority"): + delta["priority"] = "no priority" + else: + del delta["priority"] + else: + delta["priority"] = "priority {0}".format(delta["priority"]) + + if vip: + if vip == "default": + if existing and existing.get("vip") != PARAM_TO_DEFAULT_KEYMAP.get( + "vip" + ): + delta["vip"] = "no ip" + else: + del delta["vip"] + else: + delta["vip"] = "ip {0}".format(delta["vip"]) + + for key in delta: + command = config_args.get(key, "DNE").format(**delta) + if command and command != "DNE": + if key == "group": + commands.insert(0, command) + else: + commands.append(command) + command = None + + auth_type = delta.get("auth_type", None) + auth_string = delta.get("auth_string", None) + auth_enc = delta.get("auth_enc", None) + if auth_type or auth_string: + if not auth_type: + auth_type = args["auth_type"] + elif not auth_string: + auth_string = args["auth_string"] + if auth_string != "default": + if auth_type == "md5": + command = "authentication md5 key-string {0} {1}".format( + auth_enc, auth_string + ) + commands.append(command) + elif auth_type == "text": + command = "authentication text {0}".format(auth_string) + commands.append(command) + else: + if existing and existing.get( + "auth_string" + ) != PARAM_TO_DEFAULT_KEYMAP.get("auth_string"): + commands.append("no authentication") + + if commands and not group: + commands.insert(0, "hsrp {0}".format(args["group"])) + + version = delta.get("version", None) + if version: + if version == "2": + command = "hsrp version 2" + elif version == "1": + command = "hsrp version 1" + commands.insert(0, command) + commands.insert(0, "interface {0}".format(interface)) + + if commands: + if not commands[0].startswith("interface"): + commands.insert(0, "interface {0}".format(interface)) + + return commands + + +def is_default(interface, module): + command = "show run interface {0}".format(interface) + + try: + body = run_commands(module, [command], check_rc=False)[0] + if "invalid" in body.lower(): + return "DNE" + else: + raw_list = body.split("\n") + if raw_list[-1].startswith("interface"): + return True + else: + return False + except (KeyError): + return "DNE" + + +def validate_config(body, vip, module): + new_body = "".join(body) + if "invalid ip address" in new_body.lower(): + module.fail_json( + msg="Invalid VIP. Possible duplicate IP address.", vip=vip + ) + + +def main(): + argument_spec = dict( + group=dict(required=True, type="str"), + interface=dict(required=True), + version=dict(choices=["1", "2"], default="1", required=False), + priority=dict(type="str", required=False), + preempt=dict( + type="str", choices=["disabled", "enabled"], required=False + ), + vip=dict(type="str", required=False), + auth_type=dict(choices=["text", "md5"], required=False), + auth_string=dict(type="str", required=False), + state=dict( + choices=["absent", "present"], required=False, default="present" + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = dict(changed=False, warnings=warnings) + + interface = module.params["interface"].lower() + group = module.params["group"] + version = module.params["version"] + state = module.params["state"] + priority = module.params["priority"] + preempt = module.params["preempt"] + vip = module.params["vip"] + auth_type = module.params["auth_type"] + auth_full_string = module.params["auth_string"] + auth_enc = "0" + auth_string = None + if auth_full_string: + kstr = auth_full_string.split() + if len(kstr) == 2: + auth_enc = kstr[0] + auth_string = kstr[1] + elif len(kstr) == 1: + auth_string = kstr[0] + else: + module.fail_json(msg="Invalid auth_string") + if auth_enc != "0" and auth_enc != "7": + module.fail_json(msg="Invalid auth_string, only 0 or 7 allowed") + + device_info = get_capabilities(module) + network_api = device_info.get("network_api", "nxapi") + + intf_type = get_interface_type(interface) + if intf_type != "ethernet" and network_api == "cliconf": + if is_default(interface, module) == "DNE": + module.fail_json( + msg="That interface does not exist yet. Create " "it first.", + interface=interface, + ) + if intf_type == "loopback": + module.fail_json( + msg="Loopback interfaces don't support HSRP.", + interface=interface, + ) + + mode = get_interface_mode(interface, intf_type, module) + if mode == "layer2": + module.fail_json( + msg="That interface is a layer2 port.\nMake it " + "a layer 3 port first.", + interface=interface, + ) + + if auth_type or auth_string: + if not (auth_type and auth_string): + module.fail_json( + msg="When using auth parameters, you need BOTH " + "auth_type AND auth_string." + ) + + args = dict( + group=group, + version=version, + priority=priority, + preempt=preempt, + vip=vip, + auth_type=auth_type, + auth_string=auth_string, + auth_enc=auth_enc, + ) + + proposed = dict((k, v) for k, v in args.items() if v is not None) + + existing = get_hsrp_group(group, interface, module) + + # This will enforce better practice with md5 and hsrp version. + if proposed.get("auth_type", None) == "md5": + if proposed["version"] == "1": + module.fail_json( + msg="It's recommended to use HSRP v2 " "when auth_type=md5" + ) + + elif not proposed.get("auth_type", None) and existing: + if ( + proposed["version"] == "1" and existing["auth_type"] == "md5" + ) and state == "present": + module.fail_json( + msg="Existing auth_type is md5. It's recommended " + "to use HSRP v2 when using md5" + ) + + commands = [] + if state == "present": + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = get_commands_config_hsrp( + delta, interface, args, existing + ) + commands.extend(command) + + elif state == "absent": + if existing: + command = get_commands_remove_hsrp(group, interface) + commands.extend(command) + + if commands: + if module.check_mode: + module.exit_json(**results) + else: + load_config(module, commands) + + # validate IP + if network_api == "cliconf" and state == "present": + commands.insert(0, "config t") + body = run_commands(module, commands) + validate_config(body, vip, module) + + results["changed"] = True + + if "configure" in commands: + commands.pop(0) + + results["commands"] = commands + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp_interfaces.py new file mode 100644 index 00000000..3b42f4c6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_hsrp_interfaces.py @@ -0,0 +1,261 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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 module file for nxos_hsrp_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_hsrp_interfaces +short_description: HSRP interfaces resource module +description: Manages Hot Standby Router Protocol (HSRP) interface attributes. +version_added: 1.0.0 +author: Chris Van Heuveln (@chrisvanheuveln) +notes: +- Tested against NX-OS 7.0(3)I5(1). +- Feature bfd should be enabled for this module. +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section '^interface'). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: The provided configuration + type: list + elements: dict + suboptions: + name: + type: str + description: The name of the interface. + bfd: + type: str + description: + - Enable/Disable HSRP Bidirectional Forwarding Detection (BFD) on the interface. + choices: + - enable + - disable + state: + description: + - The state the configuration should be left in + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using deleted + +- name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + - name: Ethernet1/2 + operation: deleted + + +# Using merged + +- name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + - name: Ethernet1/2 + bfd: disable + operation: merged + + +# Using overridden + +- name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + - name: Ethernet1/2 + bfd: disable + operation: overridden + + +# Using replaced + +- name: Configure hsrp attributes on interfaces + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/1 + bfd: enable + - name: Ethernet1/2 + bfd: disable + operation: replaced + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/800 + bfd: enable + - name: Ethernet1/801 + bfd: enable + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/800" +# - "hsrp bfd" +# - "interface Ethernet1/801" +# - "hsrp bfd" + +# Using parsed + +# parsed.cfg +# ------------ +# interface Ethernet1/800 +# no switchport +# hsrp bfd +# interface Ethernet1/801 +# no switchport +# hsrp bfd + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_hsrp_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- + +# parsed: +# - name: Ethernet1/800 +# bfd: enable +# - name: Ethernet1/801 +# bfd: enable + +# Using gathered + +# Existing device config state +# ------------------------------- + +# interface Ethernet1/1 +# no switchport +# hsrp bfd +# interface Ethernet1/2 +# no switchport +# hsrp bfd +# interface Ethernet1/3 +# no switchport + +- name: Gather hsrp_interfaces facts from the device using nxos_hsrp_interfaces + cisco.nxos.nxos_hsrp_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- + +# gathered: +# - name: Ethernet1/1 +# bfd: enable +# - name: Ethernet1/2 +# bfd: enable + +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface Ethernet1/1', 'hsrp bfd'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.hsrp_interfaces.hsrp_interfaces import ( + Hsrp_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.hsrp_interfaces.hsrp_interfaces import ( + Hsrp_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=Hsrp_interfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Hsrp_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp.py new file mode 100644 index 00000000..4909a877 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp.py @@ -0,0 +1,168 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_igmp +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages IGMP global configuration. +description: +- Manages IGMP global configuration configuration settings. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- When C(state=default), all supported params will be reset to a default state. +- If restart is set to true with other params set, the restart will happen last, i.e. + after the configuration takes place. +options: + flush_routes: + description: + - Removes routes when the IGMP process is restarted. By default, routes are not + flushed. + type: bool + enforce_rtr_alert: + description: + - Enables or disables the enforce router alert option check for IGMPv2 and IGMPv3 + packets. + type: bool + restart: + description: + - Restarts the igmp process (using an exec config command). + type: bool + default: False + state: + description: + - Manages desired state of the resource. + default: present + choices: + - present + - default + type: str +""" +EXAMPLES = """ +- name: Default igmp global params (all params except restart) + cisco.nxos.nxos_igmp: + state: default + +- name: Ensure the following igmp global config exists on the device + cisco.nxos.nxos_igmp: + flush_routes: true + enforce_rtr_alert: true + +- name: Restart the igmp process + cisco.nxos.nxos_igmp: + restart: true +""" + +RETURN = """ +updates: + description: commands sent to the device + returned: always + type: list + sample: ["ip igmp flush-routes"] +""" +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def get_current(module): + output = run_commands( + module, {"command": "show running-config", "output": "text"} + ) + return { + "flush_routes": "ip igmp flush-routes" in output[0], + "enforce_rtr_alert": "ip igmp enforce-router-alert" in output[0], + } + + +def get_desired(module): + return { + "flush_routes": module.params["flush_routes"], + "enforce_rtr_alert": module.params["enforce_rtr_alert"], + } + + +def main(): + argument_spec = dict( + flush_routes=dict(type="bool"), + enforce_rtr_alert=dict(type="bool"), + restart=dict(type="bool", default=False), + state=dict(choices=["present", "default"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + current = get_current(module) + desired = get_desired(module) + + state = module.params["state"] + + commands = list() + + if state == "default": + if current["flush_routes"]: + commands.append("no ip igmp flush-routes") + if current["enforce_rtr_alert"]: + commands.append("no ip igmp enforce-router-alert") + + elif state == "present": + ldict = { + "flush_routes": "flush-routes", + "enforce_rtr_alert": "enforce-router-alert", + } + for arg in ["flush_routes", "enforce_rtr_alert"]: + if desired[arg] and not current[arg]: + commands.append("ip igmp {0}".format(ldict.get(arg))) + elif current[arg] and not desired[arg]: + commands.append("no ip igmp {0}".format(ldict.get(arg))) + + result = {"changed": False, "updates": commands, "warnings": warnings} + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + if module.params["restart"]: + cmd = {"command": "restart igmp", "output": "text"} + run_commands(module, cmd) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_interface.py new file mode 100644 index 00000000..07f6b18f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_interface.py @@ -0,0 +1,687 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_igmp_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages IGMP interface configuration. +description: +- Manages IGMP interface configuration settings. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- When C(state=default), supported params will be reset to a default state. These + include C(version), C(startup_query_interval), C(startup_query_count), C(robustness), + C(querier_timeout), C(query_mrt), C(query_interval), C(last_member_qrt), C(last_member_query_count), + C(group_timeout), C(report_llg), and C(immediate_leave). +- When C(state=absent), all configs for C(oif_ps), and C(oif_routemap) will be removed. +- PIM must be enabled to use this module. +- This module is for Layer 3 interfaces. +- Route-map check not performed (same as CLI) check when configuring route-map with + 'static-oif' +- If restart is set to true with other params set, the restart will happen last, i.e. + after the configuration takes place. However, 'restart' itself is not idempotent + as it is an action and not configuration. +options: + interface: + description: + - The full interface name for IGMP configuration. e.g. I(Ethernet1/2). + required: true + type: str + version: + description: + - IGMP version. It can be 2 or 3 or keyword 'default'. + choices: + - '2' + - '3' + - default + type: str + startup_query_interval: + description: + - Query interval used when the IGMP process starts up. The range is from 1 to + 18000 or keyword 'default'. The default is 31. + type: str + startup_query_count: + description: + - Query count used when the IGMP process starts up. The range is from 1 to 10 + or keyword 'default'. The default is 2. + type: str + robustness: + description: + - Sets the robustness variable. Values can range from 1 to 7 or keyword 'default'. + The default is 2. + type: str + querier_timeout: + description: + - Sets the querier timeout that the software uses when deciding to take over as + the querier. Values can range from 1 to 65535 seconds or keyword 'default'. + The default is 255 seconds. + type: str + query_mrt: + description: + - Sets the response time advertised in IGMP queries. Values can range from 1 to + 25 seconds or keyword 'default'. The default is 10 seconds. + type: str + query_interval: + description: + - Sets the frequency at which the software sends IGMP host query messages. Values + can range from 1 to 18000 seconds or keyword 'default'. The default is 125 seconds. + type: str + last_member_qrt: + description: + - Sets the query interval waited after sending membership reports before the software + deletes the group state. Values can range from 1 to 25 seconds or keyword 'default'. + The default is 1 second. + type: str + last_member_query_count: + description: + - Sets the number of times that the software sends an IGMP query in response to + a host leave message. Values can range from 1 to 5 or keyword 'default'. The + default is 2. + type: str + group_timeout: + description: + - Sets the group membership timeout for IGMPv2. Values can range from 3 to 65,535 + seconds or keyword 'default'. The default is 260 seconds. + type: str + report_llg: + description: + - Configures report-link-local-groups. Enables sending reports for groups in 224.0.0.0/24. + Reports are always sent for nonlink local groups. By default, reports are not + sent for link local groups. + type: bool + immediate_leave: + description: + - Enables the device to remove the group entry from the multicast routing table + immediately upon receiving a leave message for the group. Use this command to + minimize the leave latency of IGMPv2 group memberships on a given IGMP interface + because the device does not send group-specific queries. The default is disabled. + type: bool + oif_routemap: + description: + - Configure a routemap for static outgoing interface (OIF) or keyword 'default'. + type: str + oif_ps: + description: + - Configure prefixes and sources for static outgoing interface (OIF). This is + a list of dict where each dict has source and prefix defined or just prefix + if source is not needed. The specified values will be configured on the device + and if any previous prefix/sources exist, they will be removed. Keyword 'default' + is also accepted which removes all existing prefix/sources. + type: raw + restart: + description: + - Restart IGMP. This is NOT idempotent as this is action only. + type: bool + default: false + state: + description: + - Manages desired state of the resource. + default: present + choices: + - present + - absent + - default + type: str +""" +EXAMPLES = """ +- cisco.nxos.nxos_igmp_interface: + interface: ethernet1/32 + startup_query_interval: 30 + oif_ps: + - {prefix: 238.2.2.6} + - {source: 192.168.0.1, prefix: 238.2.2.5} + state: present +""" +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"startup_query_count": "30", + "oif_ps": [{'prefix': '238.2.2.6'}, {'source': '192.168.0.1', 'prefix': '238.2.2.5'}]} +existing: + description: k/v pairs of existing igmp_interface configuration + returned: always + type: dict + sample: {"startup_query_count": "2", "oif_ps": []} +end_state: + description: k/v pairs of igmp interface configuration after module execution + returned: always + type: dict + sample: {"startup_query_count": "30", + "oif_ps": [{'prefix': '238.2.2.6'}, {'source': '192.168.0.1', 'prefix': '238.2.2.5'}]} +updates: + description: commands sent to the device + returned: always + type: list + sample: ["interface Ethernet1/32", "ip igmp startup-query-count 30", + "ip igmp static-oif 238.2.2.6", "ip igmp static-oif 238.2.2.5 source 192.168.0.1"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_interface_type, +) +from ansible.module_utils.basic import AnsibleModule + +import re + + +def execute_show_command(command, module, command_type="cli_show"): + if command_type == "cli_show_ascii": + cmds = [{"command": command, "output": "text"}] + else: + cmds = [{"command": command, "output": "json"}] + + return run_commands(module, cmds) + + +def get_interface_mode(interface, intf_type, module): + command = "show interface {0}".format(interface) + interface = {} + mode = "unknown" + + if intf_type in ["ethernet", "portchannel"]: + body = execute_show_command(command, module)[0] + interface_table = body["TABLE_interface"]["ROW_interface"] + mode = str(interface_table.get("eth_mode", "layer3")) + if mode == "access" or mode == "trunk": + mode = "layer2" + elif intf_type == "loopback" or intf_type == "svi": + mode = "layer3" + return mode + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + value = table.get(key) + if value: + new_dict[new_key] = value + else: + new_dict[new_key] = value + return new_dict + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_igmp_interface(module, interface): + command = "show ip igmp interface {0}".format(interface) + igmp = {} + + key_map = { + "IGMPVersion": "version", + "ConfiguredStartupQueryInterval": "startup_query_interval", + "StartupQueryCount": "startup_query_count", + "RobustnessVariable": "robustness", + "ConfiguredQuerierTimeout": "querier_timeout", + "ConfiguredMaxResponseTime": "query_mrt", + "ConfiguredQueryInterval": "query_interval", + "LastMemberMTR": "last_member_qrt", + "LastMemberQueryCount": "last_member_query_count", + "ConfiguredGroupTimeout": "group_timeout", + } + + body = execute_show_command(command, module)[0] + + if body: + if "not running" in body: + return igmp + resource = body["TABLE_vrf"]["ROW_vrf"]["TABLE_if"]["ROW_if"] + igmp = apply_key_map(key_map, resource) + report_llg = str(resource["ReportingForLinkLocal"]).lower() + if report_llg == "true": + igmp["report_llg"] = True + elif report_llg == "false": + igmp["report_llg"] = False + + immediate_leave = str( + resource["ImmediateLeave"] + ).lower() # returns en or dis + if re.search(r"^en|^true|^enabled", immediate_leave): + igmp["immediate_leave"] = True + elif re.search(r"^dis|^false|^disabled", immediate_leave): + igmp["immediate_leave"] = False + + # the next block of code is used to retrieve anything with: + # ip igmp static-oif *** i.e.. could be route-map ROUTEMAP + # or PREFIX source , etc. + command = "show run interface {0} | inc oif".format(interface) + + body = execute_show_command( + command, module, command_type="cli_show_ascii" + )[0] + + staticoif = [] + if body: + split_body = body.split("\n") + route_map_regex = ( + r".*ip igmp static-oif route-map\s+" r"(?P\S+).*" + ) + prefix_source_regex = ( + r".*ip igmp static-oif\s+(?P" + r"((\d+.){3}\d+))(\ssource\s" + r"(?P\S+))?.*" + ) + + for line in split_body: + temp = {} + try: + match_route_map = re.match(route_map_regex, line, re.DOTALL) + route_map = match_route_map.groupdict()["route_map"] + except AttributeError: + route_map = "" + + try: + match_prefix_source = re.match( + prefix_source_regex, line, re.DOTALL + ) + prefix_source_group = match_prefix_source.groupdict() + prefix = prefix_source_group["prefix"] + source = prefix_source_group["source"] + except AttributeError: + prefix = "" + source = "" + + if route_map: + temp["route_map"] = route_map + if prefix: + temp["prefix"] = prefix + if source: + temp["source"] = source + if temp: + staticoif.append(temp) + + igmp["oif_routemap"] = None + igmp["oif_prefix_source"] = [] + + if staticoif: + if len(staticoif) == 1 and staticoif[0].get("route_map"): + igmp["oif_routemap"] = staticoif[0]["route_map"] + else: + igmp["oif_prefix_source"] = staticoif + + return igmp + + +def config_igmp_interface(delta, existing, existing_oif_prefix_source): + CMDS = { + "version": "ip igmp version {0}", + "startup_query_interval": "ip igmp startup-query-interval {0}", + "startup_query_count": "ip igmp startup-query-count {0}", + "robustness": "ip igmp robustness-variable {0}", + "querier_timeout": "ip igmp querier-timeout {0}", + "query_mrt": "ip igmp query-max-response-time {0}", + "query_interval": "ip igmp query-interval {0}", + "last_member_qrt": "ip igmp last-member-query-response-time {0}", + "last_member_query_count": "ip igmp last-member-query-count {0}", + "group_timeout": "ip igmp group-timeout {0}", + "report_llg": "ip igmp report-link-local-groups", + "immediate_leave": "ip igmp immediate-leave", + "oif_prefix_source": "ip igmp static-oif {0} source {1} ", + "oif_routemap": "ip igmp static-oif route-map {0}", + "oif_prefix": "ip igmp static-oif {0}", + } + + commands = [] + command = None + def_vals = get_igmp_interface_defaults() + + for key, value in delta.items(): + if key == "oif_ps" and value != "default": + for each in value: + if each in existing_oif_prefix_source: + existing_oif_prefix_source.remove(each) + else: + # add new prefix/sources + pf = each["prefix"] + src = "" + if "source" in each.keys(): + src = each["source"] + if src: + commands.append( + CMDS.get("oif_prefix_source").format(pf, src) + ) + else: + commands.append(CMDS.get("oif_prefix").format(pf)) + if existing_oif_prefix_source: + for each in existing_oif_prefix_source: + # remove stale prefix/sources + pf = each["prefix"] + src = "" + if "source" in each.keys(): + src = each["source"] + if src: + commands.append( + "no " + + CMDS.get("oif_prefix_source").format(pf, src) + ) + else: + commands.append( + "no " + CMDS.get("oif_prefix").format(pf) + ) + elif key == "oif_routemap": + if value == "default": + if existing.get(key): + command = "no " + CMDS.get(key).format(existing.get(key)) + else: + command = CMDS.get(key).format(value) + elif value: + if value == "default": + if def_vals.get(key) != existing.get(key): + command = CMDS.get(key).format(def_vals.get(key)) + else: + command = CMDS.get(key).format(value) + elif not value: + command = "no {0}".format(CMDS.get(key).format(value)) + + if command: + if command not in commands: + commands.append(command) + command = None + + return commands + + +def get_igmp_interface_defaults(): + version = "2" + startup_query_interval = "31" + startup_query_count = "2" + robustness = "2" + querier_timeout = "255" + query_mrt = "10" + query_interval = "125" + last_member_qrt = "1" + last_member_query_count = "2" + group_timeout = "260" + report_llg = False + immediate_leave = False + + args = dict( + version=version, + startup_query_interval=startup_query_interval, + startup_query_count=startup_query_count, + robustness=robustness, + querier_timeout=querier_timeout, + query_mrt=query_mrt, + query_interval=query_interval, + last_member_qrt=last_member_qrt, + last_member_query_count=last_member_query_count, + group_timeout=group_timeout, + report_llg=report_llg, + immediate_leave=immediate_leave, + ) + + default = dict( + (param, value) for (param, value) in args.items() if value is not None + ) + + return default + + +def config_default_igmp_interface(existing, delta): + commands = [] + proposed = get_igmp_interface_defaults() + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = config_igmp_interface( + delta, existing, existing_oif_prefix_source=None + ) + + if command: + for each in command: + commands.append(each) + + return commands + + +def config_remove_oif(existing, existing_oif_prefix_source): + commands = [] + command = None + if existing.get("oif_routemap"): + commands.append( + "no ip igmp static-oif route-map {0}".format( + existing.get("oif_routemap") + ) + ) + elif existing_oif_prefix_source: + for each in existing_oif_prefix_source: + if each.get("prefix") and each.get("source"): + command = "no ip igmp static-oif {0} source {1} ".format( + each.get("prefix"), each.get("source") + ) + elif each.get("prefix"): + command = "no ip igmp static-oif {0}".format( + each.get("prefix") + ) + if command: + commands.append(command) + command = None + + return commands + + +def main(): + argument_spec = dict( + interface=dict(required=True, type="str"), + version=dict( + required=False, type="str", choices=["2", "3", "default"] + ), + startup_query_interval=dict(required=False, type="str"), + startup_query_count=dict(required=False, type="str"), + robustness=dict(required=False, type="str"), + querier_timeout=dict(required=False, type="str"), + query_mrt=dict(required=False, type="str"), + query_interval=dict(required=False, type="str"), + last_member_qrt=dict(required=False, type="str"), + last_member_query_count=dict(required=False, type="str"), + group_timeout=dict(required=False, type="str"), + report_llg=dict(type="bool"), + immediate_leave=dict(type="bool"), + oif_routemap=dict(required=False, type="str"), + oif_ps=dict(required=False, type="raw"), + restart=dict(type="bool", default=False), + state=dict( + choices=["present", "absent", "default"], default="present" + ), + ) + + argument_spec.update(nxos_argument_spec) + mutually_exclusive = [("oif_ps", "oif_routemap")] + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + + state = module.params["state"] + interface = module.params["interface"] + oif_routemap = module.params["oif_routemap"] + oif_ps = module.params["oif_ps"] + + intf_type = get_interface_type(interface) + if get_interface_mode(interface, intf_type, module) == "layer2": + module.fail_json(msg="this module only works on Layer 3 interfaces") + + existing = get_igmp_interface(module, interface) + existing_copy = existing.copy() + end_state = existing_copy + + if not existing.get("version"): + module.fail_json(msg="pim needs to be enabled on the interface") + + existing_oif_prefix_source = existing.get("oif_prefix_source") + # not json serializable + existing.pop("oif_prefix_source") + + if oif_routemap and existing_oif_prefix_source: + module.fail_json( + msg="Delete static-oif configurations on this " + "interface if you want to use a routemap" + ) + + if oif_ps and existing.get("oif_routemap"): + module.fail_json( + msg="Delete static-oif route-map configuration " + "on this interface if you want to config " + "static entries" + ) + + args = [ + "version", + "startup_query_interval", + "startup_query_count", + "robustness", + "querier_timeout", + "query_mrt", + "query_interval", + "last_member_qrt", + "last_member_query_count", + "group_timeout", + "report_llg", + "immediate_leave", + "oif_routemap", + ] + + changed = False + commands = [] + proposed = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + CANNOT_ABSENT = [ + "version", + "startup_query_interval", + "startup_query_count", + "robustness", + "querier_timeout", + "query_mrt", + "query_interval", + "last_member_qrt", + "last_member_query_count", + "group_timeout", + "report_llg", + "immediate_leave", + ] + + if state == "absent": + for each in CANNOT_ABSENT: + if each in proposed: + module.fail_json( + msg="only params: " + "oif_ps, oif_routemap can be used when " + "state=absent" + ) + + # delta check for all params except oif_ps + delta = dict(set(proposed.items()).difference(existing.items())) + + if oif_ps: + if oif_ps == "default": + delta["oif_ps"] = [] + else: + delta["oif_ps"] = oif_ps + + if state == "present": + if delta: + command = config_igmp_interface( + delta, existing, existing_oif_prefix_source + ) + if command: + commands.append(command) + + elif state == "default": + command = config_default_igmp_interface(existing, delta) + if command: + commands.append(command) + elif state == "absent": + command = None + if existing.get("oif_routemap") or existing_oif_prefix_source: + command = config_remove_oif(existing, existing_oif_prefix_source) + + if command: + commands.append(command) + + command = config_default_igmp_interface(existing, delta) + if command: + commands.append(command) + + cmds = [] + results = {} + if commands: + commands.insert(0, ["interface {0}".format(interface)]) + cmds = flatten_list(commands) + + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + load_config(module, cmds) + changed = True + end_state = get_igmp_interface(module, interface) + if "configure" in cmds: + cmds.pop(0) + + if module.params["restart"]: + cmd = {"command": "restart igmp", "output": "text"} + run_commands(module, cmd) + + results["proposed"] = proposed + results["existing"] = existing_copy + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + results["end_state"] = end_state + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_snooping.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_snooping.py new file mode 100644 index 00000000..194e610d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_igmp_snooping.py @@ -0,0 +1,321 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_igmp_snooping +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages IGMP snooping global configuration. +description: +- Manages IGMP snooping global configuration. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- When C(state=default), params will be reset to a default state. +- C(group_timeout) also accepts I(never) as an input. +options: + snooping: + description: + - Enables/disables IGMP snooping on the switch. + type: bool + group_timeout: + description: + - Group membership timeout value for all VLANs on the device. Accepted values + are integer in range 1-10080, I(never) and I(default). + type: str + link_local_grp_supp: + description: + - Global link-local groups suppression. + type: bool + report_supp: + description: + - Global IGMPv1/IGMPv2 Report Suppression. + type: bool + v3_report_supp: + description: + - Global IGMPv3 Report Suppression and Proxy Reporting. + type: bool + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - default + type: str +""" + +EXAMPLES = """ +# ensure igmp snooping params supported in this module are in there default state +- cisco.nxos.nxos_igmp_snooping: + state: default + +# ensure following igmp snooping params are in the desired state +- cisco.nxos.nxos_igmp_snooping: + group_timeout: never + snooping: true + link_local_grp_supp: false + optimize_mcast_flood: false + report_supp: true + v3_report_supp: true +""" + +RETURN = """ +commands: + description: command sent to the device + returned: always + type: list + sample: ["ip igmp snooping link-local-groups-suppression", + "ip igmp snooping group-timeout 50", + "no ip igmp snooping report-suppression", + "no ip igmp snooping v3-report-suppression", + "no ip igmp snooping"] +""" + + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module, output="text"): + command = {"command": command, "output": output} + + return run_commands(module, [command]) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_group_timeout(config): + match = re.search(r" Group timeout configured: (\S+)", config, re.M) + if match: + value = match.group(1) + else: + value = "" + return value + + +def get_igmp_snooping(module): + command = "show ip igmp snooping" + existing = {} + + try: + body = execute_show_command(command, module, output="json")[0] + except IndexError: + body = [] + + if body: + snooping = str(body.get("enabled")).lower() + if snooping == "true" or snooping == "enabled": + existing["snooping"] = True + else: + existing["snooping"] = False + + report_supp = str(body.get("grepsup")).lower() + if report_supp == "true" or report_supp == "enabled": + existing["report_supp"] = True + else: + existing["report_supp"] = False + + link_local_grp_supp = str(body.get("glinklocalgrpsup")).lower() + if link_local_grp_supp == "true" or link_local_grp_supp == "enabled": + existing["link_local_grp_supp"] = True + else: + existing["link_local_grp_supp"] = False + + v3_report_supp = str(body.get("gv3repsup")).lower() + if v3_report_supp == "true" or v3_report_supp == "enabled": + existing["v3_report_supp"] = True + else: + existing["v3_report_supp"] = False + + command = "show ip igmp snooping" + body = execute_show_command(command, module)[0] + if body: + existing["group_timeout"] = get_group_timeout(body) + + return existing + + +def config_igmp_snooping(delta, existing, default=False): + CMDS = { + "snooping": "ip igmp snooping", + "group_timeout": "ip igmp snooping group-timeout {}", + "link_local_grp_supp": "ip igmp snooping link-local-groups-suppression", + "v3_report_supp": "ip igmp snooping v3-report-suppression", + "report_supp": "ip igmp snooping report-suppression", + } + + commands = [] + command = None + gt_command = None + for key, value in delta.items(): + if value: + if default and key == "group_timeout": + if existing.get(key): + gt_command = "no " + CMDS.get(key).format( + existing.get(key) + ) + elif value == "default" and key == "group_timeout": + if existing.get(key): + command = "no " + CMDS.get(key).format(existing.get(key)) + else: + command = CMDS.get(key).format(value) + else: + command = "no " + CMDS.get(key).format(value) + + if command: + commands.append(command) + command = None + + if gt_command: + # ensure that group-timeout command is configured last + commands.append(gt_command) + return commands + + +def get_igmp_snooping_defaults(): + group_timeout = "dummy" + report_supp = True + link_local_grp_supp = True + v3_report_supp = False + snooping = True + + args = dict( + snooping=snooping, + link_local_grp_supp=link_local_grp_supp, + report_supp=report_supp, + v3_report_supp=v3_report_supp, + group_timeout=group_timeout, + ) + + default = dict( + (param, value) for (param, value) in args.items() if value is not None + ) + + return default + + +def igmp_snooping_gt_dependency(command, existing, module): + # group-timeout will fail if igmp snooping is disabled + gt = [i for i in command if i.startswith("ip igmp snooping group-timeout")] + if gt: + if "no ip igmp snooping" in command or ( + existing["snooping"] is False and "ip igmp snooping" not in command + ): + msg = "group-timeout cannot be enabled or changed when ip igmp snooping is disabled" + module.fail_json(msg=msg) + else: + # ensure that group-timeout command is configured last + command.remove(gt[0]) + command.append(gt[0]) + + +def main(): + argument_spec = dict( + snooping=dict(required=False, type="bool"), + group_timeout=dict(required=False, type="str"), + link_local_grp_supp=dict(required=False, type="bool"), + report_supp=dict(required=False, type="bool"), + v3_report_supp=dict(required=False, type="bool"), + state=dict(choices=["present", "default"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + snooping = module.params["snooping"] + link_local_grp_supp = module.params["link_local_grp_supp"] + report_supp = module.params["report_supp"] + v3_report_supp = module.params["v3_report_supp"] + group_timeout = module.params["group_timeout"] + state = module.params["state"] + + args = dict( + snooping=snooping, + link_local_grp_supp=link_local_grp_supp, + report_supp=report_supp, + v3_report_supp=v3_report_supp, + group_timeout=group_timeout, + ) + + proposed = dict( + (param, value) for (param, value) in args.items() if value is not None + ) + + existing = get_igmp_snooping(module) + + commands = [] + if state == "present": + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = config_igmp_snooping(delta, existing) + if command: + if group_timeout: + igmp_snooping_gt_dependency(command, existing, module) + commands.append(command) + elif state == "default": + proposed = get_igmp_snooping_defaults() + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = config_igmp_snooping(delta, existing, default=True) + if command: + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_install_os.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_install_os.py new file mode 100644 index 00000000..bd9a8858 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_install_os.py @@ -0,0 +1,607 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_install_os +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Set boot options like boot, kickstart image and issu. +description: +- Install an operating system by setting the boot options like boot image and kickstart + image and optionally select to install using ISSU (In Server Software Upgrade). +version_added: 1.0.0 +notes: +- Tested against the following platforms and images - N9k 7.0(3)I4(6), 7.0(3)I5(3), + 7.0(3)I6(1), 7.0(3)I7(1), 7.0(3)F2(2), 7.0(3)F3(2) - N3k 6.0(2)A8(6), 6.0(2)A8(8), + 7.0(3)I6(1), 7.0(3)I7(1) - N7k 7.3(0)D1(1), 8.0(1), 8.1(1), 8.2(1) +- This module requires both the ANSIBLE_PERSISTENT_CONNECT_TIMEOUT and ANSIBLE_PERSISTENT_COMMAND_TIMEOUT + timers to be set to 600 seconds or higher. The module will exit if the timers are + not set properly. +- When using connection local, ANSIBLE_PERSISTENT_CONNECT_TIMEOUT and ANSIBLE_PERSISTENT_COMMAND_TIMEOUT + can only be set using ENV variables or the ansible.cfg file. +- Do not include full file paths, just the name of the file(s) stored on the top level + flash directory. +- This module attempts to install the software immediately, which may trigger a reboot. +- In check mode, the module will indicate if an upgrade is needed and whether or not + the upgrade is disruptive or non-disruptive(ISSU). +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbibo (@GGabriele) +options: + system_image_file: + description: + - Name of the system (or combined) image file on flash. + required: true + type: str + kickstart_image_file: + description: + - Name of the kickstart image file on flash. (Not required on all Nexus platforms) + type: str + issu: + description: + - Upgrade using In Service Software Upgrade (ISSU). (Supported on N5k, N7k, N9k + platforms) + - Selecting 'required' or 'yes' means that upgrades will only proceed if the switch + is capable of ISSU. + - Selecting 'desired' means that upgrades will use ISSU if possible but will fall + back to disruptive upgrade if needed. + - Selecting 'no' means do not use ISSU. Forced disruptive. + choices: + - "required" + - "desired" + - "yes" + - "no" + default: "no" + type: str +""" + +EXAMPLES = """ +- name: Install OS on N9k + check_mode: no + cisco.nxos.nxos_install_os: + system_image_file: nxos.7.0.3.I6.1.bin + issu: desired + +- name: Wait for device to come back up with new image + wait_for: + port: 22 + state: started + timeout: 500 + delay: 60 + host: '{{ inventory_hostname }}' + +- name: Check installed OS for newly installed version + nxos_command: + commands: [show version | json] + provider: '{{ connection }}' + register: output +- assert: + that: + - output['stdout'][0]['kickstart_ver_str'] == '7.0(3)I6(1)' +""" + +RETURN = """ +install_state: + description: Boot and install information. + returned: always + type: dict + sample: { + "install_state": [ + "Compatibility check is done:", + "Module bootable Impact Install-type Reason", + "------ -------- -------------- ------------ ------", + " 1 yes non-disruptive reset ", + "Images will be upgraded according to following table:", + "Module Image Running-Version(pri:alt) New-Version Upg-Required", + "------ ---------- ---------------------------------------- -------------------- ------------", + " 1 nxos 7.0(3)I6(1) 7.0(3)I7(1) yes", + " 1 bios v4.4.0(07/12/2017) v4.4.0(07/12/2017) no" + ], + } +""" + + +import re +from time import sleep +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +# Output options are 'text' or 'json' +def execute_show_command(module, command, output="text"): + cmds = [{"command": command, "output": output}] + + return run_commands(module, cmds) + + +def get_platform(module): + """Determine platform type""" + data = execute_show_command(module, "show inventory", "json") + pid = data[0]["TABLE_inv"]["ROW_inv"][0]["productid"] + + if re.search(r"N3K", pid): + type = "N3K" + elif re.search(r"N5K", pid): + type = "N5K" + elif re.search(r"N6K", pid): + type = "N6K" + elif re.search(r"N7K", pid): + type = "N7K" + elif re.search(r"N9K", pid): + type = "N9K" + else: + type = "unknown" + + return type + + +def parse_show_install(data): + """Helper method to parse the output of the 'show install all impact' or + 'install all' commands. + + Sample Output: + + Installer will perform impact only check. Please wait. + + Verifying image bootflash:/nxos.7.0.3.F2.2.bin for boot variable "nxos". + [####################] 100% -- SUCCESS + + Verifying image type. + [####################] 100% -- SUCCESS + + Preparing "bios" version info using image bootflash:/nxos.7.0.3.F2.2.bin. + [####################] 100% -- SUCCESS + + Preparing "nxos" version info using image bootflash:/nxos.7.0.3.F2.2.bin. + [####################] 100% -- SUCCESS + + Performing module support checks. + [####################] 100% -- SUCCESS + + Notifying services about system upgrade. + [####################] 100% -- SUCCESS + + + + Compatibility check is done: + Module bootable Impact Install-type Reason + ------ -------- -------------- ------------ ------ + 8 yes disruptive reset Incompatible image for ISSU + 21 yes disruptive reset Incompatible image for ISSU + + + Images will be upgraded according to following table: + Module Image Running-Version(pri:alt) New-Version Upg-Required + ------ ---------- ---------------------------------------- ------------ + 8 lcn9k 7.0(3)F3(2) 7.0(3)F2(2) yes + 8 bios v01.17 v01.17 no + 21 lcn9k 7.0(3)F3(2) 7.0(3)F2(2) yes + 21 bios v01.70 v01.70 no + """ + if len(data) > 0: + data = massage_install_data(data) + ud = {"raw": data} + ud["processed"] = [] + ud["disruptive"] = False + ud["upgrade_needed"] = False + ud["error"] = False + ud["invalid_command"] = False + ud["install_in_progress"] = False + ud["server_error"] = False + ud["upgrade_succeeded"] = False + ud["use_impact_data"] = False + + # Check for server errors + if isinstance(data, int): + if data == -1: + ud["server_error"] = True + elif data >= 500: + ud["server_error"] = True + elif data == -32603: + ud["server_error"] = True + elif data == 1: + ud["server_error"] = True + return ud + else: + ud["list_data"] = data.split("\n") + + for x in ud["list_data"]: + # Check for errors and exit if found. + if re.search(r"Pre-upgrade check failed", x): + ud["error"] = True + break + if re.search(r"[I|i]nvalid command", x): + ud["invalid_command"] = True + ud["error"] = True + break + if re.search(r"No install all data found", x): + ud["error"] = True + break + + # Check for potentially transient conditions + if re.search(r"Another install procedure may\s*be in progress", x): + ud["install_in_progress"] = True + break + if re.search(r"Backend processing error", x): + ud["server_error"] = True + break + if re.search(r"timed out", x): + ud["server_error"] = True + break + if re.search(r"^(-1|5\d\d)$", x): + ud["server_error"] = True + break + + # Check for messages indicating a successful upgrade. + if re.search(r"Finishing the upgrade", x): + ud["upgrade_succeeded"] = True + break + if re.search(r"Install has been successful", x): + ud["upgrade_succeeded"] = True + break + if re.search(r"Switching over onto standby", x): + ud["upgrade_succeeded"] = True + break + + # We get these messages when the upgrade is non-disruptive and + # we loose connection with the switchover but far enough along that + # we can be confident the upgrade succeeded. + if re.search(r"timeout .*trying to send command: install", x): + ud["upgrade_succeeded"] = True + ud["use_impact_data"] = True + break + if re.search(r"[C|c]onnection failure: timed out", x): + ud["upgrade_succeeded"] = True + ud["use_impact_data"] = True + break + + # Begin normal parsing. + if re.search(r"----|Module|Images will|Compatibility", x): + ud["processed"].append(x) + continue + # Check to see if upgrade will be disruptive or non-disruptive and + # build dictionary of individual modules and their status. + # Sample Line: + # + # Module bootable Impact Install-type Reason + # ------ -------- ---------- ------------ ------ + # 8 yes disruptive reset Incompatible image + rd = r"(\d+)\s+(\S+)\s+(disruptive|non-disruptive)\s+(\S+)" + mo = re.search(rd, x) + if mo: + ud["processed"].append(x) + key = "m%s" % mo.group(1) + field = "disruptive" + if mo.group(3) == "non-disruptive": + ud[key] = {field: False} + else: + ud[field] = True + ud[key] = {field: True} + field = "bootable" + if mo.group(2) == "yes": + ud[key].update({field: True}) + else: + ud[key].update({field: False}) + continue + + # Check to see if switch needs an upgrade and build a dictionary + # of individual modules and their individual upgrade status. + # Sample Line: + # + # Module Image Running-Version(pri:alt) New-Version Upg-Required + # ------ ----- ---------------------------------------- ------------ + # 8 lcn9k 7.0(3)F3(2) 7.0(3)F2(2) yes + mo = re.search(r"(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(yes|no)", x) + if mo: + ud["processed"].append(x) + key = "m%s_%s" % (mo.group(1), mo.group(2)) + field = "upgrade_needed" + if mo.group(5) == "yes": + ud[field] = True + ud[key] = {field: True} + else: + ud[key] = {field: False} + continue + + return ud + + +def massage_install_data(data): + # Transport cli returns a list containing one result item. + # Transport nxapi returns a list containing two items. The second item + # contains the data we are interested in. + default_error_msg = "No install all data found" + if len(data) == 1: + result_data = data[0] + elif len(data) == 2: + result_data = data[1] + else: + result_data = default_error_msg + + # Further processing may be needed for result_data + if len(data) == 2 and isinstance(data[1], dict): + if "clierror" in data[1].keys(): + result_data = data[1]["clierror"] + elif "code" in data[1].keys() and data[1]["code"] == "500": + # We encountered a backend processing error for nxapi + result_data = data[1]["msg"] + else: + result_data = default_error_msg + return result_data + + +def build_install_cmd_set(issu, image, kick, type, force=True): + commands = ["terminal dont-ask"] + + # Different NX-OS platforms behave differently for + # disruptive and non-disruptive upgrade paths. + # + # 1) Combined kickstart/system image: + # * Use option 'non-disruptive' for issu. + # * Omit option 'non-disruptive' for disruptive upgrades. + # 2) Separate kickstart + system images. + # * Omit hidden 'force' option for issu. + # * Use hidden 'force' option for disruptive upgrades. + # * Note: Not supported on all platforms + if re.search(r"required|desired|yes", issu): + if kick is None: + issu_cmd = "non-disruptive" + else: + issu_cmd = "" + else: + if kick is None: + issu_cmd = "" + else: + issu_cmd = "force" if force else "" + + if type == "impact": + rootcmd = "show install all impact" + # The force option is not available for the impact command. + if kick: + issu_cmd = "" + else: + rootcmd = "install all" + if kick is None: + commands.append("%s nxos %s %s" % (rootcmd, image, issu_cmd)) + else: + commands.append( + "%s %s system %s kickstart %s" % (rootcmd, issu_cmd, image, kick) + ) + + return commands + + +def parse_show_version(data): + version_data = {"raw": data[0].split("\n")} + version_data["version"] = "" + version_data["error"] = False + for x in version_data["raw"]: + mo = re.search(r"(kickstart|system|NXOS):\s+version\s+(\S+)", x) + if mo: + version_data["version"] = mo.group(2) + continue + + if version_data["version"] == "": + version_data["error"] = True + + return version_data + + +def check_mode_legacy(module, issu, image, kick=None): + """Some platforms/images/transports don't support the 'install all impact' + command so we need to use a different method.""" + current = execute_show_command(module, "show version", "json")[0] + # Call parse_show_data on empty string to create the default upgrade + # data structure dictionary + data = parse_show_install("") + upgrade_msg = "No upgrade required" + + # Process System Image + data["error"] = False + tsver = "show version image bootflash:%s" % image + data["upgrade_cmd"] = [tsver] + target_image = parse_show_version(execute_show_command(module, tsver)) + if target_image["error"]: + data["error"] = True + data["raw"] = target_image["raw"] + if ( + current["kickstart_ver_str"] != target_image["version"] + and not data["error"] + ): + data["upgrade_needed"] = True + data["disruptive"] = True + upgrade_msg = "Switch upgraded: system: %s" % tsver + + # Process Kickstart Image + if kick is not None and not data["error"]: + tkver = "show version image bootflash:%s" % kick + data["upgrade_cmd"].append(tsver) + target_kick = parse_show_version(execute_show_command(module, tkver)) + if target_kick["error"]: + data["error"] = True + data["raw"] = target_kick["raw"] + if ( + current["kickstart_ver_str"] != target_kick["version"] + and not data["error"] + ): + data["upgrade_needed"] = True + data["disruptive"] = True + upgrade_msg = upgrade_msg + " kickstart: %s" % tkver + + data["list_data"] = data["raw"] + data["processed"] = upgrade_msg + return data + + +def check_mode_nextgen(module, issu, image, kick=None): + """Use the 'install all impact' command for check_mode""" + opts = {"ignore_timeout": True} + commands = build_install_cmd_set(issu, image, kick, "impact") + data = parse_show_install(load_config(module, commands, True, opts)) + # If an error is encountered when issu is 'desired' then try again + # but set issu to 'no' + if data["error"] and issu == "desired": + issu = "no" + commands = build_install_cmd_set(issu, image, kick, "impact") + # The system may be busy from the previous call to check_mode so loop + # until it's done. + data = check_install_in_progress(module, commands, opts) + if data["server_error"]: + data["error"] = True + data["upgrade_cmd"] = commands + return data + + +def check_install_in_progress(module, commands, opts): + for attempt in range(20): + data = parse_show_install(load_config(module, commands, True, opts)) + if data["install_in_progress"]: + sleep(1) + continue + break + return data + + +def check_mode(module, issu, image, kick=None): + """Check switch upgrade impact using 'show install all impact' command""" + data = check_mode_nextgen(module, issu, image, kick) + if data["server_error"]: + # We encountered an unrecoverable error in the attempt to get upgrade + # impact data from the 'show install all impact' command. + # Fallback to legacy method. + data = check_mode_legacy(module, issu, image, kick) + if data["invalid_command"]: + # If we are upgrading from a device running a separate kickstart and + # system image the impact command will fail. + # Fallback to legacy method. + data = check_mode_legacy(module, issu, image, kick) + return data + + +def do_install_all(module, issu, image, kick=None): + """Perform the switch upgrade using the 'install all' command""" + impact_data = check_mode(module, issu, image, kick) + if module.check_mode: + # Check mode set in the playbook so just return the impact data. + msg = "*** SWITCH WAS NOT UPGRADED: IMPACT DATA ONLY ***" + impact_data["processed"].append(msg) + return impact_data + if impact_data["error"]: + # Check mode discovered an error so return with this info. + return impact_data + elif not impact_data["upgrade_needed"]: + # The switch is already upgraded. Nothing more to do. + return impact_data + else: + # If we get here, check_mode returned no errors and the switch + # needs to be upgraded. + if impact_data["disruptive"]: + # Check mode indicated that ISSU is not possible so issue the + # upgrade command without the non-disruptive flag unless the + # playbook specified issu: yes/required. + if issu == "yes": + msg = "ISSU/ISSD requested but impact data indicates ISSU/ISSD is not possible" + module.fail_json(msg=msg, raw_data=impact_data["list_data"]) + else: + issu = "no" + + commands = build_install_cmd_set(issu, image, kick, "install") + opts = {"ignore_timeout": True} + # The system may be busy from the call to check_mode so loop until + # it's done. + upgrade = check_install_in_progress(module, commands, opts) + if upgrade["invalid_command"] and "force" in commands[1]: + # Not all platforms support the 'force' keyword. Check for this + # condition and re-try without the 'force' keyword if needed. + commands = build_install_cmd_set( + issu, image, kick, "install", False + ) + upgrade = check_install_in_progress(module, commands, opts) + upgrade["upgrade_cmd"] = commands + + # Special case: If we encounter a server error at this stage + # it means the command was sent and the upgrade was started but + # we will need to use the impact data instead of the current install + # data. + if upgrade["server_error"]: + upgrade["upgrade_succeeded"] = True + upgrade["use_impact_data"] = True + + if upgrade["use_impact_data"]: + if upgrade["upgrade_succeeded"]: + upgrade = impact_data + upgrade["upgrade_succeeded"] = True + else: + upgrade = impact_data + upgrade["upgrade_succeeded"] = False + + if not upgrade["upgrade_succeeded"]: + upgrade["error"] = True + return upgrade + + +def main(): + argument_spec = dict( + system_image_file=dict(required=True), + kickstart_image_file=dict(required=False), + issu=dict(choices=["required", "desired", "no", "yes"], default="no"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + # Get system_image_file(sif), kickstart_image_file(kif) and + # issu settings from module params. + sif = module.params["system_image_file"] + kif = module.params["kickstart_image_file"] + issu = module.params["issu"] + + if re.search(r"(yes|required)", issu): + issu = "yes" + + if kif == "null" or kif == "": + kif = None + + install_result = do_install_all(module, issu, sif, kick=kif) + if install_result["error"]: + cmd = install_result["upgrade_cmd"] + msg = "Failed to upgrade device using command: %s" % cmd + module.fail_json(msg=msg, raw_data=install_result["list_data"]) + + state = install_result["processed"] + changed = install_result["upgrade_needed"] + module.exit_json(changed=changed, install_state=state, warnings=warnings) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface.py new file mode 100644 index 00000000..1393f883 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface.py @@ -0,0 +1,991 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# 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 = """ +module: nxos_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manages physical + attributes of interfaces. +description: +- Manages physical attributes of interfaces of NX-OS switches. +version_added: 1.0.0 +deprecated: + alternative: nxos_interfaces + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +author: +- Jason Edelman (@jedelman8) +- Trishna Guha (@trishnaguha) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- This module is also used to create logical interfaces such as svis and loopbacks. +- Be cautious of platform specific idiosyncrasies. For example, when you default a + loopback interface, the admin state toggles on certain versions of NX-OS. +- The M(cisco.nxos.nxos_overlay_global) C(anycast_gateway_mac) attribute must be set before setting + the C(fabric_forwarding_anycast_gateway) property. +options: + name: + description: + - Full name of interface, i.e. Ethernet1/1, port-channel10. + aliases: + - interface + type: str + interface_type: + description: + - Interface type to be unconfigured from the device. + choices: + - loopback + - portchannel + - svi + - nve + type: str + speed: + description: + - Interface link speed. Applicable for ethernet interface only. + type: str + admin_state: + description: + - Administrative state of the interface. + default: up + choices: + - up + - down + type: str + description: + description: + - Interface description. + type: str + mode: + description: + - Manage Layer 2 or Layer 3 state of the interface. This option is supported for + ethernet and portchannel interface. Applicable for ethernet and portchannel + interface only. + choices: + - layer2 + - layer3 + type: str + mtu: + description: + - MTU for a specific interface. Must be an even number between 576 and 9216. Applicable + for ethernet interface only. + type: str + ip_forward: + description: + - Enable/Disable ip forward feature on SVIs. + choices: + - enable + - disable + type: str + fabric_forwarding_anycast_gateway: + description: + - Associate SVI with anycast gateway under VLAN configuration mode. Applicable + for SVI interface only. + type: bool + duplex: + description: + - Interface link status. Applicable for ethernet interface only. + choices: + - full + - half + - auto + type: str + tx_rate: + description: + - Transmit rate in bits per second (bps). + - This is state check parameter only. + - Supports conditionals, see L(Conditionals in Networking Modules,../network/user_guide/network_working_with_command_output.html) + type: str + rx_rate: + description: + - Receiver rate in bits per second (bps). + - This is state check parameter only. + - Supports conditionals, see L(Conditionals in Networking Modules,../network/user_guide/network_working_with_command_output.html) + type: str + neighbors: + description: + - Check the operational state of given interface C(name) for LLDP neighbor. + - The following suboptions are available. This is state check parameter only. + type: list + elements: dict + suboptions: + host: + description: + - LLDP neighbor host for given interface C(name). + type: str + port: + description: + - LLDP neighbor port to which given interface C(name) is connected. + type: str + aggregate: + description: List of Interfaces definitions. + type: list + elements: dict + suboptions: + name: + description: + - Full name of interface, i.e. Ethernet1/1, port-channel10. + required: true + type: str + interface_type: + description: + - Interface type to be unconfigured from the device. + choices: + - loopback + - portchannel + - svi + - nve + type: str + speed: + description: + - Interface link speed. Applicable for ethernet interface only. + type: str + admin_state: + description: + - Administrative state of the interface. + choices: + - up + - down + type: str + description: + description: + - Interface description. + type: str + mode: + description: + - Manage Layer 2 or Layer 3 state of the interface. This option is supported for + ethernet and portchannel interface. Applicable for ethernet and portchannel + interface only. + choices: + - layer2 + - layer3 + type: str + mtu: + description: + - MTU for a specific interface. Must be an even number between 576 and 9216. Applicable + for ethernet interface only. + type: str + ip_forward: + description: + - Enable/Disable ip forward feature on SVIs. + choices: + - enable + - disable + type: str + fabric_forwarding_anycast_gateway: + description: + - Associate SVI with anycast gateway under VLAN configuration mode. Applicable + for SVI interface only. + type: bool + duplex: + description: + - Interface link status. Applicable for ethernet interface only. + choices: + - full + - half + - auto + type: str + tx_rate: + description: + - Transmit rate in bits per second (bps). + - This is state check parameter only. + - Supports conditionals, see L(Conditionals in Networking Modules,../network/user_guide/network_working_with_command_output.html) + type: str + rx_rate: + description: + - Receiver rate in bits per second (bps). + - This is state check parameter only. + - Supports conditionals, see L(Conditionals in Networking Modules,../network/user_guide/network_working_with_command_output.html) + type: str + neighbors: + description: + - Check the operational state of given interface C(name) for LLDP neighbor. + - The following suboptions are available. This is state check parameter only. + type: list + elements: dict + suboptions: + host: + description: + - LLDP neighbor host for given interface C(name). + type: str + port: + description: + - LLDP neighbor port to which given interface C(name) is connected. + type: str + state: + description: + - Specify desired state of the resource. + choices: + - present + - absent + - default + type: str + delay: + description: + - Time in seconds to wait before checking for the operational state on remote + device. This wait is applicable for operational state arguments. + type: int + state: + description: + - Specify desired state of the resource. + default: present + choices: + - present + - absent + - default + type: str + delay: + description: + - Time in seconds to wait before checking for the operational state on remote + device. This wait is applicable for operational state arguments. + default: 10 + type: int + + +""" + +EXAMPLES = """ +- name: Ensure an interface is a Layer 3 port and that it has the proper description + cisco.nxos.nxos_interface: + name: Ethernet1/1 + description: Configured by Ansible + mode: layer3 + +- name: Admin down an interface + cisco.nxos.nxos_interface: + name: Ethernet2/1 + admin_state: down + +- name: Remove all loopback interfaces + cisco.nxos.nxos_interface: + name: loopback + state: absent + +- name: Remove all logical interfaces + cisco.nxos.nxos_interface: + interface_type: '{{ item }} ' + state: absent + loop: + - loopback + - portchannel + - svi + - nve + +- name: Admin up all loopback interfaces + cisco.nxos.nxos_interface: + name: loopback 0-1023 + admin_state: up + +- name: Admin down all loopback interfaces + cisco.nxos.nxos_interface: + name: loopback 0-1023 + admin_state: down + +- name: Check neighbors intent arguments + cisco.nxos.nxos_interface: + name: Ethernet2/3 + neighbors: + - port: Ethernet2/3 + host: abc.mycompany.com + +- name: Add interface using aggregate + cisco.nxos.nxos_interface: + aggregate: + - {name: Ethernet0/1, mtu: 256, description: test-interface-1} + - {name: Ethernet0/2, mtu: 516, description: test-interface-2} + duplex: full + speed: 100 + state: present + +- name: Delete interface using aggregate + cisco.nxos.nxos_interface: + aggregate: + - name: Loopback9 + - name: Loopback10 + state: absent + +- name: Check intent arguments + cisco.nxos.nxos_interface: + name: Ethernet0/2 + state: up + tx_rate: ge(0) + rx_rate: le(0) +""" + +RETURN = """ +commands: + description: command list sent to the device + returned: always + type: list + sample: + - interface Ethernet2/3 + - mtu 1500 + - speed 10 +""" + +import re +import time + +from copy import deepcopy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + normalize_interface, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_interface_type, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + conditional, + remove_default_spec, +) + + +def execute_show_command(command, module): + if "show run" not in command: + output = "json" + else: + output = "text" + cmds = [{"command": command, "output": output}] + body = run_commands(module, cmds, check_rc=False) + if body and "Invalid" in body[0]: + return [] + else: + return body + + +def search_obj_in_list(name, lst): + for o in lst: + if o["name"] == name: + return o + + return None + + +def get_interfaces_dict(module): + """Gets all active interfaces on a given switch + """ + try: + body = execute_show_command("show interface", module)[0] + except IndexError: + return {} + + interfaces = { + "ethernet": [], + "svi": [], + "loopback": [], + "management": [], + "portchannel": [], + "nve": [], + "unknown": [], + } + + if body: + interface_list = body["TABLE_interface"]["ROW_interface"] + for index in interface_list: + intf = index["interface"] + intf_type = get_interface_type(intf) + interfaces[intf_type].append(intf) + + return interfaces + + +def get_vlan_interface_attributes(name, intf_type, module): + """ Returns dictionary that has two k/v pairs: + admin_state & description if not an svi, returns None + """ + command = "show run interface {0} all".format(name) + try: + body = execute_show_command(command, module)[0] + except (IndexError, TypeError): + return None + if body: + command_list = body.split("\n") + desc = None + admin_state = "down" + for each in command_list: + if "description" in each: + desc = each.lstrip().split("description")[1].lstrip() + elif "no shutdown" in each: + admin_state = "up" + return dict(description=desc, admin_state=admin_state) + else: + return None + + +def get_interface_type_removed_cmds(interfaces): + commands = [] + + for interface in interfaces: + if interface != "Vlan1": + commands.append("no interface {0}".format(interface)) + + return commands + + +def get_admin_state(admin_state): + command = "" + if admin_state == "up": + command = "no shutdown" + elif admin_state == "down": + command = "shutdown" + return command + + +def is_default_interface(name, module): + """Checks to see if interface exists and if it is a default config + """ + command = "show run interface {0}".format(name) + + try: + body = execute_show_command(command, module)[0] + except (IndexError, TypeError): + body = "" + + if body: + raw_list = body.split("\n") + found = False + for line in raw_list: + if line.startswith("interface"): + found = True + if found and line and not line.startswith("interface"): + return False + return True + + else: + return "DNE" + + +def add_command_to_interface(interface, cmd, commands): + if interface not in commands: + commands.append(interface) + commands.append(cmd) + + +def map_obj_to_commands(updates, module): + commands = list() + commands2 = list() + want, have = updates + + args = ("speed", "description", "duplex", "mtu") + for w in want: + name = w["name"] + mode = w["mode"] + ip_forward = w["ip_forward"] + fabric_forwarding_anycast_gateway = w[ + "fabric_forwarding_anycast_gateway" + ] + admin_state = w["admin_state"] + state = w["state"] + interface_type = w["interface_type"] + del w["state"] + if name: + w["interface_type"] = None + + if interface_type: + obj_in_have = {} + if state in ("present", "default"): + module.fail_json( + msg="The interface_type param can be used only with state absent." + ) + else: + obj_in_have = search_obj_in_list(name, have) + is_default = is_default_interface(name, module) + + if name: + interface = "interface " + name + + if state == "absent": + if obj_in_have: + commands.append("no interface {0}".format(name)) + elif interface_type and not obj_in_have: + intfs = get_interfaces_dict(module)[interface_type] + cmds = get_interface_type_removed_cmds(intfs) + commands.extend(cmds) + + elif state == "present": + if obj_in_have: + # Don't run switchport command for loopback and svi interfaces + if get_interface_type(name) in ("ethernet", "portchannel"): + if mode == "layer2" and mode != obj_in_have.get("mode"): + add_command_to_interface( + interface, "switchport", commands + ) + elif mode == "layer3" and mode != obj_in_have.get("mode"): + add_command_to_interface( + interface, "no switchport", commands + ) + + if admin_state == "up" and admin_state != obj_in_have.get( + "admin_state" + ): + add_command_to_interface( + interface, "no shutdown", commands + ) + elif admin_state == "down" and admin_state != obj_in_have.get( + "admin_state" + ): + add_command_to_interface(interface, "shutdown", commands) + + if ip_forward == "enable" and ip_forward != obj_in_have.get( + "ip_forward" + ): + add_command_to_interface(interface, "ip forward", commands) + elif ip_forward == "disable" and ip_forward != obj_in_have.get( + "ip forward" + ): + add_command_to_interface( + interface, "no ip forward", commands + ) + + if ( + fabric_forwarding_anycast_gateway is True + and obj_in_have.get("fabric_forwarding_anycast_gateway") + is False + ): + add_command_to_interface( + interface, + "fabric forwarding mode anycast-gateway", + commands, + ) + + elif ( + fabric_forwarding_anycast_gateway is False + and obj_in_have.get("fabric_forwarding_anycast_gateway") + is True + ): + add_command_to_interface( + interface, + "no fabric forwarding mode anycast-gateway", + commands, + ) + + for item in args: + candidate = w.get(item) + if candidate and candidate != obj_in_have.get(item): + cmd = item + " " + str(candidate) + add_command_to_interface(interface, cmd, commands) + + if name and get_interface_type(name) == "ethernet": + if mode != obj_in_have.get("mode"): + admin_state = w.get("admin_state") or obj_in_have.get( + "admin_state" + ) + if admin_state: + c1 = "interface {0}".format( + normalize_interface(w["name"]) + ) + c2 = get_admin_state(admin_state) + commands2.append(c1) + commands2.append(c2) + + else: + commands.append(interface) + # Don't run switchport command for loopback and svi interfaces + if get_interface_type(name) in ("ethernet", "portchannel"): + if mode == "layer2": + commands.append("switchport") + elif mode == "layer3": + commands.append("no switchport") + + if admin_state == "up": + commands.append("no shutdown") + elif admin_state == "down": + commands.append("shutdown") + + if ip_forward == "enable": + commands.append("ip forward") + elif ip_forward == "disable": + commands.append("no ip forward") + + if fabric_forwarding_anycast_gateway is True: + commands.append("fabric forwarding mode anycast-gateway") + + elif fabric_forwarding_anycast_gateway is False: + commands.append( + "no fabric forwarding mode anycast-gateway" + ) + + for item in args: + candidate = w.get(item) + if candidate: + commands.append(item + " " + str(candidate)) + + elif state == "default": + if is_default is False: + commands.append("default interface {0}".format(name)) + elif is_default == "DNE": + module.exit_json( + msg="interface you are trying to default does not exist" + ) + + return commands, commands2 + + +def map_params_to_obj(module): + obj = [] + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + name = d["name"] + d["name"] = normalize_interface(name) + obj.append(d) + + else: + obj.append( + { + "name": normalize_interface(module.params["name"]), + "description": module.params["description"], + "speed": module.params["speed"], + "mode": module.params["mode"], + "mtu": module.params["mtu"], + "duplex": module.params["duplex"], + "ip_forward": module.params["ip_forward"], + "fabric_forwarding_anycast_gateway": module.params[ + "fabric_forwarding_anycast_gateway" + ], + "admin_state": module.params["admin_state"], + "state": module.params["state"], + "interface_type": module.params["interface_type"], + "tx_rate": module.params["tx_rate"], + "rx_rate": module.params["rx_rate"], + "neighbors": module.params["neighbors"], + } + ) + + return obj + + +def map_config_to_obj(want, module): + objs = list() + + for w in want: + obj = dict( + name=None, + description=None, + admin_state=None, + speed=None, + mtu=None, + mode=None, + duplex=None, + interface_type=None, + ip_forward=None, + fabric_forwarding_anycast_gateway=None, + ) + + if not w["name"]: + return obj + + command = "show interface {0}".format(w["name"]) + try: + body = execute_show_command(command, module)[0] + except IndexError: + return list() + if body: + try: + interface_table = body["TABLE_interface"]["ROW_interface"] + except (KeyError, TypeError): + return list() + + if interface_table: + if interface_table.get("eth_mode") == "fex-fabric": + module.fail_json( + msg='nxos_interface does not support interfaces with mode "fex-fabric"' + ) + + intf_type = get_interface_type(w["name"]) + + if intf_type in ["portchannel", "ethernet"]: + mode = interface_table.get("eth_mode") + if mode in ("access", "trunk", "dot1q-tunnel"): + obj["mode"] = "layer2" + elif mode in ("routed", "layer3"): + obj["mode"] = "layer3" + else: + obj["mode"] = "layer3" + + if intf_type == "ethernet": + obj["name"] = normalize_interface( + interface_table.get("interface") + ) + obj["admin_state"] = interface_table.get("admin_state") + obj["description"] = interface_table.get("desc") + obj["mtu"] = interface_table.get("eth_mtu") + obj["duplex"] = interface_table.get("eth_duplex") + + command = "show run interface {0}".format(obj["name"]) + body = execute_show_command(command, module)[0] + + speed_match = re.search(r"speed (\d+)", body) + if speed_match is None: + obj["speed"] = "auto" + else: + obj["speed"] = speed_match.group(1) + + duplex_match = re.search(r"duplex (\S+)", body) + if duplex_match is None: + obj["duplex"] = "auto" + else: + obj["duplex"] = duplex_match.group(1) + + if "ip forward" in body: + obj["ip_forward"] = "enable" + else: + obj["ip_forward"] = "disable" + + elif intf_type == "svi": + obj["name"] = normalize_interface( + interface_table.get("interface") + ) + attributes = get_vlan_interface_attributes( + obj["name"], intf_type, module + ) + obj["admin_state"] = str( + attributes.get("admin_state", "nxapibug") + ) + obj["description"] = str( + attributes.get("description", "nxapi_bug") + ) + obj["mtu"] = interface_table.get("svi_mtu") + + command = "show run interface {0}".format(obj["name"]) + body = execute_show_command(command, module)[0] + if "ip forward" in body: + obj["ip_forward"] = "enable" + else: + obj["ip_forward"] = "disable" + if "fabric forwarding mode anycast-gateway" in body: + obj["fabric_forwarding_anycast_gateway"] = True + else: + obj["fabric_forwarding_anycast_gateway"] = False + + elif intf_type in ("loopback", "management", "nve"): + obj["name"] = normalize_interface( + interface_table.get("interface") + ) + obj["admin_state"] = interface_table.get("admin_state") + if obj["admin_state"] is None and intf_type == "loopback": + # Some platforms don't have the 'admin_state' key. + # For loopback interfaces it's safe to use the + # 'state' key instead. + obj["admin_state"] = interface_table.get("state") + obj["description"] = interface_table.get("desc") + + elif intf_type == "portchannel": + obj["name"] = normalize_interface( + interface_table.get("interface") + ) + obj["admin_state"] = interface_table.get("admin_state") + obj["description"] = interface_table.get("desc") + obj["mtu"] = interface_table.get("eth_mtu") + + if obj["admin_state"] is None: + # Some nxos platforms do not have the 'admin_state' key. + # Use the 'state_rsn_desc' key instead to determine the + # admin state of the interface. + state_description = interface_table.get("state_rsn_desc") + if state_description == "Administratively down": + obj["admin_state"] = "down" + elif state_description is not None: + obj["admin_state"] = "up" + + objs.append(obj) + + return objs + + +def check_declarative_intent_params(module, want): + failed_conditions = [] + have_neighbors = None + for w in want: + if w["interface_type"]: + continue + want_tx_rate = w.get("tx_rate") + want_rx_rate = w.get("rx_rate") + want_neighbors = w.get("neighbors") + if not (want_tx_rate or want_rx_rate or want_neighbors): + continue + + time.sleep(module.params["delay"]) + + cmd = [ + { + "command": "show interface {0}".format(w["name"]), + "output": "text", + } + ] + + try: + out = run_commands(module, cmd, check_rc=False)[0] + except (AttributeError, IndexError, TypeError): + out = "" + + if want_tx_rate: + match = re.search(r"output rate (\d+)", out, re.M) + have_tx_rate = None + + if match: + have_tx_rate = match.group(1) + + if have_tx_rate is None or not conditional( + want_tx_rate, have_tx_rate.strip(), cast=int + ): + failed_conditions.append("tx_rate " + want_tx_rate) + + if want_rx_rate: + match = re.search(r"input rate (\d+)", out, re.M) + have_rx_rate = None + + if match: + have_rx_rate = match.group(1) + + if have_rx_rate is None or not conditional( + want_rx_rate, have_rx_rate.strip(), cast=int + ): + failed_conditions.append("rx_rate " + want_rx_rate) + + if want_neighbors: + have_host = [] + have_port = [] + if have_neighbors is None: + cmd = [ + { + "command": "show lldp neighbors interface {0} detail".format( + w["name"] + ), + "output": "text", + } + ] + output = run_commands(module, cmd, check_rc=False) + if output: + have_neighbors = output[0] + else: + have_neighbors = "" + if ( + have_neighbors + and "Total entries displayed: 0" not in have_neighbors + ): + for line in have_neighbors.strip().split("\n"): + if line.startswith("Port Description"): + have_port.append(line.split(": ")[1]) + if line.startswith("System Name"): + have_host.append(line.split(": ")[1]) + + for item in want_neighbors: + host = item.get("host") + port = item.get("port") + if host and host not in have_host: + failed_conditions.append("host " + host) + if port and port not in have_port: + failed_conditions.append("port " + port) + + return failed_conditions + + +def main(): + """ main entry point for module execution + """ + neighbors_spec = dict(host=dict(), port=dict()) + + element_spec = dict( + name=dict(aliases=["interface"]), + admin_state=dict(default="up", choices=["up", "down"]), + description=dict(), + speed=dict(), + mode=dict(choices=["layer2", "layer3"]), + mtu=dict(), + duplex=dict(choices=["full", "half", "auto"]), + interface_type=dict(choices=["loopback", "portchannel", "svi", "nve"]), + ip_forward=dict(choices=["enable", "disable"]), + fabric_forwarding_anycast_gateway=dict(type="bool"), + tx_rate=dict(), + rx_rate=dict(), + neighbors=dict(type="list", elements="dict", options=neighbors_spec), + delay=dict(default=10, type="int"), + state=dict( + choices=["absent", "present", "default"], default="present" + ), + ) + + aggregate_spec = deepcopy(element_spec) + aggregate_spec["name"] = dict(required=True) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict( + type="list", + elements="dict", + options=aggregate_spec, + mutually_exclusive=[["name", "interface_type"]], + ) + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + required_one_of = [["name", "aggregate", "interface_type"]] + mutually_exclusive = [["name", "aggregate"], ["name", "interface_type"]] + + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + warnings = list() + + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + have = map_config_to_obj(want, module) + + commands = [] + commands1, commands2 = map_obj_to_commands((want, have), module) + commands.extend(commands1) + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + # if the mode changes from L2 to L3, the admin state + # seems to change after the API call, so adding a second API + # call to ensure it's in the desired state. + if commands2: + load_config(module, commands2) + commands.extend(commands2) + commands = [cmd for cmd in commands if cmd != "configure"] + result["commands"] = commands + + if result["changed"]: + failed_conditions = check_declarative_intent_params(module, want) + + if failed_conditions: + msg = "One or more conditional statements have not been satisfied" + module.fail_json(msg=msg, failed_conditions=failed_conditions) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface_ospf.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface_ospf.py new file mode 100644 index 00000000..188682c8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interface_ospf.py @@ -0,0 +1,614 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_interface_ospf +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-10-26) Manages configuration of an OSPF interface instance. +description: +- Manages configuration of an OSPF interface instance. +version_added: 1.0.0 +deprecated: + alternative: nxos_ospf_interfaces + why: Updated modules released with more functionality + removed_at_date: '2022-10-26' +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Default, where supported, restores params default value. +- To remove an existing authentication configuration you should use C(message_digest_key_id=default) + plus all other options matching their existing values. +- Loopback interfaces only support ospf network type 'point-to-point'. +- C(state=absent) removes the whole OSPF interface configuration. +options: + interface: + description: + - Name of this cisco_interface resource. Valid value is a string. + required: true + type: str + ospf: + description: + - Name of the ospf instance. + required: true + type: str + area: + description: + - Ospf area associated with this cisco_interface_ospf instance. Valid values are + a string, formatted as an IP address (i.e. "0.0.0.0") or as an integer. + required: true + type: str + bfd: + description: + - Enables bfd at interface level. This overrides the bfd variable set at the ospf + router level. + - Valid values are 'enable', 'disable' or 'default'. + - "Dependency: ''feature bfd''" + type: str + choices: + - enable + - disable + - default + cost: + description: + - The cost associated with this cisco_interface_ospf instance. + type: str + hello_interval: + description: + - Time between sending successive hello packets. Valid values are an integer or + the keyword 'default'. + type: str + dead_interval: + description: + - Time interval an ospf neighbor waits for a hello packet before tearing down + adjacencies. Valid values are an integer or the keyword 'default'. + type: str + passive_interface: + description: + - Enable or disable passive-interface state on this interface. true - (enable) + Prevent OSPF from establishing an adjacency or sending routing updates on this + interface. false - (disable) Override global 'passive-interface default' for + this interface. + type: bool + network: + description: + - Specifies interface ospf network type. Valid values are 'point-to-point' or + 'broadcast'. + choices: + - point-to-point + - broadcast + type: str + message_digest: + description: + - Enables or disables the usage of message digest authentication. + type: bool + message_digest_key_id: + description: + - Md5 authentication key-id associated with the ospf instance. If this is present, + message_digest_encryption_type, message_digest_algorithm_type and message_digest_password + are mandatory. Valid value is an integer and 'default'. + type: str + message_digest_algorithm_type: + description: + - Algorithm used for authentication among neighboring routers within an area. + Valid values are 'md5' and 'default'. + choices: + - md5 + - default + type: str + message_digest_encryption_type: + description: + - Specifies the scheme used for encrypting message_digest_password. Valid values + are '3des' or 'cisco_type_7' encryption or 'default'. + choices: + - cisco_type_7 + - 3des + - default + type: str + message_digest_password: + description: + - Specifies the message_digest password. Valid value is a string. + type: str + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str +""" +EXAMPLES = """ +- cisco.nxos.nxos_interface_ospf: + interface: ethernet1/32 + ospf: 1 + area: 1 + bfd: disable + cost: default + +- cisco.nxos.nxos_interface_ospf: + interface: loopback0 + ospf: prod + area: 0.0.0.0 + bfd: enable + network: point-to-point + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface Ethernet1/32", "ip router ospf 1 area 0.0.0.1", "ip ospf bfd disable"] +""" + + +import re +import struct +import socket +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + +BOOL_PARAMS = ["passive_interface", "message_digest"] +PARAM_TO_COMMAND_KEYMAP = { + "interface": "", + "cost": "ip ospf cost", + "ospf": "ip router ospf", + "area": "ip router ospf", + "bfd": "ip ospf bfd", + "hello_interval": "ip ospf hello-interval", + "dead_interval": "ip ospf dead-interval", + "passive_interface": "ip ospf passive-interface", + "message_digest": "ip ospf authentication message-digest", + "message_digest_key_id": "ip ospf message-digest-key", + "message_digest_algorithm_type": "ip ospf message-digest-key", + "message_digest_encryption_type": "ip ospf message-digest-key", + "message_digest_password": "ip ospf message-digest-key", + "network": "ip ospf network", +} + + +def get_value(arg, config, module): + command = PARAM_TO_COMMAND_KEYMAP[arg] + has_command = re.search(r"\s+{0}\s*$".format(command), config, re.M) + has_command_val = re.search( + r"(?:{0}\s)(?P.*)$".format(command), config, re.M + ) + + if command == "ip router ospf": + value = "" + if has_command_val: + value_list = has_command_val.group("value").split() + if arg == "ospf": + value = value_list[0] + elif arg == "area": + value = value_list[2] + value = normalize_area(value, module) + elif command == "ip ospf message-digest-key": + value = "" + if has_command_val: + value_list = has_command_val.group("value").split() + if arg == "message_digest_key_id": + value = value_list[0] + elif arg == "message_digest_algorithm_type": + value = value_list[1] + elif arg == "message_digest_encryption_type": + value = value_list[2] + if value == "3": + value = "3des" + elif value == "7": + value = "cisco_type_7" + elif arg == "message_digest_password": + value = value_list[3] + elif arg == "passive_interface": + has_no_command = re.search( + r"\s+no\s+{0}\s*$".format(command), config, re.M + ) + if has_no_command: + value = False + elif has_command: + value = True + else: + value = None + elif arg == "bfd": + m = re.search(r"\s*ip ospf bfd(?P disable)?", config) + if m: + value = "disable" if m.group("disable") else "enable" + else: + value = "default" + elif arg in BOOL_PARAMS: + value = bool(has_command) + else: + value = "" + if has_command_val: + value = has_command_val.group("value") + return value + + +def get_existing(module, args): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + if module.params["interface"].startswith("loopback") or module.params[ + "interface" + ].startswith("port-channel"): + parents = ["interface {0}".format(module.params["interface"])] + else: + parents = [ + "interface {0}".format(module.params["interface"].capitalize()) + ] + config = netcfg.get_section(parents) + if "ospf" in config: + for arg in args: + if arg not in ["interface"]: + existing[arg] = get_value(arg, config, module) + existing["interface"] = module.params["interface"] + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = value + return new_dict + + +def get_default_commands(existing, proposed, existing_commands, key, module): + commands = list() + existing_value = existing_commands.get(key) + if key.startswith("ip ospf message-digest-key"): + check = False + for param in [ + "message_digest_encryption_type", + "message_digest_algorithm_type", + "message_digest_password", + ]: + if existing[param] == proposed[param]: + check = True + if check: + if existing["message_digest_encryption_type"] == "3des": + encryption_type = "3" + elif existing["message_digest_encryption_type"] == "cisco_type_7": + encryption_type = "7" + command = "no {0} {1} {2} {3} {4}".format( + key, + existing["message_digest_key_id"], + existing["message_digest_algorithm_type"], + encryption_type, + existing["message_digest_password"], + ) + commands.append(command) + elif "ip ospf bfd" in key: + commands.append("no {0}".format(key)) + elif "passive-interface" in key: + commands.append("default ip ospf passive-interface") + else: + commands.append("no {0} {1}".format(key, existing_value)) + return commands + + +def get_custom_command(existing_cmd, proposed, key, module): + commands = list() + + if key == "ip router ospf": + command = "{0} {1} area {2}".format( + key, proposed["ospf"], proposed["area"] + ) + if command not in existing_cmd: + commands.append(command) + + if key == "ip ospf network": + command = "{0} {1}".format(key, proposed["network"]) + + if command not in existing_cmd: + commands.append(command) + + elif key.startswith("ip ospf message-digest-key"): + if ( + proposed["message_digest_key_id"] != "default" + and "options" not in key + ): + if proposed["message_digest_encryption_type"] == "3des": + encryption_type = "3" + elif proposed["message_digest_encryption_type"] == "cisco_type_7": + encryption_type = "7" + command = "{0} {1} {2} {3} {4}".format( + key, + proposed["message_digest_key_id"], + proposed["message_digest_algorithm_type"], + encryption_type, + proposed["message_digest_password"], + ) + commands.append(command) + return commands + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, value in proposed_commands.items(): + if existing_commands.get(key): + if key == "ip router ospf": + if proposed["area"] == existing["area"]: + continue + if existing_commands[key] == proposed_commands[key]: + continue + + if key == "ip ospf passive-interface" and module.params.get( + "interface" + ).upper().startswith("LO"): + module.fail_json( + msg="loopback interface does not support passive_interface" + ) + if ( + key == "ip ospf network" + and value == "broadcast" + and module.params.get("interface").upper().startswith("LO") + ): + module.fail_json( + msg="loopback interface does not support ospf network type broadcast" + ) + + if key == "ip ospf bfd": + cmd = key + if "disable" in value: + cmd += " disable" + elif "default" in value and existing.get("bfd") is not None: + cmd = "no " + cmd + commands.append(cmd) + continue + + if value is True: + commands.append(key) + elif value is False: + commands.append("no {0}".format(key)) + elif value == "default": + if existing_commands.get(key): + commands.extend( + get_default_commands( + existing, proposed, existing_commands, key, module + ) + ) + else: + if key == "ip router ospf" or key.startswith( + "ip ospf message-digest-key" + ): + commands.extend( + get_custom_command(commands, proposed, key, module) + ) + else: + command = "{0} {1}".format(key, value.lower()) + commands.append(command) + + if commands: + parents = [ + "interface {0}".format(module.params["interface"].capitalize()) + ] + candidate.add(commands, parents=parents) + + +def state_absent(module, existing, proposed, candidate): + commands = [] + parents = ["interface {0}".format(module.params["interface"].capitalize())] + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, value in existing_commands.items(): + if "ip ospf bfd" in key: + if "default" not in value: + # cli is present when enabled or disabled; this removes either case + commands.append("no ip ospf bfd") + continue + if "ip ospf passive-interface" in key and value is not None: + # cli is present for both enabled or disabled; 'no' will not remove + commands.append("default ip ospf passive-interface") + continue + + if value: + if key.startswith("ip ospf message-digest-key"): + if "options" not in key: + if existing["message_digest_encryption_type"] == "3des": + encryption_type = "3" + elif ( + existing["message_digest_encryption_type"] + == "cisco_type_7" + ): + encryption_type = "7" + command = "no {0} {1} {2} {3} {4}".format( + key, + existing["message_digest_key_id"], + existing["message_digest_algorithm_type"], + encryption_type, + existing["message_digest_password"], + ) + commands.append(command) + elif key in [ + "ip ospf authentication message-digest", + "ip ospf network", + ]: + if value: + commands.append("no {0}".format(key)) + elif key == "ip router ospf": + command = "no {0} {1} area {2}".format( + key, proposed["ospf"], proposed["area"] + ) + if command not in commands: + commands.append(command) + else: + existing_value = existing_commands.get(key) + commands.append("no {0} {1}".format(key, existing_value)) + + candidate.add(commands, parents=parents) + + +def normalize_area(area, module): + try: + area = int(area) + area = socket.inet_ntoa(struct.pack("!L", area)) + except ValueError: + splitted_area = area.split(".") + if len(splitted_area) != 4: + module.fail_json(msg="Incorrect Area ID format", area=area) + return area + + +def main(): + argument_spec = dict( + interface=dict(required=True, type="str"), + ospf=dict(required=True, type="str"), + area=dict(required=True, type="str"), + bfd=dict( + choices=["enable", "disable", "default"], + required=False, + type="str", + ), + cost=dict(required=False, type="str"), + hello_interval=dict(required=False, type="str"), + dead_interval=dict(required=False, type="str"), + passive_interface=dict(required=False, type="bool"), + network=dict( + required=False, type="str", choices=["broadcast", "point-to-point"] + ), + message_digest=dict(required=False, type="bool"), + message_digest_key_id=dict(required=False, type="str"), + message_digest_algorithm_type=dict( + required=False, type="str", choices=["md5", "default"] + ), + message_digest_encryption_type=dict( + required=False, + type="str", + choices=["cisco_type_7", "3des", "default"], + ), + message_digest_password=dict(required=False, type="str", no_log=True), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + required_together=[ + [ + "message_digest_key_id", + "message_digest_algorithm_type", + "message_digest_encryption_type", + "message_digest_password", + ] + ], + supports_check_mode=True, + ) + + # Normalize interface input data. + # + # * For port-channel and loopback interfaces expection is all lower case names. + # * All other interfaces the expectation is an uppercase leading character + # followed by lower case characters. + # + if re.match(r"(port-channel|loopback)", module.params["interface"], re.I): + module.params["interface"] = module.params["interface"].lower() + else: + module.params["interface"] = module.params["interface"].capitalize() + + warnings = list() + result = {"changed": False, "commands": [], "warnings": warnings} + + for param in [ + "message_digest_encryption_type", + "message_digest_algorithm_type", + "message_digest_password", + ]: + if ( + module.params[param] == "default" + and module.params["message_digest_key_id"] != "default" + ): + module.exit_json( + msg="Use message_digest_key_id=default to remove an existing authentication configuration" + ) + + state = module.params["state"] + args = PARAM_TO_COMMAND_KEYMAP.keys() + + existing = get_existing(module, args) + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + proposed = {} + for key, value in proposed_args.items(): + if key != "interface": + if str(value).lower() == "true": + value = True + elif str(value).lower() == "false": + value = False + elif str(value).lower() == "default": + value = "default" + elif key == "bfd": + value = str(value).lower() + if existing.get(key) or (not existing.get(key) and value): + proposed[key] = value + elif ( + "passive_interface" in key + and existing.get(key) is None + and value is False + ): + proposed[key] = value + + proposed["area"] = normalize_area(proposed["area"], module) + if "hello_interval" in proposed and proposed["hello_interval"] == "10": + proposed["hello_interval"] = "default" + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + elif ( + state == "absent" + and existing.get("ospf") == proposed["ospf"] + and existing.get("area") == proposed["area"] + ): + state_absent(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + if not module.check_mode: + load_config(module, candidate) + result["changed"] = True + result["commands"] = candidate + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interfaces.py new file mode 100644 index 00000000..b3ec69ac --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_interfaces.py @@ -0,0 +1,403 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_interfaces +short_description: Interfaces resource module +description: This module manages the interface attributes of NX-OS interfaces. +version_added: 1.0.0 +author: Trishna Guha (@trishnaguha) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section ^interface) + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A dictionary of interface options + type: list + elements: dict + suboptions: + name: + description: + - Full name of interface, e.g. Ethernet1/1, port-channel10. + type: str + required: true + description: + description: + - Interface description. + type: str + enabled: + description: + - Administrative state of the interface. Set the value to C(true) to administratively + enable the interface or C(false) to disable it + type: bool + speed: + description: + - Interface link speed. Applicable for Ethernet interfaces only. + type: str + mode: + description: + - Manage Layer2 or Layer3 state of the interface. Applicable for Ethernet + and port channel interfaces only. + choices: + - layer2 + - layer3 + type: str + mtu: + description: + - MTU for a specific interface. Must be an even number between 576 and 9216. + Applicable for Ethernet interfaces only. + type: str + duplex: + description: + - Interface link status. Applicable for Ethernet interfaces only. + type: str + choices: + - full + - half + - auto + ip_forward: + description: + - Enable or disable IP forward feature on SVIs. Set the value to C(true) to + enable or C(false) to disable. + type: bool + fabric_forwarding_anycast_gateway: + description: + - Associate SVI with anycast gateway under VLAN configuration mode. Applicable + for SVI interfaces only. + type: bool + state: + description: + - The state of the configuration after module completion + - The state I(rendered) considers the system default mode for interfaces to be + "Layer 3" and the system default state for interfaces to be shutdown. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# description testing +# mtu 1800 + +- name: Merge provided configuration with device configuration + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: Configured by Ansible + enabled: true + - name: Ethernet1/2 + description: Configured by Ansible Network + enabled: false + state: merged + +# After state: +# ------------ +# +# interface Ethernet1/1 +# description Configured by Ansible +# no shutdown +# mtu 1800 +# interface Ethernet2 +# description Configured by Ansible Network +# shutdown + + +# Using replaced + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# description Interface 1/1 +# interface Ethernet1/2 + +- name: Replaces device configuration of listed interfaces with provided configuration + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: Configured by Ansible + enabled: true + mtu: 2000 + - name: Ethernet1/2 + description: Configured by Ansible Network + enabled: false + mode: layer2 + state: replaced + +# After state: +# ------------ +# +# interface Ethernet1/1 +# description Configured by Ansible +# no shutdown +# mtu 1500 +# interface Ethernet2/2 +# description Configured by Ansible Network +# shutdown +# switchport + + +# Using overridden + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# description Interface Ethernet1/1 +# interface Ethernet1/2 +# interface mgmt0 +# description Management interface +# ip address dhcp + +- name: Override device configuration of all interfaces with provided configuration + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + enabled: true + - name: Ethernet1/2 + description: Configured by Ansible Network + enabled: false + state: overridden + +# After state: +# ------------ +# +# interface Ethernet1/1 +# interface Ethernet1/2 +# description Configured by Ansible Network +# shutdown +# interface mgmt0 +# ip address dhcp + + +# Using deleted + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# description Interface Ethernet1/1 +# interface Ethernet1/2 +# interface mgmt0 +# description Management interface +# ip address dhcp + +- name: Delete or return interface parameters to default settings + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + state: deleted + +# After state: +# ------------ +# +# interface Ethernet1/1 +# interface Ethernet1/2 +# interface mgmt0 +# description Management interface +# ip address dhcp + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: outbound-intf + mode: layer3 + speed: 100 + - name: Ethernet1/2 + mode: layer2 + enabled: true + duplex: full + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/1" +# - "description outbound-intf" +# - "speed 100" +# - "interface Ethernet1/2" +# - "switchport" +# - "duplex full" +# - "no shutdown" + +# Using parsed + +# parsed.cfg +# ------------ +# interface Ethernet1/800 +# description test-1 +# speed 1000 +# shutdown +# no switchport +# duplex half +# interface Ethernet1/801 +# description test-2 +# switchport +# no shutdown +# mtu 1800 + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# parsed: +# - description: "test-1" +# duplex: "half" +# enabled: false +# mode: "layer3" +# name: "Ethernet1/800" +# speed: "1000" +# +# - description: "test-2" +# enabled: true +# mode: "layer2" +# mtu: "1800" +# name: "Ethernet1/801" + +# Using gathered + +# Existing device config state +# ----------------------------- +# interface Ethernet1/1 +# description outbound-intf +# switchport +# no shutdown +# interface Ethernet1/2 +# description intf-l3 +# speed 1000 +# interface Ethernet1/3 +# interface Ethernet1/4 +# interface Ethernet1/5 + +- name: Gather interfaces facts from the device using nxos_interfaces + cisco.nxos.nxos_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- +# - name: Ethernet1/1 +# description: outbound-intf +# mode: layer2 +# enabled: True +# - name: Ethernet1/2 +# description: intf-l3 +# speed: "1000" +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface Ethernet1/1', 'mtu 1800'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.interfaces.interfaces import ( + InterfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.interfaces.interfaces import ( + Interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=InterfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interface.py new file mode 100644 index 00000000..867a7da3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interface.py @@ -0,0 +1,702 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, 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 + + +DOCUMENTATION = """ +module: nxos_l2_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manage Layer-2 + interface on Cisco NXOS devices. +description: +- This module provides declarative management of Layer-2 interface on Cisco NXOS devices. +version_added: 1.0.0 +deprecated: + alternative: nxos_l2_interfaces + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +author: +- Trishna Guha (@trishnaguha) +notes: +- Tested against NXOSv 7.0(3)I5(1). +options: + name: + description: + - Full name of the interface excluding any logical unit number, i.e. Ethernet1/1. + aliases: + - interface + type: str + mode: + description: + - Mode in which interface needs to be configured. + choices: + - access + - trunk + type: str + access_vlan: + description: + - Configure given VLAN in access port. If C(mode=access), used as the access VLAN + ID. + type: str + native_vlan: + description: + - Native VLAN to be configured in trunk port. If C(mode=trunk), used as the trunk + native VLAN ID. + type: str + trunk_vlans: + description: + - List of VLANs to be configured in trunk port. If C(mode=trunk), used as the + VLAN range to ADD or REMOVE from the trunk. + aliases: + - trunk_add_vlans + type: str + trunk_allowed_vlans: + description: + - List of allowed VLANs in a given trunk port. If C(mode=trunk), these are the + only VLANs that will be configured on the trunk, i.e. "2-10,15". + type: str + aggregate: + description: + - List of Layer-2 interface definitions. + type: list + elements: dict + suboptions: + name: + description: + - Full name of the interface excluding any logical unit number, i.e. Ethernet1/1. + aliases: + - interface + type: str + mode: + description: + - Mode in which interface needs to be configured. + choices: + - access + - trunk + type: str + access_vlan: + description: + - Configure given VLAN in access port. If C(mode=access), used as the access VLAN + ID. + type: str + native_vlan: + description: + - Native VLAN to be configured in trunk port. If C(mode=trunk), used as the trunk + native VLAN ID. + type: str + trunk_vlans: + description: + - List of VLANs to be configured in trunk port. If C(mode=trunk), used as the + VLAN range to ADD or REMOVE from the trunk. + aliases: + - trunk_add_vlans + type: str + trunk_allowed_vlans: + description: + - List of allowed VLANs in a given trunk port. If C(mode=trunk), these are the + only VLANs that will be configured on the trunk, i.e. "2-10,15". + type: str + state: + description: + - Manage the state of the Layer-2 Interface configuration. + choices: + - present + - absent + - unconfigured + type: str + + state: + description: + - Manage the state of the Layer-2 Interface configuration. + default: present + choices: + - present + - absent + - unconfigured + type: str + + +""" + +EXAMPLES = """ +- name: Ensure Eth1/5 is in its default l2 interface state + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + state: unconfigured + +- name: Ensure Eth1/5 is configured for access vlan 20 + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: access + access_vlan: 20 + +- name: Ensure Eth1/5 only has vlans 5-10 as trunk vlans + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: trunk + native_vlan: 10 + trunk_vlans: 5-10 + +- name: Ensure eth1/5 is a trunk port and ensure 2-50 are being tagged (doesn't mean + others aren't also being tagged) + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: trunk + native_vlan: 10 + trunk_vlans: 2-50 + +- name: Ensure these VLANs are not being tagged on the trunk + cisco.nxos.nxos_l2_interface: + name: Ethernet1/5 + mode: trunk + trunk_vlans: 51-4094 + state: absent + +- name: Aggregate Configure interfaces for access_vlan with aggregate + cisco.nxos.nxos_l2_interface: + aggregate: + - {name: Ethernet1/2, access_vlan: 6} + - {name: Ethernet1/7, access_vlan: 15} + mode: access +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always, except for the platforms that use Netconf transport to manage the device. + type: list + sample: + - interface eth1/5 + - switchport access vlan 20 +""" + +from copy import deepcopy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + get_interface_type, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) + + +def get_interface_mode(name, module): + """Gets current mode of interface: layer2 or layer3 + Args: + device (Device): This is the device object of an NX-API enabled device + using the Device class within device.py + interface (string): full name of interface, i.e. Ethernet1/1, + loopback10, port-channel20, vlan20 + Returns: + str: 'layer2' or 'layer3' + """ + command = "show interface {0} | json".format(name) + intf_type = get_interface_type(name) + mode = "unknown" + interface_table = {} + + try: + body = run_commands(module, [command])[0] + interface_table = body["TABLE_interface"]["ROW_interface"] + except (KeyError, AttributeError, IndexError): + return mode + + if interface_table: + # HACK FOR NOW + if intf_type in ["ethernet", "portchannel"]: + mode = str(interface_table.get("eth_mode", "layer3")) + if mode in ["access", "trunk"]: + mode = "layer2" + if mode == "routed": + mode = "layer3" + elif intf_type == "loopback" or intf_type == "svi": + mode = "layer3" + return mode + + +def interface_is_portchannel(name, module): + """Checks to see if an interface is part of portchannel bundle + Args: + interface (str): full name of interface, i.e. Ethernet1/1 + Returns: + True/False based on if interface is a member of a portchannel bundle + """ + intf_type = get_interface_type(name) + + if intf_type == "ethernet": + command = "show interface {0} | json".format(name) + try: + body = run_commands(module, [command])[0] + interface_table = body["TABLE_interface"]["ROW_interface"] + except (KeyError, AttributeError, IndexError): + interface_table = None + + if interface_table: + state = interface_table.get("eth_bundle") + if state: + return True + else: + return False + + return False + + +def get_switchport(port, module): + """Gets current config of L2 switchport + Args: + device (Device): This is the device object of an NX-API enabled device + using the Device class within device.py + port (str): full name of interface, i.e. Ethernet1/1 + Returns: + dictionary with k/v pairs for L2 vlan config + """ + + command = "show interface {0} switchport | json".format(port) + + try: + body = run_commands(module, [command])[0] + sp_table = body["TABLE_interface"]["ROW_interface"] + except (KeyError, AttributeError, IndexError): + sp_table = None + + if sp_table: + key_map = { + "interface": "name", + "oper_mode": "mode", + "switchport": "switchport", + "access_vlan": "access_vlan", + "access_vlan_name": "access_vlan_name", + "native_vlan": "native_vlan", + "native_vlan_name": "native_vlan_name", + "trunk_vlans": "trunk_vlans", + } + sp = apply_key_map(key_map, sp_table) + return sp + + else: + return {} + + +def remove_switchport_config_commands(name, existing, proposed, module): + mode = proposed.get("mode") + commands = [] + command = None + + if mode == "access": + av_check = existing.get("access_vlan") == proposed.get("access_vlan") + if av_check: + command = "no switchport access vlan {0}".format( + existing.get("access_vlan") + ) + commands.append(command) + + elif mode == "trunk": + existing_vlans = existing.get("trunk_vlans_list") + proposed_vlans = proposed.get("trunk_vlans_list") + vlans_to_remove = set(proposed_vlans).intersection(existing_vlans) + + if vlans_to_remove: + proposed_allowed_vlans = proposed.get("trunk_allowed_vlans") + remove_trunk_allowed_vlans = proposed.get( + "trunk_vlans", proposed_allowed_vlans + ) + command = "switchport trunk allowed vlan remove {0}".format( + remove_trunk_allowed_vlans + ) + commands.append(command) + + native_check = existing.get("native_vlan") == proposed.get( + "native_vlan" + ) + if native_check and proposed.get("native_vlan"): + command = "no switchport trunk native vlan {0}".format( + existing.get("native_vlan") + ) + commands.append(command) + + if commands: + commands.insert(0, "interface " + name) + return commands + + +def get_switchport_config_commands(name, existing, proposed, module): + """Gets commands required to config a given switchport interface + """ + + proposed_mode = proposed.get("mode") + existing_mode = existing.get("mode") + commands = [] + command = None + + if proposed_mode != existing_mode: + if proposed_mode == "trunk": + command = "switchport mode trunk" + elif proposed_mode == "access": + command = "switchport mode access" + + if command: + commands.append(command) + + if proposed_mode == "access": + av_check = str(existing.get("access_vlan")) == str( + proposed.get("access_vlan") + ) + if not av_check: + command = "switchport access vlan {0}".format( + proposed.get("access_vlan") + ) + commands.append(command) + + elif proposed_mode == "trunk": + tv_check = existing.get("trunk_vlans_list") == proposed.get( + "trunk_vlans_list" + ) + + if not tv_check: + if proposed.get("allowed"): + command = "switchport trunk allowed vlan {0}".format( + proposed.get("trunk_allowed_vlans") + ) + commands.append(command) + + else: + existing_vlans = existing.get("trunk_vlans_list") + proposed_vlans = proposed.get("trunk_vlans_list") + vlans_to_add = set(proposed_vlans).difference(existing_vlans) + if vlans_to_add: + command = "switchport trunk allowed vlan add {0}".format( + proposed.get("trunk_vlans") + ) + commands.append(command) + + native_check = str(existing.get("native_vlan")) == str( + proposed.get("native_vlan") + ) + if not native_check and proposed.get("native_vlan"): + command = "switchport trunk native vlan {0}".format( + proposed.get("native_vlan") + ) + commands.append(command) + + if commands: + commands.insert(0, "interface " + name) + return commands + + +def is_switchport_default(existing): + """Determines if switchport has a default config based on mode + Args: + existing (dict): existing switchport configuration from Ansible mod + Returns: + boolean: True if switchport has OOB Layer 2 config, i.e. + vlan 1 and trunk all and mode is access + """ + + c1 = str(existing["access_vlan"]) == "1" + c2 = str(existing["native_vlan"]) == "1" + c3 = existing["trunk_vlans"] == "1-4094" + c4 = existing["mode"] == "access" + + default = c1 and c2 and c3 and c4 + + return default + + +def default_switchport_config(name): + commands = [] + commands.append("interface " + name) + commands.append("switchport mode access") + commands.append("switch access vlan 1") + commands.append("switchport trunk native vlan 1") + commands.append("switchport trunk allowed vlan all") + return commands + + +def vlan_range_to_list(vlans): + result = [] + if vlans: + for part in vlans.split(","): + if part == "none": + break + if "-" in part: + a, b = part.split("-") + a, b = int(a), int(b) + result.extend(range(a, b + 1)) + else: + a = int(part) + result.append(a) + return numerical_sort(result) + return result + + +def get_list_of_vlans(module): + + command = "show vlan | json" + vlan_list = [] + + try: + body = run_commands(module, [command])[0] + vlan_table = body["TABLE_vlanbrief"]["ROW_vlanbrief"] + except (KeyError, AttributeError, IndexError): + return [] + + if isinstance(vlan_table, list): + for vlan in vlan_table: + vlan_list.append(str(vlan["vlanshowbr-vlanid-utf"])) + else: + vlan_list.append("1") + + return vlan_list + + +def numerical_sort(string_int_list): + """Sorts list of strings/integers that are digits in numerical order. + """ + + as_int_list = [] + as_str_list = [] + for vlan in string_int_list: + as_int_list.append(int(vlan)) + as_int_list.sort() + for vlan in as_int_list: + as_str_list.append(str(vlan)) + return as_str_list + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = str(value) + return new_dict + + +def apply_value_map(value_map, resource): + for key, value in value_map.items(): + resource[key] = value[resource.get(key)] + return resource + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def map_params_to_obj(module): + obj = [] + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + obj.append(d) + else: + obj.append( + { + "name": module.params["name"], + "mode": module.params["mode"], + "access_vlan": module.params["access_vlan"], + "native_vlan": module.params["native_vlan"], + "trunk_vlans": module.params["trunk_vlans"], + "trunk_allowed_vlans": module.params["trunk_allowed_vlans"], + "state": module.params["state"], + } + ) + + return obj + + +def main(): + """ main entry point for module execution + """ + element_spec = dict( + name=dict(type="str", aliases=["interface"]), + mode=dict(choices=["access", "trunk"]), + access_vlan=dict(type="str"), + native_vlan=dict(type="str"), + trunk_vlans=dict(type="str", aliases=["trunk_add_vlans"]), + trunk_allowed_vlans=dict(type="str"), + state=dict( + choices=["absent", "present", "unconfigured"], default="present" + ), + ) + + aggregate_spec = deepcopy(element_spec) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec) + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[ + ["access_vlan", "trunk_vlans"], + ["access_vlan", "native_vlan"], + ["access_vlan", "trunk_allowed_vlans"], + ], + supports_check_mode=True, + ) + + warnings = list() + commands = [] + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + for w in want: + name = w["name"] + mode = w["mode"] + access_vlan = w["access_vlan"] + state = w["state"] + trunk_vlans = w["trunk_vlans"] + native_vlan = w["native_vlan"] + trunk_allowed_vlans = w["trunk_allowed_vlans"] + + args = dict( + name=name, + mode=mode, + access_vlan=access_vlan, + native_vlan=native_vlan, + trunk_vlans=trunk_vlans, + trunk_allowed_vlans=trunk_allowed_vlans, + ) + + proposed = dict((k, v) for k, v in args.items() if v is not None) + + name = name.lower() + + if mode == "access" and state == "present" and not access_vlan: + module.fail_json( + msg="access_vlan param is required when mode=access && state=present" + ) + + if mode == "trunk" and access_vlan: + module.fail_json( + msg="access_vlan param not supported when using mode=trunk" + ) + + current_mode = get_interface_mode(name, module) + + # Current mode will return layer3, layer2, or unknown + if current_mode == "unknown" or current_mode == "layer3": + module.fail_json( + msg="Ensure interface is configured to be a L2" + "\nport first before using this module. You can use" + "\nthe nxos_interface module for this." + ) + + if interface_is_portchannel(name, module): + module.fail_json( + msg="Cannot change L2 config on physical " + "\nport because it is in a portchannel. " + "\nYou should update the portchannel config." + ) + + # existing will never be null for Eth intfs as there is always a default + existing = get_switchport(name, module) + + # Safeguard check + # If there isn't an existing, something is wrong per previous comment + if not existing: + module.fail_json( + msg="Make sure you are using the FULL interface name" + ) + + if trunk_vlans or trunk_allowed_vlans: + if trunk_vlans: + trunk_vlans_list = vlan_range_to_list(trunk_vlans) + elif trunk_allowed_vlans: + trunk_vlans_list = vlan_range_to_list(trunk_allowed_vlans) + proposed["allowed"] = True + + existing_trunks_list = vlan_range_to_list( + (existing["trunk_vlans"]) + ) + + existing["trunk_vlans_list"] = existing_trunks_list + proposed["trunk_vlans_list"] = trunk_vlans_list + + current_vlans = get_list_of_vlans(module) + + if state == "present": + if access_vlan and access_vlan not in current_vlans: + module.fail_json( + msg="You are trying to configure a VLAN" + " on an interface that\ndoes not exist on the " + " switch yet!", + vlan=access_vlan, + ) + elif native_vlan and native_vlan not in current_vlans: + module.fail_json( + msg="You are trying to configure a VLAN" + " on an interface that\ndoes not exist on the " + " switch yet!", + vlan=native_vlan, + ) + else: + command = get_switchport_config_commands( + name, existing, proposed, module + ) + commands.append(command) + elif state == "unconfigured": + is_default = is_switchport_default(existing) + if not is_default: + command = default_switchport_config(name) + commands.append(command) + elif state == "absent": + command = remove_switchport_config_commands( + name, existing, proposed, module + ) + commands.append(command) + + if trunk_vlans or trunk_allowed_vlans: + existing.pop("trunk_vlans_list") + proposed.pop("trunk_vlans_list") + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + result["changed"] = True + load_config(module, cmds) + if "configure" in cmds: + cmds.pop(0) + + result["commands"] = cmds + result["warnings"] = warnings + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interfaces.py new file mode 100644 index 00000000..1d7c4456 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l2_interfaces.py @@ -0,0 +1,404 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_l2_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_l2_interfaces +short_description: L2 interfaces resource module +description: This module manages Layer-2 interfaces attributes of NX-OS Interfaces. +version_added: 1.0.0 +author: Trishna Guha (@trishnaguha) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section ^interface). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A dictionary of Layer-2 interface options + type: list + elements: dict + suboptions: + name: + description: + - Full name of interface, i.e. Ethernet1/1. + type: str + required: true + access: + description: + - Switchport mode access command to configure the interface as a Layer-2 access. + type: dict + suboptions: + vlan: + description: + - Configure given VLAN in access port. It's used as the access VLAN ID. + type: int + trunk: + description: + - Switchport mode trunk command to configure the interface as a Layer-2 trunk. + type: dict + suboptions: + native_vlan: + description: + - Native VLAN to be configured in trunk port. It is used as the trunk + native VLAN ID. + type: int + allowed_vlans: + description: + - List of allowed VLANs in a given trunk port. These are the only VLANs + that will be configured on the trunk. + type: str + mode: + description: + - 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. + type: str + choices: + - access + - trunk + - fex-fabric + - fabricpath + state: + description: + - The state of the configuration after module completion. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# switchport access vlan 20 +# interface Ethernet1/2 +# switchport trunk native vlan 20 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + +- name: Merge provided configuration with device configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 10 + allowed_vlans: 2,4,15 + - name: Ethernet1/2 + access: + vlan: 30 + state: merged + +# After state: +# ------------ +# +# interface Ethernet1/1 +# switchport trunk native vlan 10 +# switchport trunk allowed vlans 2,4,15 +# interface Ethernet1/2 +# switchport access vlan 30 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + + +# Using replaced + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# switchport access vlan 20 +# interface Ethernet1/2 +# switchport trunk native vlan 20 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + +- name: Replace device configuration of specified L2 interfaces with provided configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 20 + allowed_vlans: 5-10, 15 + state: replaced + +# After state: +# ------------ +# +# interface Ethernet1/1 +# switchport trunk native vlan 20 +# switchport trunk allowed vlan 5-10,15 +# interface Ethernet1/2 +# switchport trunk native vlan 20 +# switchport mode trunk +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + + +# Using overridden + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# switchport access vlan 20 +# interface Ethernet1/2 +# switchport trunk native vlan 20 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + +- name: Override device configuration of all L2 interfaces on device with provided + configuration. + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/2 + access: + vlan: 30 + state: overridden + +# After state: +# ------------ +# +# interface Ethernet1/1 +# interface Ethernet1/2 +# switchport access vlan 30 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + + +# Using deleted + +# Before state: +# ------------- +# +# interface Ethernet1/1 +# switchport access vlan 20 +# interface Ethernet1/2 +# switchport trunk native vlan 20 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + +- name: Delete L2 attributes of given interfaces (Note This won't delete the interface + itself). + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + - name: Ethernet1/2 + state: deleted + +# After state: +# ------------ +# +# interface Ethernet1/1 +# interface Ethernet1/2 +# interface mgmt0 +# ip address dhcp +# ipv6 address auto-config + +# Using rendered + +- name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 10 + allowed_vlans: 2,4,15 + - name: Ethernet1/2 + access: + vlan: 30 + - name: Ethernet1/3 + trunk: + native_vlan: 20 + allowed_vlans: 5-10, 15 + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/1" +# - "switchport trunk allowed vlan 2,4,15" +# - "switchport trunk native vlan 10" +# - "interface Ethernet1/2" +# - "switchport access vlan 30" +# - "interface Ethernet1/3" +# - "switchport trunk allowed vlan 5,6,7,8,9,10,15" +# - "switchport trunk native vlan 20" + +# Using parsed + +# parsed.cfg +# ------------ +# interface Ethernet1/800 +# switchport access vlan 18 +# switchport trunk allowed vlan 210 +# interface Ethernet1/801 +# switchport trunk allowed vlan 2,4,15 + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_l2_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# parsed: +# - name: Ethernet1/800 +# access: +# vlan: 18 +# trunk: +# allowed_vlans: "210" +# - name: Ethernet1/801 +# trunk: +# allowed_vlans: "2,4,15" + +# Using gathered + +# Existing device config state +# ------------------------------- +# Nexus9kvI5# sh running-config | section ^interface +# interface Ethernet1/1 +# switchport access vlan 6 +# switchport trunk allowed vlan 200 +# interface Ethernet1/2 +# switchport trunk native vlan 10 + +- name: Gather l2_interfaces facts from the device using nxos_l2_interfaces + cisco.nxos.nxos_l2_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# - name: "Ethernet1/1" +# access: +# vlan: 6 +# trunk: +# allowed_vlans: "200" +# +# - name: "Ethernet1/2" +# trunk: +# native_vlan: 10 +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: + - "interface Ethernet1/1" + - "switchport trunk allowed vlan 2,4,15" + - "switchport trunk native vlan 10" + - "interface Ethernet1/2" + - "switchport access vlan 30" + - "interface Ethernet1/3" + - "switchport trunk allowed vlan 5,6,7,8,9,10,15" + - "switchport trunk native vlan 20" +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.l2_interfaces.l2_interfaces import ( + L2_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.l2_interfaces.l2_interfaces import ( + L2_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=L2_interfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = L2_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interface.py new file mode 100644 index 00000000..4d2635b9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interface.py @@ -0,0 +1,290 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, 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 + + +DOCUMENTATION = """ +module: nxos_l3_interface +author: Trishna Guha (@trishnaguha) +short_description: (deprecated, removed after 2022-06-01) Manage L3 interfaces + on Cisco NXOS network devices +description: +- This module provides declarative management of L3 interfaces on Cisco NXOS network + devices. +version_added: 1.0.0 +deprecated: + alternative: nxos_l3_interfaces + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +notes: +- Tested against NXOSv 7.0(3)I5(1). +options: + name: + description: + - Name of the L3 interface. + type: str + ipv4: + description: + - IPv4 of the L3 interface. + type: str + ipv6: + description: + - IPv6 of the L3 interface. + type: str + aggregate: + description: List of L3 interfaces definitions. + type: list + elements: dict + suboptions: + name: + description: + - Name of the L3 interface. + type: str + ipv4: + description: + - IPv4 of the L3 interface. + type: str + ipv6: + description: + - IPv6 of the L3 interface. + type: str + state: + description: + - State of the L3 interface configuration. + choices: + - present + - absent + type: str + state: + description: + - State of the L3 interface configuration. + default: present + choices: + - present + - absent + type: str +extends_documentation_fragment: +- cisco.nxos.nxos +""" + +EXAMPLES = """ +- name: Set interface IPv4 address + cisco.nxos.nxos_l3_interface: + name: Ethernet2/3 + ipv4: 192.168.0.1/24 + +- name: Remove interface IPv4 address + cisco.nxos.nxos_l3_interface: + name: Ethernet2/3 + state: absent + +- name: Set IP addresses on aggregate + cisco.nxos.nxos_l3_interface: + aggregate: + - {name: Ethernet2/1, ipv4: 192.168.2.10/24} + - {name: Ethernet2/5, ipv4: 192.168.3.10/24, ipv6: fd5d:12c9:2201:1::1/64} + +- name: Remove IP addresses on aggregate + cisco.nxos.nxos_l3_interface: + aggregate: + - {name: Ethernet2/1, ipv4: 192.168.2.10/24} + - {name: Ethernet2/5, ipv4: 192.168.3.10/24, ipv6: fd5d:12c9:2201:1::1/64} + state: absent +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always, except for the platforms that use Netconf transport to manage the device. + type: list + sample: + - interface ethernet2/3 + - no switchport + - ip address 192.168.22.1/24 + - ipv6 address "fd5d:12c9:2201:1::1/64" + - no ip address 192.168.22.1/24 +""" + +import re + +from copy import deepcopy + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + normalize_interface, +) + + +def search_obj_in_list(name, lst): + for o in lst: + if o["name"] == name: + return o + + +def map_obj_to_commands(updates, module, warnings): + commands = list() + want, have = updates + + for w in want: + name = w["name"] + ipv4 = w["ipv4"] + ipv6 = w["ipv6"] + state = w["state"] + del w["state"] + + obj_in_have = search_obj_in_list(name, have) + + if not obj_in_have: + warnings.append("Unknown interface {0}".format(name)) + elif state == "absent": + command = [] + if obj_in_have["name"] == name: + if ipv4 and ipv4 == obj_in_have["ipv4"]: + command.append("no ip address {0}".format(ipv4)) + if ipv6 and ipv6 in obj_in_have["ipv6"]: + command.append("no ipv6 address {0}".format(ipv6)) + if command: + command.append("exit") + command.insert(0, "interface {0}".format(name)) + commands.extend(command) + + elif state == "present": + command = [] + if obj_in_have["name"] == name: + if ipv4 and ipv4 != obj_in_have["ipv4"]: + command.append("ip address {0}".format(ipv4)) + if ipv6 and ipv6 not in obj_in_have["ipv6"]: + command.append("ipv6 address {0}".format(ipv6)) + if command: + command.append("exit") + command.insert(0, "interface {0}".format(name)) + elif not ipv4 and not ipv6: + command.append("interface {0}".format(name)) + commands.extend(command) + + return commands + + +def map_params_to_obj(module): + obj = [] + + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + name = d["name"] + d["name"] = normalize_interface(name) + obj.append(d) + + else: + obj.append( + { + "name": normalize_interface(module.params["name"]), + "ipv4": module.params["ipv4"], + "ipv6": module.params["ipv6"], + "state": module.params["state"], + } + ) + + return obj + + +def map_config_to_obj(want, module): + objs = list() + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + + for w in want: + parents = ["interface {0}".format(w["name"])] + config = netcfg.get_section(parents) + obj = dict(name=None, ipv4=None, ipv6=[]) + + if config: + match_name = re.findall(r"interface (\S+)", config, re.M) + if match_name: + obj["name"] = normalize_interface(match_name[0]) + + match_ipv4 = re.findall(r"ip address (\S+)", config, re.M) + if match_ipv4: + obj["ipv4"] = match_ipv4[0] + + match_ipv6 = re.findall(r"ipv6 address (\S+)", config, re.M) + if match_ipv6: + obj["ipv6"] = match_ipv6 + + objs.append(obj) + return objs + + +def main(): + """ main entry point for module execution + """ + element_spec = dict( + name=dict(), + ipv4=dict(), + ipv6=dict(), + state=dict(default="present", choices=["present", "absent"]), + ) + + aggregate_spec = deepcopy(element_spec) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec) + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + required_one_of = [["name", "aggregate"]] + mutually_exclusive = [["name", "aggregate"]] + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False} + + want = map_params_to_obj(module) + have = map_config_to_obj(want, module) + + commands = map_obj_to_commands((want, have), module, warnings) + result["commands"] = commands + + if warnings: + result["warnings"] = warnings + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interfaces.py new file mode 100644 index 00000000..3c623776 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_l3_interfaces.py @@ -0,0 +1,404 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_l3_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_l3_interfaces +short_description: L3 interfaces resource module +description: This module manages Layer-3 interfaces attributes of NX-OS Interfaces. +version_added: 1.0.0 +author: Trishna Guha (@trishnaguha) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section '^interface'). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A dictionary of Layer-3 interface options + type: list + elements: dict + suboptions: + name: + description: + - Full name of L3 interface, i.e. Ethernet1/1. + type: str + required: true + dot1q: + description: + - Configures IEEE 802.1Q VLAN encapsulation on a subinterface. + type: int + ipv4: + description: + - IPv4 address and attributes of the L3 interface. + type: list + elements: dict + suboptions: + address: + description: + - IPV4 address of the L3 interface. + type: str + tag: + description: + - URIB route tag value for local/direct routes. + type: int + secondary: + description: + - A boolean attribute to manage addition of secondary IP address. + type: bool + ipv6: + description: + - IPv6 address and attributes of the L3 interface. + type: list + elements: dict + suboptions: + address: + description: + - IPV6 address of the L3 interface. + type: str + tag: + description: + - URIB route tag value for local/direct routes. + type: int + redirects: + description: + - Enables/disables ip redirects + type: bool + unreachables: + description: + - Enables/disables ip redirects + type: bool + evpn_multisite_tracking: + description: + - VxLAN evpn multisite Interface tracking. Supported only on selected model. + type: str + version_added: 1.1.0 + choices: + - fabric-tracking + - dci-tracking + state: + description: + - The state of the configuration after module completion. + - The state I(overridden) would override the IP address configuration + of all interfaces on the device with the provided configuration in + the task. Use caution with this state as you may loose access to the + device. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# +# interface Ethernet1/6 + +- name: Merge provided configuration with device configuration. + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/6 + ipv4: + - address: 192.168.1.1/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: true + tag: 10 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + - name: Ethernet1/7.42 + dot1q: 42 + redirects: false + unreachables: false + state: merged + +# After state: +# ------------ +# +# interface Ethernet1/6 +# ip address 192.168.22.1/24 tag 5 +# ip address 10.1.1.1/24 secondary tag 10 +# interface Ethernet1/6 +# ipv6 address fd5d:12c9:2201:2::1/64 tag 6 +# interface Ethernet1/7.42 +# encapsulation dot1q 42 +# no ip redirects +# no ip unreachables + + +# Using replaced + +# Before state: +# ------------- +# +# interface Ethernet1/6 +# ip address 192.168.22.1/24 +# ipv6 address "fd5d:12c9:2201:1::1/64" + +- name: Replace device configuration of specified L3 interfaces with provided configuration. + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/6 + ipv4: + - address: 192.168.22.3/24 + state: replaced + +# After state: +# ------------ +# +# interface Ethernet1/6 +# ip address 192.168.22.3/24 + + +# Using overridden + +# Before state: +# ------------- +# +# interface Ethernet1/2 +# ip address 192.168.22.1/24 +# interface Ethernet1/6 +# ipv6 address "fd5d:12c9:2201:1::1/64" + +- name: Override device configuration of all L3 interfaces on device with provided + configuration. + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/2 + ipv4: 192.168.22.3/4 + state: overridden + +# After state: +# ------------ +# +# interface Ethernet1/2 +# ipv4 address 192.168.22.3/24 +# interface Ethernet1/6 + + +# Using deleted + +# Before state: +# ------------- +# +# interface Ethernet1/6 +# ip address 192.168.22.1/24 +# interface Ethernet1/2 +# ipv6 address "fd5d:12c9:2201:1::1/64" + +- name: Delete L3 attributes of given interfaces (This won't delete the interface + itself). + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/6 + - name: Ethernet1/2 + state: deleted + +# After state: +# ------------ +# +# interface Ethernet1/6 +# interface Ethernet1/2 + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/800 + ipv4: + - address: 192.168.1.100/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: true + tag: 10 + - name: Ethernet1/800 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/800" +# - "ip address 192.168.1.100/24 tag 5" +# - "ip address 10.1.1.1/24 secondary tag 10" +# - "interface Ethernet1/800" +# - "ipv6 address fd5d:12c9:2201:2::1/64 tag 6" + +# Using parsed + +# parsed.cfg +# ------------ +# interface Ethernet1/800 +# ip address 192.168.1.100/24 tag 5 +# ip address 10.1.1.1/24 secondary tag 10 +# no ip redirects +# interface Ethernet1/801 +# ipv6 address fd5d:12c9:2201:2::1/64 tag 6 +# ip unreachables +# interface mgmt0 +# ip address dhcp +# vrf member management + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_l3_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- + +# parsed: +# - name: Ethernet1/800 +# ipv4: +# - address: 192.168.1.100/24 +# tag: 5 +# - address: 10.1.1.1/24 +# secondary: True +# tag: 10 +# redirects: False +# - name: Ethernet1/801 +# ipv6: +# - address: fd5d:12c9:2201:2::1/64 +# tag: 6 +# unreachables: True + +# Using gathered + +# Existing device config state +# ------------------------------- +# interface Ethernet1/1 +# ip address 192.0.2.100/24 +# interface Ethernet1/2 +# no ip redirects +# ip address 203.0.113.10/24 +# ip unreachables +# ipv6 address 2001:db8::1/32 + +- name: Gather l3_interfaces facts from the device using nxos_l3_interfaces + cisco.nxos.nxos_l3_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- + +# gathered: +# - name: Ethernet1/1 +# ipv4: +# - address: 192.0.2.100/24 +# - name: Ethernet1/2 +# ipv4: +# - address: 203.0.113.10/24 +# ipv6: +# - address: 2001:db8::1/32 +# redirects: False +# unreachables: True +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface Ethernet1/2', 'ip address 192.168.0.1/2'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.l3_interfaces.l3_interfaces import ( + L3_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.l3_interfaces.l3_interfaces import ( + L3_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=L3_interfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = L3_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp.py new file mode 100644 index 00000000..072499a2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp.py @@ -0,0 +1,275 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_lacp +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_lacp +short_description: LACP resource module +description: This module manages Global Link Aggregation Control Protocol (LACP) on + NX-OS devices. +version_added: 1.0.0 +author: Trishna Guha (@trishnaguha) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL. +- Feature lacp should be enabled for this module. +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | include lacp). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: LACP global options. + type: dict + suboptions: + system: + description: + - LACP system options + type: dict + suboptions: + priority: + description: + - The system priority to use in LACP negotiations. + type: int + mac: + description: + - MAC address to be used for the LACP Protocol exchanges + type: dict + suboptions: + address: + description: + - MAC-address (FORMAT :xxxx.xxxx.xxxx). + type: str + role: + description: + - The role for the Switch. + type: str + choices: + - primary + - secondary + state: + description: + - The state of the configuration after module completion. + type: str + choices: + - merged + - replaced + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# + +- name: Merge provided configuration with device configuration. + cisco.nxos.nxos_lacp: + config: + system: + priority: 10 + mac: + address: 00c1.4c00.bd15 + state: merged + +# After state: +# ------------ +# +# lacp system-priority 10 +# lacp system-mac 00c1.4c00.bd15 + + +# Using replaced + +# Before state: +# ------------- +# +# lacp system-priority 10 + +- name: Replace device global lacp configuration with the given configuration. + cisco.nxos.nxos_lacp: + config: + system: + mac: + address: 00c1.4c00.bd15 + state: replaced + +# After state: +# ------------ +# +# lacp system-mac 00c1.4c00.bd15 + + +# Using deleted + +# Before state: +# ------------- +# +# lacp system-priority 10 + +- name: Delete global LACP configurations. + cisco.nxos.nxos_lacp: + state: deleted + +# After state: +# ------------ +# + +# Using rendered + +- name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_lacp: + config: + system: + priority: 10 + mac: + address: 00c1.4c00.bd15 + role: secondary + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "lacp system-priority 10" +# - "lacp system-mac 00c1.4c00.bd15 role secondary" + +# Using parsed + +# parsed.cfg +# ------------ +# lacp system-priority 10 +# lacp system-mac 00c1.4c00.bd15 role secondary + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_lacp: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# parsed: +# system: +# priority: 10 +# mac: +# address: 00c1.4c00.bd15 +# role: secondary + +# Using gathered + +# Existing device config state +# ------------------------------- +# Nexus9000v# show running-config | include lacp +# lacp system-priority 11 +# lacp system-mac 00c1.4c00.bd15 role primary + +- name: Gather lacp facts from the device using nxos_lacp + cisco.nxos.nxos_lacp: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# system: +# priority: 11 +# mac: +# address: 00c1.4c00.bd15 +# role: primary +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['lacp system-priority 15', 'lacp system-mac 00c1.4c00.bd15 role primary'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.lacp.lacp import ( + LacpArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.lacp.lacp import ( + Lacp, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=LacpArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Lacp(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp_interfaces.py new file mode 100644 index 00000000..e208fad1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lacp_interfaces.py @@ -0,0 +1,378 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_lacp_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_lacp_interfaces +short_description: LACP interfaces resource module +description: This module manages Link Aggregation Control Protocol (LACP) attributes + of NX-OS Interfaces. +version_added: 1.0.0 +author: Trishna Guha (@trishnaguha) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section ^interface). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A dictionary of LACP interfaces options. + type: list + elements: dict + suboptions: + name: + description: + - Name of the interface. + required: true + type: str + port_priority: + description: + - LACP port priority for the interface. Range 1-65535. Applicable only for + Ethernet. + type: int + rate: + description: + - Rate at which PDUs are sent by LACP. Applicable only for Ethernet. At fast + rate LACP is transmitted once every 1 second. At normal rate LACP is transmitted + every 30 seconds after the link is bundled. + type: str + choices: + - fast + - normal + links: + description: + - This dict contains configurable options related to max and min port-channel + links. Applicable only for Port-channel. + type: dict + suboptions: + max: + description: + - Port-channel max bundle. + type: int + min: + description: + - Port-channel min links. + type: int + mode: + description: + - LACP mode. Applicable only for Port-channel. + type: str + choices: + - delay + suspend_individual: + description: + - port-channel lacp state. Disabling this will cause lacp to put the port + to individual state and not suspend the port in case it does not get LACP + BPDU from the peer ports in the port-channel. + type: bool + convergence: + description: + - This dict contains configurable options related to convergence. Applicable + only for Port-channel. + type: dict + suboptions: + graceful: + description: + - port-channel lacp graceful convergence. Disable this only with lacp + ports connected to Non-Nexus peer. Disabling this with Nexus peer can + lead to port suspension. + type: bool + vpc: + description: + - Enable lacp convergence for vPC port channels. + type: bool + state: + description: + - The state of the configuration after module completion. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# + +- name: Merge provided configuration with device configuration. + cisco.nxos.nxos_lacp_interfaces: + config: + - name: Ethernet1/3 + port_priority: 5 + rate: fast + state: merged + +# After state: +# ------------ +# +# interface Ethernet1/3 +# lacp port-priority 5 +# lacp rate fast + + +# Using replaced + +# Before state: +# ------------- +# +# interface Ethernet1/3 +# lacp port-priority 5 +# interface port-channel11 +# lacp mode delay + +- name: Replace device lacp interfaces configuration with the given configuration. + cisco.nxos.nxos_lacp_interfaces: + config: + - name: port-channel11 + links: + min: 4 + state: replaced + +# After state: +# ------------ +# +# interface Ethernet1/3 +# lacp port-priority 5 +# interface port-channel11 +# lacp min-links 4 + + +# Using overridden + +# Before state: +# ------------- +# +# interface Ethernet1/3 +# lacp port-priority 5 +# interface port-channel11 +# lacp mode delay + +- name: Override device configuration of all LACP interfaces attributes of given interfaces + on device with provided configuration. + cisco.nxos.nxos_lacp_interfaces: + config: + - name: port-channel11 + links: + min: 4 + state: overridden + +# After state: +# ------------ +# +# interface port-channel11 +# lacp min-links 4 + + +# Using deleted + +# Before state: +# ------------- +# +# interface Ethernet1/3 +# lacp port-priority 5 +# interface port-channel11 +# lacp mode delay + +- name: Delete LACP interfaces configurations. + cisco.nxos.nxos_lacp_interfaces: + state: deleted + +# After state: +# ------------ +# + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_lacp_interfaces: + config: + - name: Ethernet1/800 + rate: fast + - name: Ethernet1/801 + rate: fast + port_priority: 32 + - name: port-channel10 + links: + max: 15 + min: 2 + convergence: + graceful: true + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/800" +# - "lacp rate fast" +# - "interface Ethernet1/801" +# - "lacp port-priority 32" +# - "lacp rate fast" +# - "interface port-channel10" +# - "lacp min-links 2" +# - "lacp max-bundle 15" +# - "lacp graceful-convergence" + +# Using parsed + +# parsed.cfg +# ------------ + +# interface port-channel10 +# lacp min-links 10 +# lacp max-bundle 15 +# interface Ethernet1/800 +# lacp port-priority 100 +# lacp rate fast + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_lacp_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- + +# parsed: +# - name: port-channel10 +# links: +# max: 15 +# min: 10 +# - name: Ethernet1/800 +# port_priority: 100 +# rate: fast + +# Using gathered + +# Existing device config state +# ------------------------------- +# interface Ethernet1/1 +# lacp port-priority 5 +# lacp rate fast +# interface port-channel10 +# lacp mode delay +# interface port-channel11 +# lacp max-bundle 10 +# lacp min-links 5 + +- name: Gather lacp_interfaces facts from the device using nxos_lacp_interfaces + cisco.nxos.nxos_lacp_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# - name: Ethernet1/1 +# port_priority: 5 +# rate: fast +# - name: port-channel10 +# mode: delay +# - name: port-channel11 +# links: +# max: 10 +# min: 5 +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface port-channel10', 'lacp min-links 5', 'lacp mode delay'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.lacp_interfaces.lacp_interfaces import ( + Lacp_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.lacp_interfaces.lacp_interfaces import ( + Lacp_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=Lacp_interfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Lacp_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lag_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lag_interfaces.py new file mode 100644 index 00000000..cb9c6682 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lag_interfaces.py @@ -0,0 +1,365 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_lag_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_lag_interfaces +short_description: LAG interfaces resource module +description: This module manages attributes of link aggregation groups of NX-OS Interfaces. +version_added: 1.0.0 +author: +- Trishna Guha (@trishnaguha) +- Nilashish Chakraborty (@NilashishC) +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section ^interface). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A list of link aggregation group configurations. + type: list + elements: dict + suboptions: + name: + description: + - Name of the link aggregation group (LAG). + type: str + required: true + members: + description: + - The list of interfaces that are part of the group. + type: list + elements: dict + suboptions: + member: + description: + - The interface name. + type: str + mode: + description: + - Link aggregation group (LAG). + type: str + choices: + - 'active' + - 'on' + - 'passive' + force: + description: + - When true it forces link aggregation group members to match what is + declared in the members param. This can be used to remove members. + type: bool + state: + description: + - The state of the configuration after module completion. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL. +- This module works with connection C(network_cli). + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# +# interface Ethernet1/4 + +- name: Merge provided configuration with device configuration. + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel99 + members: + - member: Ethernet1/4 + state: merged + +# After state: +# ------------ +# +# interface Ethernet1/4 +# channel-group 99 + + +# Using replaced + +# Before state: +# ------------- +# +# interface Ethernet1/4 +# channel-group 99 mode active + +- name: Replace device configuration of specified LAG attributes of given interfaces + with provided configuration. + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel10 + members: + - member: Ethernet1/4 + state: replaced + +# After state: +# ------------ +# +# interface Ethernet1/4 +# channel-group 10 + + +# Using overridden + +# Before state: +# ------------- +# +# interface Ethernet1/4 +# channel-group 10 +# interface Ethernet1/2 +# channel-group 99 mode passive + +- name: Override device configuration of all LAG attributes of given interfaces on + device with provided configuration. + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel20 + members: + - member: Ethernet1/6 + force: true + state: overridden + +# After state: +# ------------ +# interface Ethernet1/2 +# interface Ethernet1/4 +# interface Ethernet1/6 +# channel-group 20 force + + +# Using deleted + +# Before state: +# ------------- +# +# interface Ethernet1/4 +# channel-group 99 mode active + +- name: Delete LAG attributes of given interface (This won't delete the port-channel + itself). + cisco.nxos.nxos_lag_interfaces: + config: + - port-channel: port-channel99 + state: deleted + +- name: Delete LAG attributes of all the interfaces + cisco.nxos.nxos_lag_interfaces: + state: deleted + +# After state: +# ------------ +# +# interface Ethernet1/4 +# no channel-group 99 + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel10 + members: + - member: Ethernet1/800 + mode: active + - member: Ethernet1/801 + - name: port-channel11 + members: + - member: Ethernet1/802 + mode: passive + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "interface Ethernet1/800" +# - "channel-group 10 mode active" +# - "interface Ethernet1/801" +# - "channel-group 10" +# - "interface Ethernet1/802" +# - "channel-group 11 mode passive" + +# Using parsed + +# parsed.cfg +# ------------ + +# interface port-channel10 +# interface port-channel11 +# interface port-channel12 +# interface Ethernet1/800 +# channel-group 10 mode active +# interface Ethernet1/801 +# channel-group 10 mode active +# interface Ethernet1/802 +# channel-group 11 mode passive +# interface Ethernet1/803 +# channel-group 11 mode passive + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_lag_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- + +# parsed: +# - members: +# - member: Ethernet1/800 +# mode: active +# - member: Ethernet1/801 +# mode: active +# name: port-channel10 +# +# - members: +# - member: Ethernet1/802 +# mode: passive +# - member: Ethernet1/803 +# mode: passive +# name: port-channel11 +# +# - name: port-channel12 + +# Using gathered + +# Existing device config state +# ------------------------------- +# interface port-channel10 +# interface port-channel11 +# interface Ethernet1/1 +# channel-group 10 mode active +# interface Ethernet1/2 +# channel-group 11 mode passive +# + +- name: Gather lag_interfaces facts from the device using nxos_lag_interfaces + cisco.nxos.nxos_lag_interfaces: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# - name: port-channel10 +# members: +# - member: Ethernet1/1 +# mode: active +# - name: port-channel11 +# members: +# - member: Ethernet1/2 +# mode: passive +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: + - "interface Ethernet1/800" + - "channel-group 10 mode active" + - "interface Ethernet1/801" + - "channel-group 10" + - "interface Ethernet1/802" + - "channel-group 11 mode passive" +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.lag_interfaces.lag_interfaces import ( + Lag_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.lag_interfaces.lag_interfaces import ( + Lag_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=Lag_interfacesArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Lag_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_linkagg.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_linkagg.py new file mode 100644 index 00000000..2ff69d99 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_linkagg.py @@ -0,0 +1,559 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, 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 + + +DOCUMENTATION = """ +module: nxos_linkagg +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manage link + aggregation groups on Cisco NXOS devices. +description: +- This module provides declarative management of link aggregation groups on Cisco + NXOS devices. +version_added: 1.0.0 +deprecated: + alternative: nxos_lag_interfaces + why: Updated modules released with more functionality. + removed_at_date: '2022-06-01' +author: +- Trishna Guha (@trishnaguha) +notes: +- Tested against NXOSv 7.0(3)I5(1). +- C(state=absent) removes the portchannel config and interface if it already exists. + If members to be removed are not explicitly passed, all existing members (if any), + are removed. +- Members must be a list. +- LACP needs to be enabled first if active/passive modes are used. +options: + group: + description: + - Channel-group number for the port-channel Link aggregation group. + type: str + mode: + description: + - Mode for the link aggregation group. + choices: + - 'active' + - 'on' + - 'passive' + default: 'on' + type: str + min_links: + description: + - Minimum number of ports required up before bringing up the link aggregation + group. + type: int + members: + description: + - List of interfaces that will be managed in the link aggregation group. + type: list + elements: str + force: + description: + - When true it forces link aggregation group members to match what is declared + in the members param. This can be used to remove members. + type: bool + default: no + aggregate: + description: List of link aggregation definitions. + type: list + elements: dict + suboptions: + group: + description: + - Channel-group number for the port-channel Link aggregation group. + type: str + required: True + mode: + description: + - Mode for the link aggregation group. + choices: + - 'active' + - 'on' + - 'passive' + type: str + min_links: + description: + - Minimum number of ports required up before bringing up the link aggregation + group. + type: int + members: + description: + - List of interfaces that will be managed in the link aggregation group. + type: list + elements: str + force: + description: + - When true it forces link aggregation group members to match what is declared + in the members param. This can be used to remove members. + type: bool + state: + description: + - State of the link aggregation group. + choices: + - present + - absent + type: str + state: + description: + - State of the link aggregation group. + default: present + choices: + - present + - absent + type: str + purge: + description: + - Purge links not defined in the I(aggregate) parameter. + type: bool + default: no +""" + +EXAMPLES = """ +- name: create link aggregation group + cisco.nxos.nxos_linkagg: + group: 99 + state: present + +- name: delete link aggregation group + cisco.nxos.nxos_linkagg: + group: 99 + state: absent + +- name: set link aggregation group to members + cisco.nxos.nxos_linkagg: + group: 10 + min_links: 3 + mode: active + members: + - Ethernet1/2 + - Ethernet1/4 + +- name: remove link aggregation group from Ethernet1/2 + cisco.nxos.nxos_linkagg: + group: 10 + min_links: 3 + mode: active + members: + - Ethernet1/4 + +- name: Create aggregate of linkagg definitions + cisco.nxos.nxos_linkagg: + aggregate: + - {group: 3} + - {group: 100, min_links: 3} + +- name: Remove aggregate of linkagg definitions + cisco.nxos.nxos_linkagg: + aggregate: + - {group: 3} + - {group: 100, min_links: 3} + state: absent +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always, except for the platforms that use Netconf transport to manage the device. + type: list + sample: + - interface port-channel 30 + - lacp min-links 5 + - interface Ethernet2/1 + - channel-group 30 mode active + - no interface port-channel 30 +""" + +import re +from copy import deepcopy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + normalize_interface, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) + + +def search_obj_in_list(group, lst): + for o in lst: + if o["group"] == group: + return o + + +def get_diff(w, obj): + c = deepcopy(w) + o = deepcopy(obj) + + if o["group"] == c["group"] and o.get("members") == c.get("members"): + if "members" in o: + del o["members"] + if "members" in c: + del c["members"] + diff_dict = dict(set(c.items()) - set(o.items())) + return diff_dict + + +def map_obj_to_commands(updates, module): + commands = list() + want, have = updates + purge = module.params["purge"] + force = module.params["force"] + + for w in want: + group = w["group"] + mode = w["mode"] + min_links = w["min_links"] + members = w.get("members") or [] + state = w["state"] + del w["state"] + + obj_in_have = search_obj_in_list(group, have) + + if state == "absent": + if obj_in_have: + members_to_remove = list( + set(obj_in_have["members"]) - set(members) + ) + if members_to_remove: + for m in members_to_remove: + commands.append("interface {0}".format(m)) + commands.append( + "no channel-group {0}".format(obj_in_have["group"]) + ) + commands.append("exit") + commands.append("no interface port-channel {0}".format(group)) + + elif state == "present": + if not obj_in_have: + commands.append("interface port-channel {0}".format(group)) + if min_links != "None": + commands.append("lacp min-links {0}".format(min_links)) + commands.append("exit") + if members: + for m in members: + commands.append("interface {0}".format(m)) + if force: + commands.append( + "channel-group {0} force mode {1}".format( + group, mode + ) + ) + else: + commands.append( + "channel-group {0} mode {1}".format( + group, mode + ) + ) + + else: + if members: + if not obj_in_have["members"]: + for m in members: + commands.append( + "interface port-channel {0}".format(group) + ) + commands.append("exit") + commands.append("interface {0}".format(m)) + if force: + commands.append( + "channel-group {0} force mode {1}".format( + group, mode + ) + ) + else: + commands.append( + "channel-group {0} mode {1}".format( + group, mode + ) + ) + + elif set(members) != set(obj_in_have["members"]): + missing_members = list( + set(members) - set(obj_in_have["members"]) + ) + for m in missing_members: + commands.append( + "interface port-channel {0}".format(group) + ) + commands.append("exit") + commands.append("interface {0}".format(m)) + if force: + commands.append( + "channel-group {0} force mode {1}".format( + group, mode + ) + ) + else: + commands.append( + "channel-group {0} mode {1}".format( + group, mode + ) + ) + + superfluous_members = list( + set(obj_in_have["members"]) - set(members) + ) + for m in superfluous_members: + commands.append( + "interface port-channel {0}".format(group) + ) + commands.append("exit") + commands.append("interface {0}".format(m)) + commands.append( + "no channel-group {0}".format(group) + ) + + else: + diff = get_diff(w, obj_in_have) + if diff and "mode" in diff: + mode = diff["mode"] + for i in members: + commands.append("interface {0}".format(i)) + if force: + commands.append( + "channel-group {0} force mode {1}".format( + group, mode + ) + ) + else: + commands.append( + "channel-group {0} mode {1}".format( + group, mode + ) + ) + + if purge: + for h in have: + obj_in_want = search_obj_in_list(h["group"], want) + if not obj_in_want: + commands.append( + "no interface port-channel {0}".format(h["group"]) + ) + + return commands + + +def map_params_to_obj(module): + obj = [] + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + d["group"] = str(d["group"]) + d["min_links"] = str(d["min_links"]) + if d["members"]: + d["members"] = [normalize_interface(i) for i in d["members"]] + + obj.append(d) + else: + members = None + if module.params["members"]: + members = [ + normalize_interface(i) for i in module.params["members"] + ] + + obj.append( + { + "group": str(module.params["group"]), + "mode": module.params["mode"], + "min_links": str(module.params["min_links"]), + "members": members, + "state": module.params["state"], + } + ) + + return obj + + +def parse_min_links(module, group): + min_links = None + + flags = ["| section interface.port-channel{0}".format(group)] + config = get_config(module, flags=flags) + match = re.search(r"lacp min-links (\S+)", config, re.M) + if match: + min_links = match.group(1) + + return min_links + + +def parse_mode(module, m): + mode = None + + flags = ["| section interface.{0}".format(m)] + config = get_config(module, flags=flags) + match = re.search( + r"channel-group [0-9]+ (force )?mode (\S+)", config, re.M + ) + if match: + mode = match.group(2) + + return mode + + +def get_members(channel): + members = [] + if "TABLE_member" in channel.keys(): + interfaces = channel["TABLE_member"]["ROW_member"] + else: + return list() + + if isinstance(interfaces, dict): + members.append(normalize_interface(interfaces.get("port"))) + elif isinstance(interfaces, list): + for i in interfaces: + members.append(normalize_interface(i.get("port"))) + + return members + + +def parse_members(output, group): + channels = output["TABLE_channel"]["ROW_channel"] + + if isinstance(channels, list): + for channel in channels: + if channel["group"] == group: + members = get_members(channel) + elif isinstance(channels, dict): + if channels["group"] == group: + members = get_members(channels) + else: + return list() + + return members + + +def parse_channel_options(module, output, channel): + obj = {} + + group = channel["group"] + obj["group"] = str(group) + obj["min_links"] = parse_min_links(module, group) + members = parse_members(output, group) + obj["members"] = members + for m in members: + obj["mode"] = parse_mode(module, m) + + return obj + + +def map_config_to_obj(module): + objs = list() + output = run_commands(module, ["show port-channel summary | json"])[0] + if not output: + return list() + + try: + channels = output["TABLE_channel"]["ROW_channel"] + except (TypeError, KeyError): + return objs + + if channels: + if isinstance(channels, list): + for channel in channels: + obj = parse_channel_options(module, output, channel) + objs.append(obj) + + elif isinstance(channels, dict): + obj = parse_channel_options(module, output, channels) + objs.append(obj) + + return objs + + +def main(): + """ main entry point for module execution + """ + element_spec = dict( + group=dict(type="str"), + mode=dict( + required=False, + choices=["on", "active", "passive"], + default="on", + type="str", + ), + min_links=dict(required=False, default=None, type="int"), + members=dict( + required=False, default=None, type="list", elements="str" + ), + force=dict(required=False, default=False, type="bool"), + state=dict( + required=False, choices=["absent", "present"], default="present" + ), + ) + + aggregate_spec = deepcopy(element_spec) + aggregate_spec["group"] = dict(required=True) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec), + purge=dict(default=False, type="bool"), + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + required_one_of = [["group", "aggregate"]] + mutually_exclusive = [["group", "aggregate"]] + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + have = map_config_to_obj(module) + + commands = map_obj_to_commands((want, have), module) + result["commands"] = commands + + if commands: + if not module.check_mode: + resp = load_config(module, commands, True) + if resp: + for item in resp: + if item: + if isinstance(item, dict): + err_str = item["clierror"] + else: + err_str = item + if "cannot add" in err_str.lower(): + module.fail_json(msg=err_str) + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp.py new file mode 100644 index 00000000..c9ccfdb8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp.py @@ -0,0 +1,129 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, 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 + + +DOCUMENTATION = """ +module: nxos_lldp +author: Ganesh Nalawade (@ganeshrn) +short_description: (deprecated, removed after 2022-06-01) Manage LLDP + configuration on Cisco NXOS network devices. +description: +- This module provides declarative management of LLDP service on Cisco NXOS network + devices. +version_added: 1.0.0 +deprecated: + alternative: nxos_lldp_global + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +notes: +- Tested against NXOSv 7.0(3)I5(1). +options: + state: + description: + - State of the LLDP configuration. If value is I(present) lldp will be enabled + else if it is I(absent) it will be disabled. + default: present + choices: + - present + - absent + - enabled + - disabled + type: str +extends_documentation_fragment: +- cisco.nxos.nxos + + +""" + +EXAMPLES = """ +- name: Enable LLDP service + cisco.nxos.nxos_lldp: + state: present + +- name: Disable LLDP service + cisco.nxos.nxos_lldp: + state: absent +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always, except for the platforms that use Netconf transport to manage the device. + type: list + sample: + - feature lldp +""" +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) + + +def has_lldp(module): + output = get_config(module, ["| section lldp"]) + is_lldp_enable = False + if output and "feature lldp" in output: + is_lldp_enable = True + + return is_lldp_enable + + +def main(): + """ main entry point for module execution + """ + argument_spec = dict( + state=dict( + default="present", + choices=["present", "absent", "enabled", "disabled"], + ) + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + result = {"changed": False} + + if warnings: + result["warnings"] = warnings + + HAS_LLDP = has_lldp(module) + + commands = [] + + if module.params["state"] == "absent" and HAS_LLDP: + commands.append("no feature lldp") + elif module.params["state"] == "present" and not HAS_LLDP: + commands.append("feature lldp") + + result["commands"] = commands + + if commands: + # On N35 A8 images, some features return a yes/no prompt + # on enablement or disablement. Bypass using terminal dont-ask + commands.insert(0, "terminal dont-ask") + if not module.check_mode: + load_config(module, commands) + + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_global.py new file mode 100644 index 00000000..3bf38c19 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_global.py @@ -0,0 +1,342 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_lldp_global +""" +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_lldp_global +short_description: LLDP resource module +description: This module configures and manages the Link Layer Discovery Protocol(LLDP) + attributes on NX-OS platforms. +version_added: 1.0.0 +author: Adharsh Srivats Rangarajan (@adharshsrivatsr) +notes: +- Tested against NxOS 7.3.(0)D1(1) on VIRL +- The LLDP feature needs to be enabled before using this module +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | include lldp). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: + - A list of link layer discovery configurations + type: dict + suboptions: + holdtime: + description: + - Amount of time the receiving device should hold the information (in seconds) + type: int + port_id: + description: + - This attribute defines if the interface names should be advertised in the + long(0) or short(1) form. + type: int + choices: + - 0 + - 1 + reinit: + description: + - Amount of time to delay the initialization of LLDP on any interface (in + seconds) + type: int + timer: + description: + - Frequency at which LLDP updates need to be transmitted (in seconds) + type: int + tlv_select: + description: + - This attribute can be used to specify the TLVs that need to be sent and + received in the LLDP packets. By default, all TLVs are advertised + type: dict + suboptions: + dcbxp: + description: + - Used to specify the Data Center Bridging Exchange Protocol TLV + type: bool + management_address: + description: + - Used to specify the management address in TLV messages + type: dict + suboptions: + v4: + description: Management address with TLV v4 + type: bool + v6: + description: Management address with TLV v6 + type: bool + port: + description: + - Used to manage port based attributes in TLV messages + type: dict + suboptions: + description: + description: + - Used to specify the port description TLV + type: bool + vlan: + description: + - Used to specify the port VLAN ID TLV + type: bool + power_management: + description: + - Used to specify IEEE 802.3 DTE Power via MDI TLV + type: bool + system: + description: + - Used to manage system based attributes in TLV messages + type: dict + suboptions: + capabilities: + description: + - Used to specify the system capabilities TLV + type: bool + description: + description: + - Used to specify the system description TLV + type: bool + name: + description: + - Used to specify the system name TLV + type: bool + state: + description: + - The state of the configuration after module completion + type: str + choices: + - merged + - replaced + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged +# Before state: +# ------------- +# +# user(config)# show running-config | include lldp +# feature lldp + +- name: Merge provided configuration with device configuration + cisco.nxos.nxos_lldp_global: + config: + timer: 35 + holdtime: 100 + state: merged + +# After state: +# ------------ +# +# user(config)# show running-config | include lldp +# feature lldp +# lldp timer 35 +# lldp holdtime 100 + + +# Using replaced +# Before state: +# ------------- +# +# user(config)# show running-config | include lldp +# feature lldp +# lldp holdtime 100 +# lldp reinit 5 +# lldp timer 35 + +- name: Replace device configuration of specific LLDP attributes with provided configuration + cisco.nxos.nxos_lldp_global: + config: + timer: 40 + tlv_select: + system: + description: true + name: false + management_address: + v4: true + state: replaced + +# After state: +# ------------ +# +# user(config)# show running-config | include lldp +# feature lldp +# lldp timer 40 +# no lldp tlv-select system-name + + +# Using deleted +# Before state: +# ------------- +# +# user(config)# show running-config | include lldp +# feature lldp +# lldp holdtime 5 +# lldp reinit 3 + +- name: Delete LLDP configuration (this will by default remove all lldp configuration) + cisco.nxos.nxos_lldp_global: + state: deleted + +# After state: +# ------------ +# +# user(config)# show running-config | include lldp +# feature lldp + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_lldp_global: + config: + holdtime: 130 + port_id: 1 + reinit: 5 + tlv_select: + dcbxp: yes + power_management: yes + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - "lldp tlv-select dcbxp" +# - "lldp tlv-select power-management" +# - "lldp portid-subtype 1" +# - "lldp reinit 5" +# - "lldp holdtime 130" + +# Using parsed + +# parsed.cfg +# ------------ +# lldp holdtime 131 +# lldp reinit 7 +# no lldp tlv-select system-name +# no lldp tlv-select system-description + +# Task output (redacted) +# ----------------------- + +# parsed: +# holdtime: 131 +# reinit: 7 +# tlv_select: +# system: +# description: false +# name: false + +# Using gathered + +# Existing device config state +# ------------------------------- +# feature lldp +# lldp holdtime 129 +# lldp reinit 5 +# lldp timer 35 +# no lldp tlv-select system-name + +# Task output (redacted) +# ----------------------- + +# gathered: +# reinit: 5 +# timer: 35 +# tlv_select: +# system: +# name: False +# holdtime: 129 +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['lldp holdtime 125', 'lldp reinit 4', 'no lldp tlv-select system-name'] +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.lldp_global.lldp_global import ( + Lldp_globalArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.lldp_global.lldp_global import ( + Lldp_global, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + mutually_exclusive = [("config", "running_config")] + + module = AnsibleModule( + argument_spec=Lldp_globalArgs.argument_spec, + required_if=required_if, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = Lldp_global(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_interfaces.py new file mode 100644 index 00000000..045686a6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_lldp_interfaces.py @@ -0,0 +1,260 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_lldp_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_lldp_interfaces +short_description: LLDP interfaces resource module +description: This module manages interfaces' configuration for Link Layer Discovery + Protocol (LLDP) on NX-OS platforms. +version_added: 1.0.0 +author: Adharsh Srivats Rangarajan (@adharshsrivatsr) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL +- The LLDP feature needs to be enabled before using this module +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section ^interface). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: + - A list of link layer discovery configurations for interfaces. + type: list + elements: dict + suboptions: + name: + description: + - Name of the interface + required: true + type: str + receive: + description: + - Used to enable or disable the reception of LLDP packets on that interface. + By default, this is enabled after LLDP is enabled globally. + type: bool + transmit: + description: + - Used to enable or disable the transmission of LLDP packets on that interface. + By default, this is enabled after LLDP is enabled globally. + type: bool + tlv_set: + description: + - Used to configure TLV parameters on the interface + type: dict + suboptions: + management_address: + description: + - Used to mention the IPv4 or IPv6 management address for the interface + type: str + vlan: + description: + - Used to mention the VLAN for the interface + type: int + state: + description: + - The state the configuration should be left in + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# + +- name: Merge provided configuration with device configuration + cisco.nxos.nxos_lldp_interfaces: + config: + - name: Ethernet1/4 + receive: false + transmit: true + tlv_set: + management_address: 192.168.122.64 + vlan: 12 + state: merged + +# After state: +# ------------- +# +# interface Ethernet1/4 +# no lldp receive +# lldp tlv-set management-address 192.168.122.64 +# lldp tlv-set vlan 12 + + +# Using replaced + +# Before state: +# ------------ +# +# interface Ethernet1/4 +# no lldp receive +# lldp tlv-set management-address 192.168.122.64 +# interface Ethernet1/5 +# no lldp transmit +# lldp tlv-set vlan 10 + +- name: Replace LLDP configuration on interfaces with given configuration + cisco.nxos.nxos_lldp_interfaces: + config: + - name: Ethernet1/4 + transmit: no + tlv_set: + vlan: 2 + state: replaced + + +# After state: +# ----------- +# +# interface Ethernet1/4 +# no lldp transmit +# lldp tlv_set vlan 2 +# interface Ethernet1/5 +# no lldp transmit +# lldp tlv-set vlan 10 + + +# Using overridden + +# Before state: +# ------------ +# +# interface Ethernet1/4 +# no lldp receive +# lldp tlv-set management-address 192.168.122.64 +# interface Ethernet1/5 +# no lldp transmit +# lldp tlv-set vlan 10 + +- name: Override LLDP configuration on all interfaces with given configuration + cisco.nxos.nxos_lldp_interfaces: + config: + - name: Ethernet1/7 + receive: no + tlv_set: + vlan: 12 + state: overridden + + +# After state: +# ----------- +# +# interface Ethernet1/7 +# no lldp receive +# lldp tlv_set vlan 12 + + +# Using deleted + +# Before state: +# ------------ +# +# interface Ethernet1/4 +# lldp tlv-set management vlan 24 +# no lldp transmit +# interface mgmt0 +# no lldp receive + +- name: Delete LLDP interfaces configuration + cisco.nxos.nxos_lldp_interfaces: + state: deleted + +# After state: +# ------------ +# + + +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['interface Ethernet1/2', 'lldp receive', 'lldp tlv-set vlan 12'] +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.lldp_interfaces.lldp_interfaces import ( + Lldp_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.lldp_interfaces.lldp_interfaces import ( + Lldp_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=Lldp_interfacesArgs.argument_spec, + supports_check_mode=True, + ) + + result = Lldp_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_logging.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_logging.py new file mode 100644 index 00000000..b8845861 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_logging.py @@ -0,0 +1,979 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# Copyright: (c) 2017, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +DOCUMENTATION = """ +module: nxos_logging +author: Trishna Guha (@trishnaguha) +short_description: Manage logging on network devices +description: +- This module provides declarative management of logging on Cisco NX-OS devices. +version_added: 1.0.0 +options: + dest: + description: + - Destination of the logs. + choices: + - console + - logfile + - module + - monitor + - server + type: str + remote_server: + description: + - Hostname or IP Address for remote logging (when dest is 'server'). + type: str + use_vrf: + description: + - VRF to be used while configuring remote logging (when dest is 'server'). + type: str + interface: + description: + - Interface to be used while configuring source-interface for logging (e.g., 'Ethernet1/2', + 'mgmt0') + type: str + name: + description: + - If value of C(dest) is I(logfile) it indicates file-name. + type: str + facility: + description: + - Facility name for logging. + type: str + dest_level: + description: + - Set logging severity levels. + aliases: + - level + type: int + facility_level: + description: + - Set logging severity levels for facility based log messages. + type: int + aggregate: + description: List of logging definitions. + type: list + elements: dict + state: + description: + - State of the logging configuration. + default: present + choices: + - present + - absent + type: str + event: + description: + - Link/trunk enable/default interface configuration logging + choices: + - link-enable + - link-default + - trunk-enable + - trunk-default + type: str + interface_message: + description: + - Add interface description to interface syslogs. Does not work with version 6.0 + images using nxapi as a transport. + choices: + - add-interface-description + type: str + file_size: + description: + - Set logfile size + type: int + facility_link_status: + description: + - Set logging facility ethpm link status. Not idempotent with version 6.0 images. + choices: + - link-down-notif + - link-down-error + - link-up-notif + - link-up-error + type: str + timestamp: + description: + - Set logging timestamp format + choices: + - microseconds + - milliseconds + - seconds + type: str + purge: + description: + - Remove any switch logging configuration that does not match what has been configured + Not supported for ansible_connection local. All nxos_logging tasks must use + the same ansible_connection type. + type: bool + default: false +extends_documentation_fragment: +- cisco.nxos.nxos +""" + +EXAMPLES = """ +- name: configure console logging with level + cisco.nxos.nxos_logging: + dest: console + level: 2 + state: present +- name: remove console logging configuration + cisco.nxos.nxos_logging: + dest: console + level: 2 + state: absent +- name: configure file logging with level + cisco.nxos.nxos_logging: + dest: logfile + name: testfile + dest_level: 3 + state: present +- name: Configure logging logfile with size + cisco.nxos.nxos_logging: + dest: logfile + name: testfile + dest_level: 3 + file_size: 16384 +- name: configure facility level logging + cisco.nxos.nxos_logging: + facility: daemon + facility_level: 0 + state: present +- name: remove facility level logging + cisco.nxos.nxos_logging: + facility: daemon + facility_level: 0 + state: absent +- name: Configure Remote Logging + cisco.nxos.nxos_logging: + dest: server + remote_server: test-syslogserver.com + facility: auth + facility_level: 1 + use_vrf: management + state: present +- name: Configure Source Interface for Logging + cisco.nxos.nxos_logging: + interface: mgmt0 + state: present +- name: Purge nxos_logging configuration not managed by this playbook + cisco.nxos.nxos_logging: + purge: true +- name: Configure logging timestamp + cisco.nxos.nxos_logging: + timestamp: milliseconds + state: present +- name: Configure logging facility ethpm link status + cisco.nxos.nxos_logging: + facility: ethpm + facility_link_status: link-up-notif + state: present +- name: Configure logging message ethernet description + cisco.nxos.nxos_logging: + interface_message: add-interface-description + state: present +- name: Configure logging event link enable + cisco.nxos.nxos_logging: + event: link-enable + state: present +- name: Configure logging using aggregate + cisco.nxos.nxos_logging: + aggregate: + - {dest: console, dest_level: 2} + - {dest: logfile, dest_level: 2, name: testfile} + - {facility: daemon, facility_level: 0} + state: present +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always + type: list + sample: + - logging console 2 + - logging logfile testfile 3 + - logging level daemon 0 +""" + +import re +import copy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, + save_module_context, + read_module_context, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + normalize_interface, +) +from ansible.module_utils.basic import AnsibleModule + + +STATIC_CLI = { + "link-enable": "logging event link-status enable", + "link-default": "logging event link-status default", + "trunk-enable": "logging event trunk-status enable", + "trunk-default": "logging event trunk-status default", + "microseconds": "logging timestamp microseconds", + "milliseconds": "logging timestamp milliseconds", + "seconds": "logging timestamp seconds", + "link-up-error": "link-up error", + "link-up-notif": "link-up notif", + "link-down-error": "link-down error", + "link-down-notif": "link-down notif", + "add-interface-description": "logging message interface type ethernet description", +} + +DEFAULT_LOGGING_LEVEL = { + 0: [], + 1: [], + 2: ["pktmgr"], + 3: ["adjmgr", "arp", "icmpv6", "l2rib", "netstack"], + 4: [], + 5: ["mrib", "m6rib"], + 6: [], + 7: [], +} + +DEST_GROUP = ["console", "logfile", "module", "monitor", "server"] + + +def map_obj_to_commands(module, updates): + commands = list() + want, have = updates + + for w in want: + state = w["state"] + del w["state"] + + if state == "absent" and w in have: + if w["facility"] is not None: + if ( + not w["dest"] + and not w["facility_link_status"] + and w["facility"] + not in DEFAULT_LOGGING_LEVEL[int(w["facility_level"])] + ): + commands.append( + "no logging level {0} {1}".format( + w["facility"], w["facility_level"] + ) + ) + + if w["facility_link_status"] and w["facility"] in ("ethpm"): + commands.append( + "no logging level {0} {1}".format( + w["facility"], + STATIC_CLI[w["facility_link_status"]], + ) + ) + + if w["name"] is not None: + commands.append("no logging logfile") + + if w["dest"] in ("console", "module", "monitor"): + commands.append("no logging {0}".format(w["dest"])) + + if w["dest"] == "server": + commands.append( + "no logging server {0}".format(w["remote_server"]) + ) + + if w["interface"]: + commands.append("no logging source-interface") + + if w["event"] and w["event"] in STATIC_CLI: + commands.append("no " + STATIC_CLI[w["event"]]) + + if w["message"] and w["message"] in STATIC_CLI: + commands.append("no " + STATIC_CLI[w["message"]]) + + if w["timestamp"] and w["timestamp"] in STATIC_CLI: + commands.append("no " + STATIC_CLI[w["timestamp"]]) + + if state == "present" and w not in have: + if w["facility"] is None: + if w["dest"]: + if w["dest"] not in ("logfile", "server"): + commands.append( + "logging {0} {1}".format( + w["dest"], w["dest_level"] + ) + ) + + elif w["dest"] == "logfile": + if w["file_size"]: + commands.append( + "logging logfile {0} {1} size {2}".format( + w["name"], w["dest_level"], w["file_size"] + ) + ) + else: + commands.append( + "logging logfile {0} {1}".format( + w["name"], w["dest_level"] + ) + ) + + elif w["dest"] == "server": + if w["facility_level"]: + if w["use_vrf"]: + commands.append( + "logging server {0} {1} use-vrf {2}".format( + w["remote_server"], + w["facility_level"], + w["use_vrf"], + ) + ) + else: + commands.append( + "logging server {0} {1}".format( + w["remote_server"], w["facility_level"] + ) + ) + + else: + if w["use_vrf"]: + commands.append( + "logging server {0} use-vrf {1}".format( + w["remote_server"], w["use_vrf"] + ) + ) + else: + commands.append( + "logging server {0}".format( + w["remote_server"] + ) + ) + + if w["facility"]: + if w["dest"] == "server": + if w["facility_level"]: + if w["use_vrf"]: + commands.append( + "logging server {0} {1} facility {2} use-vrf {3}".format( + w["remote_server"], + w["facility_level"], + w["facility"], + w["use_vrf"], + ) + ) + else: + commands.append( + "logging server {0} {1} facility {2}".format( + w["remote_server"], + w["facility_level"], + w["facility"], + ) + ) + else: + if w["use_vrf"]: + commands.append( + "logging server {0} facility {1} use-vrf {2}".format( + w["remote_server"], + w["facility"], + w["use_vrf"], + ) + ) + else: + commands.append( + "logging server {0} facility {1}".format( + w["remote_server"], w["facility"] + ) + ) + else: + if w["facility_link_status"]: + commands.append( + "logging level {0} {1}".format( + w["facility"], + STATIC_CLI[w["facility_link_status"]], + ) + ) + else: + if not match_facility_default( + module, w["facility"], w["facility_level"] + ): + commands.append( + "logging level {0} {1}".format( + w["facility"], w["facility_level"] + ) + ) + + if w["interface"]: + commands.append( + "logging source-interface {0} {1}".format( + *split_interface(w["interface"]) + ) + ) + + if w["event"] and w["event"] in STATIC_CLI: + commands.append(STATIC_CLI[w["event"]]) + + if w["message"] and w["message"] in STATIC_CLI: + commands.append(STATIC_CLI[w["message"]]) + + if w["timestamp"] and w["timestamp"] in STATIC_CLI: + commands.append(STATIC_CLI[w["timestamp"]]) + + return commands + + +def match_facility_default(module, facility, want_level): + """ Check wanted facility to see if it matches current device default """ + + matches_default = False + # Sample output from show logging level command + # Facility Default Severity Current Session Severity + # -------- ---------------- ------------------------ + # bfd 5 5 + # + # 0(emergencies) 1(alerts) 2(critical) + # 3(errors) 4(warnings) 5(notifications) + # 6(information) 7(debugging) + + regexl = r"\S+\s+(\d+)\s+(\d+)" + cmd = { + "command": "show logging level {0}".format(facility), + "output": "text", + } + facility_data = run_commands(module, cmd) + for line in facility_data[0].split("\n"): + mo = re.search(regexl, line) + if ( + mo + and int(mo.group(1)) == int(want_level) + and int(mo.group(2)) == int(want_level) + ): + matches_default = True + + return matches_default + + +def split_interface(interface): + match = re.search(r"(\D+)(\S*)", interface, re.M) + if match: + return match.group(1), match.group(2) + + +def parse_facility_link_status(line, facility, status): + facility_link_status = None + + if facility is not None: + match = re.search( + r"logging level {0} {1} (\S+)".format(facility, status), line, re.M + ) + if match: + facility_link_status = status + "-" + match.group(1) + + return facility_link_status + + +def parse_event_status(line, event): + status = None + + match = re.search( + r"logging event {0} (\S+)".format(event + "-status"), line, re.M + ) + if match: + state = match.group(1) + if state: + status = state + + return status + + +def parse_event(line): + event = None + + match = re.search(r"logging event (\S+)", line, re.M) + if match: + state = match.group(1) + if state == "link-status": + event = "link" + elif state == "trunk-status": + event = "trunk" + + return event + + +def parse_message(line): + message = None + + match = re.search( + r"logging message interface type ethernet description", line, re.M + ) + if match: + message = "add-interface-description" + + return message + + +def parse_file_size(line, name, level): + file_size = None + + match = re.search( + r"logging logfile {0} {1} size (\S+)".format(name, level), line, re.M + ) + if match: + file_size = match.group(1) + if file_size == "8192": + file_size = None + + return file_size + + +def parse_timestamp(line): + timestamp = None + + match = re.search(r"logging timestamp (\S+)", line, re.M) + if match: + timestamp = match.group(1) + + return timestamp + + +def parse_name(line, dest): + name = None + + if dest is not None: + if dest == "logfile": + match = re.search(r"logging logfile (\S+)", line, re.M) + if match: + name = match.group(1) + else: + pass + + return name + + +def parse_remote_server(line, dest): + remote_server = None + + if dest and dest == "server": + match = re.search(r"logging server (\S+)", line, re.M) + if match: + remote_server = match.group(1) + + return remote_server + + +def parse_dest_level(line, dest, name): + dest_level = None + + def parse_match(match): + level = None + if match: + if int(match.group(1)) in range(0, 8): + level = match.group(1) + else: + pass + return level + + if dest and dest != "server": + if dest == "logfile": + match = re.search( + r"logging logfile {0} (\S+)".format(name), line, re.M + ) + if match: + dest_level = parse_match(match) + + elif dest == "server": + match = re.search(r"logging server (?:\S+) (\d+)", line, re.M) + if match: + dest_level = parse_match(match) + else: + match = re.search(r"logging {0} (\S+)".format(dest), line, re.M) + if match: + dest_level = parse_match(match) + + return dest_level + + +def parse_facility_level(line, facility, dest): + facility_level = None + + if dest == "server": + match = re.search(r"logging server (?:\S+) (\d+)", line, re.M) + if match: + facility_level = match.group(1) + + elif facility is not None: + match = re.search( + r"logging level {0} (\S+)".format(facility), line, re.M + ) + if match: + facility_level = match.group(1) + + return facility_level + + +def parse_facility(line): + facility = None + + match = re.search( + r"logging server (?:\S+) (?:\d+) (?:\S+) (?:\S+) (?:\S+) (\S+)", + line, + re.M, + ) + if match: + facility = match.group(1) + + return facility + + +def parse_use_vrf(line, dest): + use_vrf = None + + if dest and dest == "server": + match = re.search( + r"logging server (?:\S+) (?:\d+) use-vrf (\S+)", line, re.M + ) + if match: + use_vrf = match.group(1) + + return use_vrf + + +def parse_interface(line): + interface = None + + match = re.search(r"logging source-interface (\S*)", line, re.M) + if match: + interface = match.group(1) + + return interface + + +def map_config_to_obj(module): + obj = [] + + data = get_config(module, flags=[" all | section logging"]) + + for line in data.split("\n"): + if re.search(r"no (\S+)", line, re.M): + state = "absent" + else: + state = "present" + + match = re.search(r"logging (\S+)", line, re.M) + if state == "present" and match: + event_status = None + name = None + dest_level = None + dest = None + facility = None + remote_server = None + facility_link_status = None + file_size = None + facility_level = None + + if match.group(1) in DEST_GROUP: + dest = match.group(1) + + name = parse_name(line, dest) + remote_server = parse_remote_server(line, dest) + dest_level = parse_dest_level(line, dest, name) + + if dest == "server": + facility = parse_facility(line) + + facility_level = parse_facility_level(line, facility, dest) + + if dest == "logfile": + file_size = parse_file_size(line, name, dest_level) + + elif match.group(1) == "level": + match_facility = re.search(r"logging level (\S+)", line, re.M) + facility = match_facility.group(1) + + level = parse_facility_level(line, facility, dest) + if level.isdigit(): + facility_level = level + else: + facility_link_status = parse_facility_link_status( + line, facility, level + ) + + elif match.group(1) == "event" and state == "present": + event = parse_event(line) + if event: + status = parse_event_status(line, event) + if status: + event_status = event + "-" + status + else: + continue + + else: + pass + + obj.append( + { + "dest": dest, + "remote_server": remote_server, + "use_vrf": parse_use_vrf(line, dest), + "name": name, + "facility": facility, + "dest_level": dest_level, + "facility_level": facility_level, + "interface": parse_interface(line), + "facility_link_status": facility_link_status, + "event": event_status, + "file_size": file_size, + "message": parse_message(line), + "timestamp": parse_timestamp(line), + } + ) + + cmd = [ + { + "command": "show logging | section enabled | section console", + "output": "text", + }, + { + "command": "show logging | section enabled | section monitor", + "output": "text", + }, + ] + + default_data = run_commands(module, cmd) + + for line in default_data: + flag = False + match = re.search( + r"Logging (\w+):(?:\s+) (?:\w+) (?:\W)Severity: (\w+)", + str(line), + re.M, + ) + if match: + if match.group(1) == "console" and match.group(2) == "critical": + dest_level = "2" + flag = True + elif ( + match.group(1) == "monitor" + and match.group(2) == "notifications" + ): + dest_level = "5" + flag = True + if flag: + obj.append( + { + "dest": match.group(1), + "remote_server": None, + "name": None, + "facility": None, + "dest_level": dest_level, + "facility_level": None, + "use_vrf": None, + "interface": None, + "facility_link_status": None, + "event": None, + "file_size": None, + "message": None, + "timestamp": None, + } + ) + + return obj + + +def map_params_to_obj(module): + obj = [] + + if "aggregate" in module.params and module.params["aggregate"]: + args = { + "dest": "", + "remote_server": "", + "use_vrf": "", + "name": "", + "facility": "", + "dest_level": "", + "facility_level": "", + "interface": "", + "facility_link_status": None, + "event": None, + "file_size": None, + "message": None, + "timestamp": None, + } + + for c in module.params["aggregate"]: + d = c.copy() + + for key in args: + if key not in d: + d[key] = None + + if d["dest_level"] is not None: + d["dest_level"] = str(d["dest_level"]) + + if d["facility_level"] is not None: + d["facility_level"] = str(d["facility_level"]) + + if d["interface"]: + d["interface"] = normalize_interface(d["interface"]) + + if "state" not in d: + d["state"] = module.params["state"] + + if d["file_size"]: + d["file_size"] = str(d["file_size"]) + + obj.append(d) + + else: + dest_level = None + facility_level = None + file_size = None + + if module.params["dest_level"] is not None: + dest_level = str(module.params["dest_level"]) + + if module.params["facility_level"] is not None: + facility_level = str(module.params["facility_level"]) + + if module.params["file_size"] is not None: + file_size = str(module.params["file_size"]) + + obj.append( + { + "dest": module.params["dest"], + "remote_server": module.params["remote_server"], + "use_vrf": module.params["use_vrf"], + "name": module.params["name"], + "facility": module.params["facility"], + "dest_level": dest_level, + "facility_level": facility_level, + "interface": normalize_interface(module.params["interface"]), + "state": module.params["state"], + "facility_link_status": module.params["facility_link_status"], + "event": module.params["event"], + "message": module.params["interface_message"], + "file_size": file_size, + "timestamp": module.params["timestamp"], + } + ) + return obj + + +def merge_wants(wants, want): + if not wants: + wants = list() + + for w in want: + w = copy.copy(w) + state = w["state"] + del w["state"] + + if state == "absent": + if w in wants: + wants.remove(w) + elif w not in wants: + wants.append(w) + + return wants + + +def absent(h): + h["state"] = "absent" + return h + + +def outliers(haves, wants): + wants = list(wants) + return [absent(h) for h in haves if not (h in wants or wants.append(h))] + + +def main(): + """ main entry point for module execution + """ + argument_spec = dict( + dest=dict(choices=DEST_GROUP), + name=dict(), + facility=dict(), + remote_server=dict(), + use_vrf=dict(), + dest_level=dict(type="int", aliases=["level"]), + facility_level=dict(type="int"), + interface=dict(), + facility_link_status=dict( + choices=[ + "link-down-notif", + "link-down-error", + "link-up-notif", + "link-up-error", + ] + ), + event=dict( + choices=[ + "link-enable", + "link-default", + "trunk-enable", + "trunk-default", + ] + ), + interface_message=dict(choices=["add-interface-description"]), + file_size=dict(type="int"), + timestamp=dict(choices=["microseconds", "milliseconds", "seconds"]), + state=dict(default="present", choices=["present", "absent"]), + aggregate=dict(type="list", elements="dict"), + purge=dict(default=False, type="bool"), + ) + + argument_spec.update(nxos_argument_spec) + + required_if = [ + ("dest", "logfile", ["name"]), + ("dest", "server", ["remote_server"]), + ] + + module = AnsibleModule( + argument_spec=argument_spec, + required_if=required_if, + supports_check_mode=True, + ) + + warnings = list() + + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + merged_wants = merge_wants(read_module_context(module), want) + have = map_config_to_obj(module) + + commands = map_obj_to_commands(module, (want, have)) + result["commands"] = commands + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + save_module_context(module, merged_wants) + + if module.params.get("purge"): + pcommands = map_obj_to_commands( + module, (outliers(have, merged_wants), have) + ) + if pcommands: + if not module.check_mode: + load_config(module, pcommands) + result["changed"] = True + result["commands"] += pcommands + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp.py new file mode 100644 index 00000000..3a4f0ec4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp.py @@ -0,0 +1,459 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 = """ +module: nxos_ntp +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages core NTP configuration. +description: +- Manages core NTP configuration. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +options: + server: + description: + - Network address of NTP server. + type: str + peer: + description: + - Network address of NTP peer. + type: str + key_id: + description: + - Authentication key identifier to use with given NTP server or peer or keyword + 'default'. + type: str + prefer: + description: + - Makes given NTP server or peer the preferred NTP server or peer for the device. + choices: + - enabled + - disabled + type: str + vrf_name: + description: + - Makes the device communicate with the given NTP server or peer over a specific + VRF or keyword 'default'. + type: str + source_addr: + description: + - Local source address from which NTP messages are sent or keyword 'default'. + type: str + source_int: + description: + - Local source interface from which NTP messages are sent. Must be fully qualified + interface name or keyword 'default' + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# Set NTP Server with parameters +- cisco.nxos.nxos_ntp: + server: 1.2.3.4 + key_id: 32 + prefer: enabled + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"address": "192.0.2.2", "key_id": "48", + "peer_type": "server", "prefer": "enabled", + "source": "192.0.2.3", "source_type": "source"} +existing: + description: + - k/v pairs of existing ntp server/peer + returned: always + type: dict + sample: {"address": "192.0.2.2", "key_id": "32", + "peer_type": "server", "prefer": "enabled", + "source": "ethernet2/1", "source_type": "source-interface"} +end_state: + description: k/v pairs of ntp info after module execution + returned: always + type: dict + sample: {"address": "192.0.2.2", "key_id": "48", + "peer_type": "server", "prefer": "enabled", + "source": "192.0.2.3", "source_type": "source"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["ntp server 192.0.2.2 prefer key 48", + "no ntp source-interface ethernet2/1", "ntp source 192.0.2.3"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + +import re + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + nxos_argument_spec, + run_commands, +) + + +def execute_show_command(command, module, command_type="cli_show"): + if "show run" not in command: + output = "json" + else: + output = "text" + + commands = [{"command": command, "output": output}] + return run_commands(module, commands) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_ntp_source(module): + source_type = None + source = None + command = "show run | inc ntp.source" + output = execute_show_command( + command, module, command_type="cli_show_ascii" + ) + + if output: + try: + if "interface" in output[0]: + source_type = "source-interface" + else: + source_type = "source" + source = output[0].split()[2].lower() + except (AttributeError, IndexError): + source_type = None + source = None + + return source_type, source + + +def get_ntp_peer(module): + command = "show run | inc ntp.(server|peer)" + ntp_peer_list = [] + response = execute_show_command( + command, module, command_type="cli_show_ascii" + ) + + if response: + if isinstance(response, list): + ntp = response[0] + else: + ntp = response + if ntp: + ntp_regex = ( + r".*ntp\s(server\s(?P
\S+)|peer\s(?P\S+))" + r"\s*((?Pprefer)\s*)?(use-vrf\s(?P\S+)\s*)?" + r"(key\s(?P\d+))?.*" + ) + + split_ntp = ntp.splitlines() + for peer_line in split_ntp: + if "access-group" in peer_line: + continue + ntp_peer = {} + try: + peer_address = None + vrf_name = "default" + prefer = None + key_id = None + match_ntp = re.match(ntp_regex, peer_line, re.DOTALL) + group_ntp = match_ntp.groupdict() + + address = group_ntp["address"] + peer_address = group_ntp["peer_address"] + prefer = group_ntp["prefer"] + vrf_name = group_ntp["vrf_name"] + key_id = group_ntp["key_id"] + + if prefer is not None: + prefer = "enabled" + else: + prefer = "disabled" + + if address is not None: + peer_type = "server" + elif peer_address is not None: + peer_type = "peer" + address = peer_address + + args = dict( + peer_type=peer_type, + address=address, + prefer=prefer, + vrf_name=vrf_name, + key_id=key_id, + ) + + ntp_peer = dict((k, v) for k, v in args.items()) + ntp_peer_list.append(ntp_peer) + except AttributeError: + ntp_peer_list = [] + + return ntp_peer_list + + +def get_ntp_existing(address, peer_type, module): + peer_dict = {} + peer_server_list = [] + + peer_list = get_ntp_peer(module) + for peer in peer_list: + if peer["address"] == address: + peer_dict.update(peer) + else: + peer_server_list.append(peer) + + source_type, source = get_ntp_source(module) + + if source_type is not None and source is not None: + peer_dict["source_type"] = source_type + peer_dict["source"] = source + + return (peer_dict, peer_server_list) + + +def set_ntp_server_peer(peer_type, address, prefer, key_id, vrf_name): + command_strings = [] + + if prefer: + command_strings.append(" prefer") + if key_id: + command_strings.append(" key {0}".format(key_id)) + if vrf_name: + command_strings.append(" use-vrf {0}".format(vrf_name)) + + command_strings.insert(0, "ntp {0} {1}".format(peer_type, address)) + + command = "".join(command_strings) + + return command + + +def config_ntp(delta, existing): + if ( + delta.get("address") + or delta.get("peer_type") + or delta.get("vrf_name") + or delta.get("key_id") + or delta.get("prefer") + ): + address = delta.get("address", existing.get("address")) + peer_type = delta.get("peer_type", existing.get("peer_type")) + key_id = delta.get("key_id", existing.get("key_id")) + prefer = delta.get("prefer", existing.get("prefer")) + vrf_name = delta.get("vrf_name", existing.get("vrf_name")) + if delta.get("key_id") == "default": + key_id = None + else: + peer_type = None + prefer = None + + source_type = delta.get("source_type") + source = delta.get("source") + + if prefer: + if prefer == "enabled": + prefer = True + elif prefer == "disabled": + prefer = False + + if source: + source_type = delta.get("source_type", existing.get("source_type")) + + ntp_cmds = [] + if peer_type: + if existing.get("peer_type") and existing.get("address"): + ntp_cmds.append( + "no ntp {0} {1}".format( + existing.get("peer_type"), existing.get("address") + ) + ) + ntp_cmds.append( + set_ntp_server_peer(peer_type, address, prefer, key_id, vrf_name) + ) + if source: + existing_source_type = existing.get("source_type") + existing_source = existing.get("source") + if existing_source_type and source_type != existing_source_type: + ntp_cmds.append( + "no ntp {0} {1}".format(existing_source_type, existing_source) + ) + if source == "default": + if existing_source_type and existing_source: + ntp_cmds.append( + "no ntp {0} {1}".format( + existing_source_type, existing_source + ) + ) + else: + ntp_cmds.append("ntp {0} {1}".format(source_type, source)) + + return ntp_cmds + + +def main(): + argument_spec = dict( + server=dict(type="str"), + peer=dict(type="str"), + key_id=dict(type="str"), + prefer=dict(type="str", choices=["enabled", "disabled"]), + vrf_name=dict(type="str"), + source_addr=dict(type="str"), + source_int=dict(type="str"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[["server", "peer"], ["source_addr", "source_int"]], + supports_check_mode=True, + ) + + warnings = list() + + server = module.params["server"] or None + peer = module.params["peer"] or None + key_id = module.params["key_id"] + prefer = module.params["prefer"] + vrf_name = module.params["vrf_name"] + source_addr = module.params["source_addr"] + source_int = module.params["source_int"] + state = module.params["state"] + + if source_int is not None: + source_int = source_int.lower() + + if server: + peer_type = "server" + address = server + elif peer: + peer_type = "peer" + address = peer + else: + peer_type = None + address = None + + source_type = None + source = None + if source_addr: + source_type = "source" + source = source_addr + elif source_int: + source_type = "source-interface" + source = source_int + + if key_id or vrf_name or prefer: + if not server and not peer: + module.fail_json(msg="Please supply the server or peer parameter") + + args = dict( + peer_type=peer_type, + address=address, + key_id=key_id, + prefer=prefer, + vrf_name=vrf_name, + source_type=source_type, + source=source, + ) + + proposed = dict((k, v) for k, v in args.items() if v is not None) + + existing, peer_server_list = get_ntp_existing(address, peer_type, module) + + end_state = existing + changed = False + commands = [] + + if state == "present": + delta = dict(set(proposed.items()).difference(existing.items())) + if delta.get("key_id") and delta.get("key_id") == "default": + if not existing.get("key_id"): + delta.pop("key_id") + if delta: + command = config_ntp(delta, existing) + if command: + commands.append(command) + + elif state == "absent": + if existing.get("peer_type") and existing.get("address"): + command = "no ntp {0} {1}".format( + existing["peer_type"], existing["address"] + ) + if command: + commands.append([command]) + + existing_source_type = existing.get("source_type") + existing_source = existing.get("source") + proposed_source_type = proposed.get("source_type") + proposed_source = proposed.get("source") + + if proposed_source_type: + if proposed_source_type == existing_source_type: + if proposed_source == existing_source: + command = "no ntp {0} {1}".format( + existing_source_type, existing_source + ) + if command: + commands.append([command]) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + end_state = get_ntp_existing(address, peer_type, module)[0] + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + results["end_state"] = end_state + results["peer_server_list"] = peer_server_list + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_auth.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_auth.py new file mode 100644 index 00000000..4aee5b9f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_auth.py @@ -0,0 +1,347 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_ntp_auth +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages NTP authentication. +description: +- Manages NTP authentication. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- If C(state=absent), the module will remove the given key configuration if it exists. +- If C(state=absent) and C(authentication=on), authentication will be turned off. +options: + key_id: + description: + - Authentication key identifier (numeric). + type: str + md5string: + description: + - MD5 String. + type: str + auth_type: + description: + - Whether the given md5string is in cleartext or has been encrypted. If in cleartext, + the device will encrypt it before storing it. + default: text + choices: + - text + - encrypt + type: str + trusted_key: + description: + - Whether the given key is required to be supplied by a time source for the device + to synchronize to the time source. + choices: + - 'false' + - 'true' + default: 'false' + type: str + authentication: + description: + - Turns NTP authentication on or off. + choices: + - "on" + - "off" + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# Basic NTP authentication configuration +- cisco.nxos.nxos_ntp_auth: + key_id: 32 + md5string: hello + auth_type: text +""" + +RETURN = """ +commands: + description: command sent to the device + returned: always + type: list + sample: ["ntp authentication-key 32 md5 helloWorld 0", "ntp trusted-key 32"] +""" + + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + if "show run" not in command: + command = {"command": command, "output": "json"} + else: + command = {"command": command, "output": "text"} + + return run_commands(module, [command]) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_ntp_auth(module): + command = "show ntp authentication-status" + + body = execute_show_command(command, module)[0] + ntp_auth_str = body["authentication"] + + if "enabled" in ntp_auth_str: + ntp_auth = True + else: + ntp_auth = False + + return ntp_auth + + +def get_ntp_trusted_key(module): + trusted_key_list = [] + command = "show run | inc ntp.trusted-key" + + trusted_key_str = execute_show_command(command, module)[0] + if trusted_key_str: + trusted_keys = trusted_key_str.splitlines() + + else: + trusted_keys = [] + + for line in trusted_keys: + if line: + trusted_key_list.append(str(line.split()[2])) + + return trusted_key_list + + +def get_ntp_auth_key(key_id, module): + authentication_key = {} + command = "show run | inc ntp.authentication-key.{0}".format(key_id) + auth_regex = ( + r".*ntp\sauthentication-key\s(?P\d+)\s" + r"md5\s(?P\S+)\s(?P\S+).*" + ) + + body = execute_show_command(command, module)[0] + + try: + match_authentication = re.match(auth_regex, body, re.DOTALL) + group_authentication = match_authentication.groupdict() + authentication_key["key_id"] = group_authentication["key_id"] + authentication_key["md5string"] = group_authentication["md5string"] + if group_authentication["atype"] == "7": + authentication_key["auth_type"] = "encrypt" + else: + authentication_key["auth_type"] = "text" + except (AttributeError, TypeError): + authentication_key = {} + + return authentication_key + + +def get_ntp_auth_info(key_id, module): + auth_info = get_ntp_auth_key(key_id, module) + trusted_key_list = get_ntp_trusted_key(module) + auth_power = get_ntp_auth(module) + + if key_id in trusted_key_list: + auth_info["trusted_key"] = "true" + else: + auth_info["trusted_key"] = "false" + + if auth_power: + auth_info["authentication"] = "on" + else: + auth_info["authentication"] = "off" + + return auth_info + + +def auth_type_to_num(auth_type): + if auth_type == "encrypt": + return "7" + else: + return "0" + + +def set_ntp_auth_key( + key_id, md5string, auth_type, trusted_key, authentication +): + ntp_auth_cmds = [] + if key_id and md5string: + auth_type_num = auth_type_to_num(auth_type) + ntp_auth_cmds.append( + "ntp authentication-key {0} md5 {1} {2}".format( + key_id, md5string, auth_type_num + ) + ) + + if trusted_key == "true": + ntp_auth_cmds.append("ntp trusted-key {0}".format(key_id)) + elif trusted_key == "false": + ntp_auth_cmds.append("no ntp trusted-key {0}".format(key_id)) + + if authentication == "on": + ntp_auth_cmds.append("ntp authenticate") + elif authentication == "off": + ntp_auth_cmds.append("no ntp authenticate") + + return ntp_auth_cmds + + +def remove_ntp_auth_key( + key_id, md5string, auth_type, trusted_key, authentication +): + auth_remove_cmds = [] + if key_id: + auth_type_num = auth_type_to_num(auth_type) + auth_remove_cmds.append( + "no ntp authentication-key {0} md5 {1} {2}".format( + key_id, md5string, auth_type_num + ) + ) + + if authentication: + auth_remove_cmds.append("no ntp authenticate") + return auth_remove_cmds + + +def main(): + argument_spec = dict( + key_id=dict(type="str"), + md5string=dict(type="str"), + auth_type=dict(choices=["text", "encrypt"], default="text"), + trusted_key=dict(choices=["true", "false"], default="false"), + authentication=dict(choices=["on", "off"]), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + key_id = module.params["key_id"] + md5string = module.params["md5string"] + auth_type = module.params["auth_type"] + trusted_key = module.params["trusted_key"] + authentication = module.params["authentication"] + state = module.params["state"] + + if key_id: + if not trusted_key and not md5string: + module.fail_json(msg="trusted_key or md5string MUST be specified") + + args = dict( + key_id=key_id, + md5string=md5string, + auth_type=auth_type, + trusted_key=trusted_key, + authentication=authentication, + ) + + changed = False + proposed = dict((k, v) for k, v in args.items() if v is not None) + + existing = get_ntp_auth_info(key_id, module) + end_state = existing + + delta = dict(set(proposed.items()).difference(existing.items())) + + commands = [] + if state == "present": + if delta: + command = set_ntp_auth_key( + key_id, + md5string, + delta.get("auth_type"), + delta.get("trusted_key"), + delta.get("authentication"), + ) + if command: + commands.append(command) + elif state == "absent": + auth_toggle = None + if existing.get("authentication") == "on": + auth_toggle = True + if not existing.get("key_id"): + key_id = None + command = remove_ntp_auth_key( + key_id, md5string, auth_type, trusted_key, auth_toggle + ) + if command: + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + load_config(module, cmds) + end_state = get_ntp_auth_info(key_id, module) + delta = dict(set(end_state.items()).difference(existing.items())) + if delta or (len(existing) != len(end_state)): + changed = True + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + results["end_state"] = end_state + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_options.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_options.py new file mode 100644 index 00000000..21a47155 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ntp_options.py @@ -0,0 +1,173 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_ntp_options +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages NTP options. +description: +- Manages NTP options, e.g. authoritative server and logging. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- When C(state=absent), master and logging will be set to False and stratum will be + removed as well +options: + master: + description: + - Sets whether the device is an authoritative NTP server. + type: bool + stratum: + description: + - If C(master=true), an optional stratum can be supplied (1-15). The device default + is 8. + type: str + logging: + description: + - Sets whether NTP logging is enabled on the device. + type: bool + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" +EXAMPLES = """ +# Basic NTP options configuration +- cisco.nxos.nxos_ntp_options: + master: true + stratum: 12 + logging: false + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +updates: + description: command sent to the device + returned: always + type: list + sample: ["no ntp logging", "ntp master 12"] +""" +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def get_current(module): + cmd = "show running-config | inc ntp" + + master = False + logging = False + stratum = None + + output = run_commands(module, ({"command": cmd, "output": "text"}))[0] + + if output: + match = re.search(r"^ntp master(?: (\d+))", output, re.M) + if match: + master = True + stratum = match.group(1) + logging = "ntp logging" in output.lower() + + return {"master": master, "stratum": stratum, "logging": logging} + + +def main(): + argument_spec = dict( + master=dict(required=False, type="bool"), + stratum=dict(required=False, type="str"), + logging=dict(required=False, type="bool"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + master = module.params["master"] + stratum = module.params["stratum"] + logging = module.params["logging"] + state = module.params["state"] + + if stratum and master is False: + if stratum != 8: + module.fail_json(msg="master MUST be True when stratum is changed") + + current = get_current(module) + + result = {"changed": False} + + commands = list() + + if state == "absent": + if current["master"]: + commands.append("no ntp master") + if current["logging"]: + commands.append("no ntp logging") + + elif state == "present": + if master and not current["master"]: + commands.append("ntp master") + elif master is False and current["master"]: + commands.append("no ntp master") + if stratum and stratum != current["stratum"]: + commands.append("ntp master %s" % stratum) + + if logging and not current["logging"]: + commands.append("ntp logging") + elif logging is False and current["logging"]: + commands.append("no ntp logging") + + result["commands"] = commands + result["updates"] = commands + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + result["warnings"] = warnings + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_nxapi.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_nxapi.py new file mode 100644 index 00000000..f3d2fde9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_nxapi.py @@ -0,0 +1,442 @@ +#!/usr/bin/python +# +# 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 . +# pylint: skip-file +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_nxapi +extends_documentation_fragment: +- cisco.nxos.nxos +author: Peter Sprygada (@privateip) +short_description: Manage NXAPI configuration on an NXOS device. +description: +- Configures the NXAPI feature on devices running Cisco NXOS. The NXAPI feature is + absent from the configuration by default. Since this module manages the NXAPI feature + it only supports the use of the C(Cli) transport. +version_added: 1.0.0 +options: + http_port: + description: + - Configure the port with which the HTTP server will listen on for requests. By + default, NXAPI will bind the HTTP service to the standard HTTP port 80. This + argument accepts valid port values in the range of 1 to 65535. + required: false + default: 80 + type: int + http: + description: + - Controls the operating state of the HTTP protocol as one of the underlying transports + for NXAPI. By default, NXAPI will enable the HTTP transport when the feature + is first configured. To disable the use of the HTTP transport, set the value + of this argument to False. + required: false + default: true + type: bool + aliases: + - enable_http + https_port: + description: + - Configure the port with which the HTTPS server will listen on for requests. By + default, NXAPI will bind the HTTPS service to the standard HTTPS port 443. This + argument accepts valid port values in the range of 1 to 65535. + required: false + default: 443 + type: int + https: + description: + - Controls the operating state of the HTTPS protocol as one of the underlying + transports for NXAPI. By default, NXAPI will disable the HTTPS transport when + the feature is first configured. To enable the use of the HTTPS transport, + set the value of this argument to True. + required: false + default: false + type: bool + aliases: + - enable_https + sandbox: + description: + - The NXAPI feature provides a web base UI for developers for entering commands. This + feature is initially disabled when the NXAPI feature is configured for the first + time. When the C(sandbox) argument is set to True, the developer sandbox URL + will accept requests and when the value is set to False, the sandbox URL is + unavailable. This is supported on NX-OS 7K series. + required: false + type: bool + aliases: + - enable_sandbox + state: + description: + - The C(state) argument controls whether or not the NXAPI feature is configured + on the remote device. When the value is C(present) the NXAPI feature configuration + is present in the device running-config. When the values is C(absent) the feature + configuration is removed from the running-config. + choices: + - present + - absent + required: false + default: present + type: str + ssl_strong_ciphers: + description: + - Controls the use of whether strong or weak ciphers are configured. By default, + this feature is disabled and weak ciphers are configured. To enable the use + of strong ciphers, set the value of this argument to True. + required: false + default: false + type: bool + tlsv1_0: + description: + - Controls the use of the Transport Layer Security version 1.0 is configured. By + default, this feature is enabled. To disable the use of TLSV1.0, set the value + of this argument to True. + required: false + default: true + type: bool + tlsv1_1: + description: + - Controls the use of the Transport Layer Security version 1.1 is configured. By + default, this feature is disabled. To enable the use of TLSV1.1, set the value + of this argument to True. + required: false + default: false + type: bool + tlsv1_2: + description: + - Controls the use of the Transport Layer Security version 1.2 is configured. By + default, this feature is disabled. To enable the use of TLSV1.2, set the value + of this argument to True. + required: false + default: false + type: bool +""" + +EXAMPLES = """ +- name: Enable NXAPI access with default configuration + cisco.nxos.nxos_nxapi: + state: present + +- name: Enable NXAPI with no HTTP, HTTPS at port 9443 and sandbox disabled + cisco.nxos.nxos_nxapi: + enable_http: false + https_port: 9443 + https: yes + enable_sandbox: no + +- name: remove NXAPI configuration + cisco.nxos.nxos_nxapi: + state: absent +""" + +RETURN = """ +updates: + description: + - Returns the list of commands that need to be pushed into the remote + device to satisfy the arguments + returned: always + type: list + sample: ['no feature nxapi'] +""" +import re + +from distutils.version import LooseVersion +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + run_commands, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, +) +from ansible.module_utils.basic import AnsibleModule + + +def check_args(module, warnings, capabilities): + network_api = capabilities.get("network_api", "nxapi") + if network_api == "nxapi": + module.fail_json(msg="module not supported over nxapi transport") + + os_platform = capabilities["device_info"]["network_os_platform"] + if "7K" not in os_platform and module.params["sandbox"]: + module.fail_json( + msg="sandbox or enable_sandbox is supported on NX-OS 7K series of switches" + ) + + state = module.params["state"] + + if state == "started": + module.params["state"] = "present" + warnings.append( + "state=started is deprecated and will be removed in a " + "a future release. Please use state=present instead" + ) + elif state == "stopped": + module.params["state"] = "absent" + warnings.append( + "state=stopped is deprecated and will be removed in a " + "a future release. Please use state=absent instead" + ) + + for key in ["http_port", "https_port"]: + if module.params[key] is not None: + if not 1 <= module.params[key] <= 65535: + module.fail_json(msg="%s must be between 1 and 65535" % key) + + return warnings + + +def map_obj_to_commands(want, have, module, warnings, capabilities): + send_commands = list() + commands = dict() + os_platform = None + os_version = None + + device_info = capabilities.get("device_info") + if device_info: + os_version = device_info.get("network_os_version") + if os_version: + os_version = os_version[:3] + os_platform = device_info.get("network_os_platform") + if os_platform: + os_platform = os_platform[:3] + + def needs_update(x): + return want.get(x) is not None and (want.get(x) != have.get(x)) + + if needs_update("state"): + if want["state"] == "absent": + return ["no feature nxapi"] + send_commands.append("feature nxapi") + elif want["state"] == "absent": + return send_commands + + for parameter in ["http", "https"]: + port_param = parameter + "_port" + if needs_update(parameter): + if want.get(parameter) is False: + commands[parameter] = "no nxapi %s" % parameter + else: + commands[parameter] = "nxapi %s port %s" % ( + parameter, + want.get(port_param), + ) + + if needs_update(port_param) and want.get(parameter) is True: + commands[parameter] = "nxapi %s port %s" % ( + parameter, + want.get(port_param), + ) + + if needs_update("sandbox"): + commands["sandbox"] = "nxapi sandbox" + if not want["sandbox"]: + commands["sandbox"] = "no %s" % commands["sandbox"] + + if os_platform and os_version: + if (os_platform == "N9K" or os_platform == "N3K") and LooseVersion( + os_version + ) >= "9.2": + if needs_update("ssl_strong_ciphers"): + commands["ssl_strong_ciphers"] = "nxapi ssl ciphers weak" + if want["ssl_strong_ciphers"] is True: + commands[ + "ssl_strong_ciphers" + ] = "no nxapi ssl ciphers weak" + + have_ssl_protocols = "" + want_ssl_protocols = "" + for key, value in { + "tlsv1_2": "TLSv1.2", + "tlsv1_1": "TLSv1.1", + "tlsv1_0": "TLSv1", + }.items(): + if needs_update(key): + if want.get(key) is True: + want_ssl_protocols = " ".join( + [want_ssl_protocols, value] + ) + elif have.get(key) is True: + have_ssl_protocols = " ".join([have_ssl_protocols, value]) + + if len(want_ssl_protocols) > 0: + commands["ssl_protocols"] = "nxapi ssl protocols%s" % ( + " ".join([want_ssl_protocols, have_ssl_protocols]) + ) + else: + warnings.append( + "os_version and/or os_platform keys from " + "platform capabilities are not available. " + "Any NXAPI SSL optional arguments will be ignored" + ) + + send_commands.extend(commands.values()) + + return send_commands + + +def parse_http(data): + http_res = [r"nxapi http port (\d+)"] + http_port = None + + for regex in http_res: + match = re.search(regex, data, re.M) + if match: + http_port = int(match.group(1)) + break + + return {"http": http_port is not None, "http_port": http_port} + + +def parse_https(data): + https_res = [r"nxapi https port (\d+)"] + https_port = None + + for regex in https_res: + match = re.search(regex, data, re.M) + if match: + https_port = int(match.group(1)) + break + + return {"https": https_port is not None, "https_port": https_port} + + +def parse_sandbox(data): + sandbox = [ + item for item in data.split("\n") if re.search(r".*sandbox.*", item) + ] + value = False + if sandbox and sandbox[0] == "nxapi sandbox": + value = True + return {"sandbox": value} + + +def parse_ssl_strong_ciphers(data): + ciphers_res = [r"(\w+) nxapi ssl ciphers weak"] + value = None + + for regex in ciphers_res: + match = re.search(regex, data, re.M) + if match: + value = match.group(1) + break + + return {"ssl_strong_ciphers": value == "no"} + + +def parse_ssl_protocols(data): + tlsv1_0 = re.search(r"(?. +# +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_ospf +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manages configuration + of an ospf instance. +description: +- Manages configuration of an ospf instance. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +deprecated: + alternative: nxos_ospfv2 and nxos_ospfv3 + why: Updated modules released with more functionality. + removed_at_date: '2022-06-01' +options: + ospf: + description: + - Name of the ospf instance. + required: true + type: str + state: + description: + - Determines whether the config should be present or not on the device. + required: false + default: present + choices: + - present + - absent + type: str + +""" + +EXAMPLES = """ +- cisco.nxos.nxos_ospf: + ospf: 1 + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["router ospf 1"] +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +PARAM_TO_COMMAND_KEYMAP = {"ospf": "router ospf"} + + +def get_value(config, module): + splitted_config = config.splitlines() + value_list = [] + REGEX = r"^router ospf\s(?P\S+).*" + for line in splitted_config: + value = "" + if "router ospf" in line: + try: + match_ospf = re.match(REGEX, line, re.DOTALL) + ospf_group = match_ospf.groupdict() + value = ospf_group["ospf"] + except AttributeError: + value = "" + if value: + value_list.append(value) + + return value_list + + +def get_existing(module): + existing = {} + config = str(get_config(module)) + + value = get_value(config, module) + if value: + existing["ospf"] = value + return existing + + +def state_present(module, proposed, candidate): + commands = ["router ospf {0}".format(proposed["ospf"])] + candidate.add(commands, parents=[]) + + +def state_absent(module, proposed, candidate): + commands = ["no router ospf {0}".format(proposed["ospf"])] + candidate.add(commands, parents=[]) + + +def main(): + argument_spec = dict( + ospf=dict(required=True, type="str"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + result = dict(changed=False, warnings=warnings) + + state = module.params["state"] + ospf = str(module.params["ospf"]) + + existing = get_existing(module) + proposed = dict(ospf=ospf) + + if not existing: + existing_list = [] + else: + existing_list = existing["ospf"] + + candidate = CustomNetworkConfig(indent=3) + if state == "present" and ospf not in existing_list: + state_present(module, proposed, candidate) + if state == "absent" and ospf in existing_list: + state_absent(module, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + load_config(module, candidate) + result["changed"] = True + result["commands"] = candidate + + else: + result["commands"] = [] + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_interfaces.py new file mode 100644 index 00000000..1dc0c861 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_interfaces.py @@ -0,0 +1,1445 @@ +#!/usr/bin/python +# -*- 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) + +""" +The module file for nxos_ospf_interfaces +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = """ +module: nxos_ospf_interfaces +version_added: 1.3.0 +short_description: OSPF Interfaces Resource Module. +description: +- This module manages OSPF(v2/v3) configuration of interfaces on devices running Cisco NX-OS. +author: Nilashish Chakraborty (@NilashishC) +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section "^interface"). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A list of OSPF configuration for interfaces. + type: list + elements: dict + suboptions: + name: + description: + - Name/Identifier of the interface. + type: str + required: True + address_family: + description: + - OSPF settings on the interfaces in address-family context. + type: list + elements: dict + suboptions: + afi: + description: + - Address Family Identifier (AFI) for OSPF settings on the interfaces. + type: str + choices: ['ipv4', 'ipv6'] + required: True + processes: + description: + - Interfaces configuration for an OSPF process. + type: list + elements: dict + suboptions: + process_id: + description: + - OSPF process tag. + type: str + required: True + area: + description: + - Area associated with interface. + type: dict + suboptions: + area_id: + description: + - Area ID as a decimal or IP address format. + type: str + required: True + secondaries: + description: + - Do not include secondary IPv4/IPv6 addresses. + type: bool + multi_areas: + description: + - Multi-Areas associated with interface. + - Valid values are Area Ids as an integer or IP address. + type: list + elements: str + multi_areas: + description: + - Multi-Areas associated with interface (not tied to OSPF process). + - Valid values are Area Ids as an integer or IP address. + type: list + elements: str + authentication: + description: + - Authentication settings on the interface. + type: dict + suboptions: + key_chain: + description: + - Authentication password key-chain. + type: str + message_digest: + description: + - Use message-digest authentication. + type: bool + enable: + description: + - Enable/disable authentication on the interface. + type: bool + null_auth: + description: + - Use null(disable) authentication. + type: bool + authentication_key: + description: + - Configure the authentication key for the interface. + type: dict + suboptions: + encryption: + description: + - 0 Specifies an UNENCRYPTED authentication key will follow. + - 3 Specifies an 3DES ENCRYPTED authentication key will follow. + - 7 Specifies a Cisco type 7 ENCRYPTED authentication key will follow. + type: int + key: + description: + - Authentication key. + - Valid values are Cisco type 7 ENCRYPTED password, 3DES ENCRYPTED password + and UNENCRYPTED (cleartext) password based on the value of encryption key. + type: str + required: True + message_digest_key: + description: + - Message digest authentication password (key) settings. + type: dict + suboptions: + key_id: + description: + - Key ID. + type: int + required: True + encryption: + description: + - 0 Specifies an UNENCRYPTED ospf password (key) will follow. + - 3 Specifies an 3DES ENCRYPTED ospf password (key) will follow. + - 7 Specifies a Cisco type 7 ENCRYPTED the ospf password (key) will follow. + type: int + key: + description: + - Authentication key. + - Valid values are Cisco type 7 ENCRYPTED password, 3DES ENCRYPTED password + and UNENCRYPTED (cleartext) password based on the value of encryption key. + type: str + required: True + cost: + description: + - Cost associated with interface. + type: int + dead_interval: + description: + - Dead interval value (in seconds). + type: int + hello_interval: + description: + - Hello interval value (in seconds). + type: int + instance: + description: + - Instance identifier. + type: int + mtu_ignore: + description: + - Enable/disable OSPF MTU mismatch detection. + type: bool + network: + description: + - Network type. + type: str + choices: ["broadcast", "point-to-point"] + passive_interface: + description: + - Suppress routing updates on the interface. + type: bool + priority: + description: + - Router priority. + type: int + retransmit_interval: + description: + - Packet retransmission interval. + type: int + shutdown: + description: + - Shutdown OSPF on this interface. + type: bool + transmit_delay: + description: + - Packet transmission delay. + type: int + state: + description: + - The state the configuration should be left in. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - parsed + - rendered + default: merged +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# interface Ethernet1/2 +# no switchport +# interface Ethernet1/3 +# no switchport + +- name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.11 + - afi: ipv6 + processes: + - process_id: "200" + area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + - process_id: "300" + multi_areas: + - 50.50.50.50 + multi_areas: + - 16.10.10.10 + - name: Ethernet1/2 + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: Ethernet1/3 + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + state: merged + +# Task output +# ------------- +# "before": [ +# { +# "name": "Ethernet1/1" +# }, +# { +# "name": "Ethernet1/2" +# }, +# { +# "name": "Ethernet1/3" +# }, +# ] +# +# "commands": [ +# "interface Ethernet1/1", +# "ip router ospf multi-area 11.11.11.11", +# "ip router ospf 100 area 1.1.1.1 secondaries none", +# "ipv6 router ospfv3 multi-area 16.10.10.10", +# "ipv6 router ospfv3 200 area 2.2.2.2", +# "ipv6 router ospfv3 200 multi-area 21.0.0.0", +# "ipv6 router ospfv3 300 multi-area 50.50.50.50", +# "interface Ethernet1/2", +# "ip ospf authentication key-chain test-1", +# "ip ospf authentication", +# "ip ospf message-digest-key 10 md5 3 abc01d272be25d29", +# "ip ospf cost 100", +# "ospfv3 network broadcast", +# "ospfv3 shutdown", +# "interface Ethernet1/3", +# "ip ospf authentication-key 7 12090404011C03162E" +# ] +# +# "after": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.11" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# }, +# { +# "afi": "ipv6", +# "multi_areas": [ +# "16.10.10.10" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "2.2.2.2" +# }, +# "multi_areas": [ +# "21.0.0.0" +# ], +# "process_id": "200" +# }, +# { +# "multi_areas": [ +# "50.50.50.50" +# ], +# "process_id": "300" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] + +# After state: +# ------------- +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.11 +# ipv6 router ospfv3 200 area 2.2.2.2 +# ipv6 router ospfv3 multi-area 16.10.10.10 +# ipv6 router ospfv3 200 multi-area 21.0.0.0 +# ipv6 router ospfv3 300 multi-area 50.50.50.50 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport +# ip ospf authentication-key 7 12090404011C03162E + + +# Using replaced + +# Before state: +# ------------ +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.11 +# ipv6 router ospfv3 200 area 2.2.2.2 +# ipv6 router ospfv3 multi-area 16.10.10.10 +# ipv6 router ospfv3 200 multi-area 21.0.0.0 +# ipv6 router ospfv3 300 multi-area 50.50.50.50 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport +# ip ospf authentication-key 7 12090404011C03162E + +- name: Replace OSPF configurations of listed interfaces with provided configurations + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + - name: Ethernet1/3 + state: replaced + +# Task output +# ------------- +# "before": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.11" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# }, +# { +# "afi": "ipv6", +# "multi_areas": [ +# "16.10.10.10" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "2.2.2.2" +# }, +# "multi_areas": [ +# "21.0.0.0" +# ], +# "process_id": "200" +# }, +# { +# "multi_areas": [ +# "50.50.50.50" +# ], +# "process_id": "300" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] +# +# "commands": [ +# "interface Ethernet1/1", +# "ip router ospf multi-area 11.11.11.12", +# "no ip router ospf multi-area 11.11.11.11", +# "no ipv6 router ospfv3 multi-area 16.10.10.10", +# "no ipv6 router ospfv3 200 area 2.2.2.2", +# "no ipv6 router ospfv3 200 multi-area 21.0.0.0", +# "no ipv6 router ospfv3 300 multi-area 50.50.50.50", +# "interface Ethernet1/3", +# "no ip ospf authentication-key 7 12090404011C03162E" +# ] +# +# "after": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.12" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "name": "Ethernet1/3" +# }, +# +# After state: +# ------------- +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.12 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport + + +# Using overridden + +# Before state: +# ------------ +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.11 +# ipv6 router ospfv3 200 area 2.2.2.2 +# ipv6 router ospfv3 multi-area 16.10.10.10 +# ipv6 router ospfv3 200 multi-area 21.0.0.0 +# ipv6 router ospfv3 300 multi-area 50.50.50.50 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport +# ip ospf authentication-key 7 12090404011C03162E + +- name: Overridde all OSPF interfaces configuration with provided configuration + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + state: overridden + +# Task output +# ------------- +# "before": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.11" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# }, +# { +# "afi": "ipv6", +# "multi_areas": [ +# "16.10.10.10" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "2.2.2.2" +# }, +# "multi_areas": [ +# "21.0.0.0" +# ], +# "process_id": "200" +# }, +# { +# "multi_areas": [ +# "50.50.50.50" +# ], +# "process_id": "300" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] +# +# "commands": [ +# "interface Ethernet1/2", +# "no ip ospf authentication key-chain test-1", +# "no ip ospf authentication", +# "no ip ospf message-digest-key 10 md5 3 abc01d272be25d29", +# "no ip ospf cost 100", +# "no ospfv3 network broadcast", +# "no ospfv3 shutdown", +# "interface Ethernet1/3", +# "no ip ospf authentication-key 7 12090404011C03162E", +# "interface Ethernet1/1", +# "ip router ospf multi-area 11.11.11.12", +# "no ip router ospf multi-area 11.11.11.11", +# "no ipv6 router ospfv3 multi-area 16.10.10.10", +# "no ipv6 router ospfv3 200 area 2.2.2.2", +# "no ipv6 router ospfv3 200 multi-area 21.0.0.0", +# "no ipv6 router ospfv3 300 multi-area 50.50.50.50" +# ] +# +# "after": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.12" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "name": "Ethernet1/2" +# }, +# { +# "name": "Ethernet1/3" +# }, +# ] + +# After state: +# ------------- +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.12 +# interface Ethernet1/2 +# no switchport +# interface Ethernet1/3 +# no switchport + +# Using deleted to delete OSPF config of a single interface + +# Before state: +# ------------ +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.11 +# ipv6 router ospfv3 200 area 2.2.2.2 +# ipv6 router ospfv3 multi-area 16.10.10.10 +# ipv6 router ospfv3 200 multi-area 21.0.0.0 +# ipv6 router ospfv3 300 multi-area 50.50.50.50 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport +# ip ospf authentication-key 7 12090404011C03162E + +- name: Delete OSPF config from a single interface + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + state: deleted + +# Task output +# ------------- +# "before": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.11" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# }, +# { +# "afi": "ipv6", +# "multi_areas": [ +# "16.10.10.10" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "2.2.2.2" +# }, +# "multi_areas": [ +# "21.0.0.0" +# ], +# "process_id": "200" +# }, +# { +# "multi_areas": [ +# "50.50.50.50" +# ], +# "process_id": "300" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] +# +# "commands": [ +# "interface Ethernet1/1", +# "no ip router ospf multi-area 11.11.11.11", +# "no ip router ospf 100 area 1.1.1.1 secondaries none", +# "no ipv6 router ospfv3 multi-area 16.10.10.10", +# "no ipv6 router ospfv3 200 area 2.2.2.2", +# "no ipv6 router ospfv3 200 multi-area 21.0.0.0", +# "no ipv6 router ospfv3 300 multi-area 50.50.50.50" +# ] +# +# "before": [ +# { +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] + +# After state: +# ------------ +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport +# ip ospf authentication-key 7 12090404011C03162E + +# Using deleted to delete OSPF config from all interfaces + +# Before state: +# ------------ +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.11 +# ipv6 router ospfv3 200 area 2.2.2.2 +# ipv6 router ospfv3 multi-area 16.10.10.10 +# ipv6 router ospfv3 200 multi-area 21.0.0.0 +# ipv6 router ospfv3 300 multi-area 50.50.50.50 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport +# ip ospf authentication-key 7 12090404011C03162E + +- name: Delete OSPF config from all interfaces + cisco.nxos.nxos_ospf_interfaces: + state: deleted + +# Task output +# ------------- +# "before": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.11" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# }, +# { +# "afi": "ipv6", +# "multi_areas": [ +# "16.10.10.10" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "2.2.2.2" +# }, +# "multi_areas": [ +# "21.0.0.0" +# ], +# "process_id": "200" +# }, +# { +# "multi_areas": [ +# "50.50.50.50" +# ], +# "process_id": "300" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] +# +# "commands": [ +# "interface Ethernet1/1", +# "no ip router ospf multi-area 11.11.11.11", +# "no ip router ospf 100 area 1.1.1.1 secondaries none", +# "no ipv6 router ospfv3 multi-area 16.10.10.10", +# "no ipv6 router ospfv3 200 area 2.2.2.2", +# "no ipv6 router ospfv3 200 multi-area 21.0.0.0", +# "no ipv6 router ospfv3 300 multi-area 50.50.50.50", +# "interface Ethernet1/2", +# "no ip ospf authentication key-chain test-1", +# "no ip ospf authentication", +# "no ip ospf message-digest-key 10 md5 3 abc01d272be25d29", +# "no ip ospf cost 100", +# "no ospfv3 network broadcast", +# "no ospfv3 shutdown", +# "interface Ethernet1/3", +# "no ip ospf authentication-key 7 12090404011C03162E" +# ] +# +# "after": [ +# { +# "name": "Ethernet1/1" +# }, +# { +# "name": "Ethernet1/2" +# }, +# { +# "name": "Ethernet1/3" +# }, +# ] + +# After state: +# ------------ +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# interface Ethernet1/2 +# no switchport +# interface Ethernet1/3 +# no switchport + +# Using rendered + +- name: Render platform specific configuration lines with state rendered (without connecting to the device) + cisco.nxos.nxos_ospf_interfaces: + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.11 + - afi: ipv6 + processes: + - process_id: "200" + area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + - process_id: "300" + multi_areas: + - 50.50.50.50 + multi_areas: + - 16.10.10.10 + - name: Ethernet1/2 + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: Ethernet1/3 + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + state: rendered + +# Task Output (redacted) +# ----------------------- +# "rendered": [ +# "interface Ethernet1/1", +# "ip router ospf multi-area 11.11.11.11", +# "ip router ospf 100 area 1.1.1.1 secondaries none", +# "ipv6 router ospfv3 multi-area 16.10.10.10", +# "ipv6 router ospfv3 200 area 2.2.2.2", +# "ipv6 router ospfv3 200 multi-area 21.0.0.0", +# "ipv6 router ospfv3 300 multi-area 50.50.50.50", +# "interface Ethernet1/2", +# "ip ospf authentication key-chain test-1", +# "ip ospf authentication", +# "ip ospf message-digest-key 10 md5 3 abc01d272be25d29", +# "ip ospf cost 100", +# "ospfv3 network broadcast", +# "ospfv3 shutdown", +# "interface Ethernet1/3", +# "ip ospf authentication-key 7 12090404011C03162E" +# ] + +# Using parsed + +# parsed.cfg +# ------------ +# interface Ethernet1/1 +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.11 +# ipv6 router ospfv3 200 area 2.2.2.2 +# ipv6 router ospfv3 200 multi-area 21.0.0.0 +# ipv6 router ospfv3 300 multi-area 50.50.50.50 +# ipv6 router ospfv3 multi-area 16.10.10.10 +# interface Ethernet1/2 +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# ip ospf authentication-key 7 12090404011C03162E + +- name: arse externally provided OSPF interfaces config + cisco.nxos.nxos_ospf_interfaces: + running_config: "{{ lookup('file', 'ospf_interfaces.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# "parsed": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.11" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# }, +# { +# "afi": "ipv6", +# "multi_areas": [ +# "16.10.10.10" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "2.2.2.2" +# }, +# "multi_areas": [ +# "21.0.0.0" +# ], +# "process_id": "200" +# }, +# { +# "multi_areas": [ +# "50.50.50.50" +# ], +# "process_id": "300" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication_key": { +# "encryption": 7, +# "key": "12090404011C03162E" +# } +# } +# ], +# "name": "Ethernet1/3" +# }, +# ] + +# Using gathered + +# On-box config + +# NXOS# show running-config | section ^interface +# interface Ethernet1/1 +# no switchport +# ip router ospf 100 area 1.1.1.1 secondaries none +# ip router ospf multi-area 11.11.11.12 +# interface Ethernet1/2 +# no switchport +# ip ospf authentication +# ip ospf authentication key-chain test-1 +# ip ospf message-digest-key 10 md5 3 abc01d272be25d29 +# ip ospf cost 100 +# ospfv3 network broadcast +# ospfv3 shutdown +# interface Ethernet1/3 +# no switchport + +# Task output (redacted) +# ----------------------- +# "gathered": [ +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "multi_areas": [ +# "11.11.11.12" +# ], +# "processes": [ +# { +# "area": { +# "area_id": "1.1.1.1", +# "secondaries": false +# }, +# "process_id": "100" +# } +# ] +# } +# ], +# "name": "Ethernet1/1" +# }, +# { +# "address_family": [ +# { +# "afi": "ipv4", +# "authentication": { +# "enable": true, +# "key_chain": "test-1" +# }, +# "cost": 100, +# "message_digest_key": { +# "encryption": 3, +# "key": "abc01d272be25d29", +# "key_id": 10 +# } +# }, +# { +# "afi": "ipv6", +# "network": "broadcast", +# "shutdown": true +# } +# ], +# "name": "Ethernet1/2" +# }, +# { +# "name": "Ethernet1/3" +# }, +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: + - interface Ethernet1/1 + - ip router ospf multi-area 11.11.11.11 + - ip router ospf 100 area 1.1.1.1 secondaries none + - no ipv6 router ospfv3 multi-area 16.10.10.10 + - ipv6 router ospfv3 200 area 2.2.2.2 + - ipv6 router ospfv3 200 multi-area 21.0.0.0 + - ipv6 router ospfv3 300 multi-area 50.50.50.50 + - interface Ethernet1/2 + - no ip ospf authentication key-chain test-1 + - ip ospf authentication +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospf_interfaces.ospf_interfaces import ( + Ospf_interfacesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.ospf_interfaces.ospf_interfaces import ( + Ospf_interfaces, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=Ospf_interfacesArgs.argument_spec, + mutually_exclusive=[["config", "running_config"]], + required_if=[ + ["state", "merged", ["config"]], + ["state", "replaced", ["config"]], + ["state", "overridden", ["config"]], + ["state", "rendered", ["config"]], + ["state", "parsed", ["running_config"]], + ], + supports_check_mode=True, + ) + + result = Ospf_interfaces(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_vrf.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_vrf.py new file mode 100644 index 00000000..68729cf4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospf_vrf.py @@ -0,0 +1,495 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_ospf_vrf +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-10-01)Manages a VRF for an OSPF router. +description: +- Manages a VRF for an OSPF router. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +deprecated: + alternative: nxos_ospfv2 and nxos_ospfv3 + why: Updated modules released with more functionality. + removed_at_date: '2022-10-01' +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Value I(default) restores params default value, if any. Otherwise it removes the + existing param configuration. +options: + vrf: + description: + - Name of the resource instance. Valid value is a string. The name 'default' is + a valid VRF representing the global OSPF. + default: default + type: str + ospf: + description: + - Name of the OSPF instance. + required: true + type: str + router_id: + description: + - Router Identifier (ID) of the OSPF router VRF instance. + type: str + default_metric: + description: + - Specify the default Metric value. Valid values are an integer or the keyword + 'default'. + type: str + log_adjacency: + description: + - Controls the level of log messages generated whenever a neighbor changes state. + Valid values are 'log', 'detail', and 'default'. + choices: + - log + - detail + - default + type: str + timer_throttle_lsa_start: + description: + - Specify the start interval for rate-limiting Link-State Advertisement (LSA) + generation. Valid values are an integer, in milliseconds, or the keyword 'default'. + type: str + timer_throttle_lsa_hold: + description: + - Specify the hold interval for rate-limiting Link-State Advertisement (LSA) generation. + Valid values are an integer, in milliseconds, or the keyword 'default'. + type: str + timer_throttle_lsa_max: + description: + - Specify the max interval for rate-limiting Link-State Advertisement (LSA) generation. + Valid values are an integer, in milliseconds, or the keyword 'default'. + type: str + timer_throttle_spf_start: + description: + - Specify initial Shortest Path First (SPF) schedule delay. Valid values are an + integer, in milliseconds, or the keyword 'default'. + type: str + timer_throttle_spf_hold: + description: + - Specify minimum hold time between Shortest Path First (SPF) calculations. Valid + values are an integer, in milliseconds, or the keyword 'default'. + type: str + timer_throttle_spf_max: + description: + - Specify the maximum wait time between Shortest Path First (SPF) calculations. + Valid values are an integer, in milliseconds, or the keyword 'default'. + type: str + auto_cost: + description: + - Specifies the reference bandwidth used to assign OSPF cost. Valid values are + an integer, in Mbps, or the keyword 'default'. + type: str + bfd: + description: + - Enables BFD on all OSPF interfaces. + - "Dependency: ''feature bfd''" + type: str + choices: + - enable + - disable + passive_interface: + description: + - Setting to C(yes) will suppress routing update on interface. + type: bool + state: + description: + - State of ospf vrf configuration. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_ospf_vrf: + ospf: 1 + timer_throttle_spf_start: 50 + timer_throttle_spf_hold: 1000 + timer_throttle_spf_max: 2000 + timer_throttle_lsa_start: 60 + timer_throttle_lsa_hold: 1100 + timer_throttle_lsa_max: 3000 + vrf: test + bfd: enable + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - router ospf 1 + - vrf test + - bfd + - timers throttle lsa 60 1100 3000 +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +BOOL_PARAMS = ["passive_interface"] +PARAM_TO_COMMAND_KEYMAP = { + "vrf": "vrf", + "router_id": "router-id", + "default_metric": "default-metric", + "log_adjacency": "log-adjacency-changes", + "timer_throttle_lsa_start": "timers throttle lsa", + "timer_throttle_lsa_max": "timers throttle lsa", + "timer_throttle_lsa_hold": "timers throttle lsa", + "timer_throttle_spf_max": "timers throttle spf", + "timer_throttle_spf_start": "timers throttle spf", + "timer_throttle_spf_hold": "timers throttle spf", + "auto_cost": "auto-cost reference-bandwidth", + "bfd": "bfd", + "passive_interface": "passive-interface default", +} +PARAM_TO_DEFAULT_KEYMAP = { + "timer_throttle_lsa_start": "0", + "timer_throttle_lsa_max": "5000", + "timer_throttle_lsa_hold": "5000", + "timer_throttle_spf_start": "200", + "timer_throttle_spf_max": "5000", + "timer_throttle_spf_hold": "1000", + "auto_cost": "40000", + "bfd": "disable", + "default_metric": "", + "passive_interface": False, + "router_id": "", + "log_adjacency": "", +} + + +def get_existing(module, args): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + parents = ["router ospf {0}".format(module.params["ospf"])] + + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + + config = netcfg.get_section(parents) + for arg in args: + if arg not in ["ospf", "vrf"]: + existing[arg] = PARAM_TO_DEFAULT_KEYMAP.get(arg) + + if config: + if module.params["vrf"] == "default": + splitted_config = config.splitlines() + vrf_index = False + for index in range(0, len(splitted_config) - 1): + if "vrf" in splitted_config[index].strip(): + vrf_index = index + break + if vrf_index: + config = "\n".join(splitted_config[0:vrf_index]) + + splitted_config = config.splitlines() + for line in splitted_config: + if "passive" in line: + existing["passive_interface"] = True + elif "router-id" in line: + existing["router_id"] = re.search( + r"router-id (\S+)", line + ).group(1) + elif "metric" in line: + existing["default_metric"] = re.search( + r"default-metric (\S+)", line + ).group(1) + elif "adjacency" in line: + log = re.search( + r"log-adjacency-changes(?: (\S+))?", line + ).group(1) + if log: + existing["log_adjacency"] = log + else: + existing["log_adjacency"] = "log" + elif "auto" in line: + cost = re.search( + r"auto-cost reference-bandwidth (\d+) (\S+)", line + ).group(1) + if "Gbps" in line: + cost = int(cost) * 1000 + existing["auto_cost"] = str(cost) + elif "bfd" in line: + existing["bfd"] = "enable" + elif "timers throttle lsa" in line: + tmp = re.search(r"timers throttle lsa (\S+) (\S+) (\S+)", line) + existing["timer_throttle_lsa_start"] = tmp.group(1) + existing["timer_throttle_lsa_hold"] = tmp.group(2) + existing["timer_throttle_lsa_max"] = tmp.group(3) + elif "timers throttle spf" in line: + tmp = re.search(r"timers throttle spf (\S+) (\S+) (\S+)", line) + existing["timer_throttle_spf_start"] = tmp.group(1) + existing["timer_throttle_spf_hold"] = tmp.group(2) + existing["timer_throttle_spf_max"] = tmp.group(3) + existing["vrf"] = module.params["vrf"] + existing["ospf"] = module.params["ospf"] + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key in table: + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = table.get(key) + return new_dict + + +def get_timer_prd(key, proposed): + if proposed.get(key): + return proposed.get(key) + else: + return PARAM_TO_DEFAULT_KEYMAP.get(key) + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, value in proposed_commands.items(): + if key == "vrf": + continue + if value is True: + commands.append(key) + + elif value is False: + if key == "passive-interface default": + if existing_commands.get(key): + commands.append("no {0}".format(key)) + else: + commands.append("no {0}".format(key)) + + elif value == "default" or value == "": + if key == "log-adjacency-changes": + commands.append("no {0}".format(key)) + elif existing_commands.get(key): + existing_value = existing_commands.get(key) + commands.append("no {0} {1}".format(key, existing_value)) + else: + if key == "timers throttle lsa": + command = "{0} {1} {2} {3}".format( + key, + get_timer_prd("timer_throttle_lsa_start", proposed), + get_timer_prd("timer_throttle_lsa_hold", proposed), + get_timer_prd("timer_throttle_lsa_max", proposed), + ) + elif key == "timers throttle spf": + command = "{0} {1} {2} {3}".format( + key, + get_timer_prd("timer_throttle_spf_start", proposed), + get_timer_prd("timer_throttle_spf_hold", proposed), + get_timer_prd("timer_throttle_spf_max", proposed), + ) + elif key == "log-adjacency-changes": + if value == "log": + command = key + elif value == "detail": + command = "{0} {1}".format(key, value) + elif key == "auto-cost reference-bandwidth": + if len(value) < 5: + command = "{0} {1} Mbps".format(key, value) + else: + value = str(int(value) // 1000) + command = "{0} {1} Gbps".format(key, value) + elif key == "bfd": + command = "no bfd" if value == "disable" else "bfd" + else: + command = "{0} {1}".format(key, value.lower()) + + if command not in commands: + commands.append(command) + + if commands: + parents = ["router ospf {0}".format(module.params["ospf"])] + if module.params["vrf"] != "default": + parents.append("vrf {0}".format(module.params["vrf"])) + candidate.add(commands, parents=parents) + + +def state_absent(module, existing, proposed, candidate): + commands = [] + parents = ["router ospf {0}".format(module.params["ospf"])] + if module.params["vrf"] == "default": + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + for key, value in existing_commands.items(): + if value and key != "vrf": + command = None + if key == "passive-interface default": + command = "no {0}".format(key) + elif key == "timers throttle lsa": + if ( + existing["timer_throttle_lsa_start"] + != PARAM_TO_DEFAULT_KEYMAP.get( + "timer_throttle_lsa_start" + ) + or existing["timer_throttle_lsa_hold"] + != PARAM_TO_DEFAULT_KEYMAP.get( + "timer_throttle_lsa_hold" + ) + or existing["timer_throttle_lsa_max"] + != PARAM_TO_DEFAULT_KEYMAP.get( + "timer_throttle_lsa_max" + ) + ): + command = "no {0} {1} {2} {3}".format( + key, + existing["timer_throttle_lsa_start"], + existing["timer_throttle_lsa_hold"], + existing["timer_throttle_lsa_max"], + ) + elif key == "timers throttle spf": + if ( + existing["timer_throttle_spf_start"] + != PARAM_TO_DEFAULT_KEYMAP.get( + "timer_throttle_spf_start" + ) + or existing["timer_throttle_spf_hold"] + != PARAM_TO_DEFAULT_KEYMAP.get( + "timer_throttle_spf_hold" + ) + or existing["timer_throttle_spf_max"] + != PARAM_TO_DEFAULT_KEYMAP.get( + "timer_throttle_spf_max" + ) + ): + command = "no {0} {1} {2} {3}".format( + key, + existing["timer_throttle_spf_start"], + existing["timer_throttle_spf_hold"], + existing["timer_throttle_spf_max"], + ) + elif key == "log-adjacency-changes": + command = "no {0}".format(key) + elif key == "auto-cost reference-bandwidth": + if value != PARAM_TO_DEFAULT_KEYMAP.get("auto_cost"): + command = "no {0}".format(key) + else: + command = None + elif key == "bfd": + if value == "enable": + command = "no bfd" + else: + existing_value = existing_commands.get(key) + command = "no {0} {1}".format(key, existing_value) + + if command: + if command not in commands: + commands.append(command) + else: + if existing.get("vrf") and existing.get("vrf") == module.params["vrf"]: + commands = ["no vrf {0}".format(module.params["vrf"])] + + if commands: + candidate.add(commands, parents=parents) + + +def main(): + argument_spec = dict( + vrf=dict(required=False, type="str", default="default"), + ospf=dict(required=True, type="str"), + router_id=dict(required=False, type="str"), + default_metric=dict(required=False, type="str"), + log_adjacency=dict( + required=False, type="str", choices=["log", "detail", "default"] + ), + timer_throttle_lsa_start=dict(required=False, type="str"), + timer_throttle_lsa_hold=dict(required=False, type="str"), + timer_throttle_lsa_max=dict(required=False, type="str"), + timer_throttle_spf_start=dict(required=False, type="str"), + timer_throttle_spf_hold=dict(required=False, type="str"), + timer_throttle_spf_max=dict(required=False, type="str"), + auto_cost=dict(required=False, type="str"), + bfd=dict(required=False, type="str", choices=["enable", "disable"]), + passive_interface=dict(required=False, type="bool"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + result = dict(changed=False, commands=[], warnings=warnings) + + state = module.params["state"] + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing = get_existing(module, args) + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + proposed = {} + for key, value in proposed_args.items(): + if key != "interface": + if str(value).lower() == "true": + value = True + elif str(value).lower() == "false": + value = False + elif str(value).lower() == "default": + value = PARAM_TO_DEFAULT_KEYMAP.get(key) + if value is None: + value = "default" + if existing.get(key) != value: + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + if state == "absent" and existing: + state_absent(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + result["commands"] = candidate + if not module.check_mode: + load_config(module, candidate) + result["changed"] = True + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv2.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv2.py new file mode 100644 index 00000000..a1a547f1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv2.py @@ -0,0 +1,1981 @@ +#!/usr/bin/python +# -*- 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) + +############################################# +# 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 module file for nxos_ospfv2 +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_ospfv2 +short_description: OSPFv2 resource module +description: +- This module manages OSPFv2 configuration on devices running Cisco NX-OS. +version_added: 1.0.0 +notes: +- Tested against NX-OS 7.0(3)I5(1). +- This module works with connection C(network_cli) and C(httpapi). +author: Nilashish Chakraborty (@NilashishC) +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section "^router ospf .*"). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A list of OSPF process configuration. + type: dict + suboptions: + processes: + description: + - A list of OSPF instances' configurations. + type: list + elements: dict + suboptions: + areas: + description: + - Configure properties of OSPF Areas. + type: list + elements: dict + suboptions: + area_id: + description: + - The Area ID as an integer or IP Address. + type: str + required: true + authentication: + description: + - Authentication settings for the Area. + type: dict + suboptions: + set: + description: + - Set authentication for the area. + type: bool + message_digest: + description: + - Use message-digest authentication. + type: bool + default_cost: + description: + - Specify the default cost for default summary LSA. + type: int + filter_list: + description: + - Filter prefixes between OSPF areas. + type: list + elements: dict + suboptions: + route_map: + description: + - The Route-map name. + type: str + required: true + direction: + description: + - The direction to apply the route map. + type: str + choices: [in, out] + required: true + nssa: + description: + - NSSA settings for the area. + type: dict + suboptions: + set: + description: + - Configure area as NSSA. + type: bool + default_information_originate: + description: + - Originate Type-7 default LSA into NSSA area. + type: bool + no_redistribution: + description: + - Do not send redistributed LSAs into NSSA area. + type: bool + no_summary: + description: + - Do not send summary LSAs into NSSA area. + type: bool + translate: + description: + - Translate LSA. + type: dict + suboptions: + type7: + description: + - Translate from Type 7 to Type 5. + type: dict + suboptions: + always: + description: + - Always translate LSAs + type: bool + never: + description: + - Never translate LSAs + type: bool + supress_fa: + description: + - Suppress forwarding address in translated LSAs. + type: bool + ranges: + description: + - Configure an address range for the area. + type: list + elements: dict + suboptions: + prefix: + description: + - IP in Prefix format (x.x.x.x/len) + type: str + required: true + cost: + description: + - Cost to use for the range. + type: int + not_advertise: + description: + - Suppress advertising the specified range. + type: bool + stub: + description: + - Settings for configuring the area as a stub. + type: dict + suboptions: + set: + description: + - Configure the area as a stub. + type: bool + no_summary: + description: + - Prevent ABR from sending summary LSAs into stub area. + type: bool + auto_cost: + description: + - Calculate OSPF cost according to bandwidth. + type: dict + suboptions: + reference_bandwidth: + description: + - Reference bandwidth used to assign OSPF cost. + type: int + required: true + unit: + description: + - Specify in which unit the reference bandwidth is specified. + type: str + required: true + choices: [Gbps, Mbps] + bfd: + description: + - Enable BFD on all OSPF interfaces. + type: bool + default_information: + description: + - Control distribution of default routes. + type: dict + suboptions: + originate: + description: + - Distribute a default route. + type: dict + suboptions: + set: + description: + - Enable distribution of default route. + type: bool + always: + description: + - Always advertise a default route. + type: bool + route_map: + description: + - Policy to control distribution of default routes + type: str + default_metric: + description: + - Specify default metric for redistributed routes. + type: int + distance: + description: + - Configure the OSPF administrative distance. + type: int + flush_routes: + description: + - Flush routes on a non-graceful controlled restart. + type: bool + graceful_restart: + description: + - Configure graceful restart. + type: dict + suboptions: + set: + description: + - Enable graceful-restart. + type: bool + grace_period: + description: + - Configure maximum interval to restart gracefully. + type: int + helper_disable: + description: + - Enable/Disable helper mode. + type: bool + isolate: + description: + - Isolate this router from OSPF perspective. + type: bool + log_adjacency_changes: + description: + - Log changes in adjacency state. + type: dict + suboptions: + log: + description: + - Enable/disable logging changes in adjacency state. + type: bool + detail: + description: + - Notify all state changes. + type: bool + max_lsa: + description: + - Feature to limit the number of non-self-originated LSAs. + type: dict + suboptions: + max_non_self_generated_lsa: + description: + - Set the maximum number of non self-generated LSAs. + type: int + required: true + threshold: + description: + - Threshold value (%) at which to generate a warning message. + type: int + ignore_count: + description: + - Set count on how many times adjacencies can be suppressed. + type: int + ignore_time: + description: + - Set time during which all adjacencies are suppressed. + type: int + reset_time: + description: + - Set number of minutes after which ignore-count is reset to zero. + type: int + warning_only: + description: + - Log a warning message when limit is exceeded. + type: bool + max_metric: + description: + - Maximize the cost metric. + type: dict + suboptions: + router_lsa: + description: + - Router LSA configuration. + type: dict + suboptions: + set: + description: + - Set router-lsa attribute. + type: bool + external_lsa: + description: + - External LSA configuration. + type: dict + suboptions: + set: + description: + - Set external-lsa attribute. + type: bool + max_metric_value: + description: + - Set max metric value for external LSAs. + type: int + include_stub: + description: + - Advertise Max metric for Stub links as well. + type: bool + on_startup: + description: + - Effective only at startup. + type: dict + suboptions: + set: + description: + - Set on-startup attribute. + type: bool + wait_period: + description: + - Wait period in seconds after startup. + type: int + wait_for_bgp_asn: + description: + - ASN of BGP to wait for. + type: int + summary_lsa: + description: + - Summary LSAs configuration. + type: dict + suboptions: + set: + description: + - Set summary-lsa attribute. + type: bool + max_metric_value: + description: + - Max metric value for summary LSAs. + type: int + maximum_paths: + description: + - Maximum paths per destination. + type: int + mpls: + description: + - OSPF MPLS configuration settings. + type: dict + suboptions: + traffic_eng: + description: + - OSPF MPLS Traffic Engineering commands. + type: dict + suboptions: + areas: + description: + - List of Area IDs. + type: list + elements: dict + suboptions: + area_id: + description: + - Area Id as an integer or ip address. + type: str + multicast_intact: + description: + - MPLS TE multicast support. + type: bool + router_id: + description: + - Router ID associated with TE. + type: str + name_lookup: + description: + - Display OSPF router ids as DNS names. + type: bool + passive_interface: + description: + - Suppress routing updates on the interface. + type: dict + suboptions: + default: + description: + - Interfaces passive by default. + type: bool + process_id: + description: + - The OSPF process tag. + type: str + required: true + redistribute: + description: + - Redistribute information from another routing protocol. + type: list + elements: dict + suboptions: + protocol: + description: + - The name of the protocol. + type: str + choices: [bgp, direct, eigrp, isis, lisp, ospf, rip, static] + required: true + id: + description: + - The identifier for the protocol specified. + type: str + route_map: + description: + - The route map policy to constrain redistribution. + type: str + required: true + rfc1583compatibility: + description: + - Configure 1583 compatibility for external path preferences. + type: bool + router_id: + description: + - Set OSPF process router-id. + type: str + shutdown: + description: + - Shutdown the OSPF protocol instance. + type: bool + summary_address: + description: + - Configure route summarization for redistribution. + type: list + elements: dict + suboptions: + prefix: + description: + - IP prefix in format x.x.x.x/ml. + type: str + required: true + not_advertise: + description: + - Supress advertising the specified summary. + type: bool + tag: + description: + - A 32-bit tag value. + type: int + table_map: + description: + - Policy for filtering/modifying OSPF routes before sending them to RIB. + type: dict + suboptions: + name: + description: + - The Route Map name. + type: str + required: true + filter: + description: + - Block the OSPF routes from being sent to RIB. + type: bool + timers: + description: + - Configure timer related constants. + type: dict + suboptions: + lsa_arrival: + description: + - Mimimum interval between arrival of a LSA. + type: int + lsa_group_pacing: + description: + - LSA group refresh/maxage interval. + type: int + throttle: + description: + - Configure throttle related constants. + type: dict + suboptions: + lsa: + description: + - Set rate-limiting for LSA generation. + type: dict + suboptions: + start_interval: + description: + - The start interval. + type: int + hold_interval: + description: + - The hold interval. + type: int + max_interval: + description: + - The max interval. + type: int + spf: + description: + - Set OSPF SPF timers. + type: dict + suboptions: + initial_spf_delay: + description: + - Initial SPF schedule delay in milliseconds. + type: int + min_hold_time: + description: + - Minimum hold time between SPF calculations. + type: int + max_wait_time: + description: + - Maximum wait time between SPF calculations. + type: int + vrfs: + description: + - Configure VRF specific OSPF settings. + type: list + elements: dict + suboptions: + areas: + description: + - Configure properties of OSPF Areas. + type: list + elements: dict + suboptions: + area_id: + description: + - The Area ID as an integer or IP Address. + type: str + required: true + authentication: + description: + - Authentication settings for the Area. + type: dict + suboptions: + set: + description: + - Set authentication for the area. + type: bool + message_digest: + description: + - Use message-digest authentication. + type: bool + default_cost: + description: + - Specify the default cost for default summary LSA. + type: int + filter_list: + description: + - Filter prefixes between OSPF areas. + type: list + elements: dict + suboptions: + route_map: + description: + - The Route-map name. + type: str + required: true + direction: + description: + - The direction to apply the route map. + type: str + choices: [in, out] + required: true + nssa: + description: + - NSSA settings for the area. + type: dict + suboptions: + set: + description: + - Configure area as NSSA. + type: bool + default_information_originate: + description: + - Originate Type-7 default LSA into NSSA area. + type: bool + no_redistribution: + description: + - Do not send redistributed LSAs into NSSA area. + type: bool + no_summary: + description: + - Do not send summary LSAs into NSSA area. + type: bool + translate: + description: + - Translate LSA. + type: dict + suboptions: + type7: + description: + - Translate from Type 7 to Type 5. + type: dict + suboptions: + always: + description: + - Always translate LSAs + type: bool + never: + description: + - Never translate LSAs + type: bool + supress_fa: + description: + - Suppress forwarding address in translated LSAs. + type: bool + ranges: + description: + - Configure an address range for the area. + type: list + elements: dict + suboptions: + prefix: + description: + - IP in Prefix format (x.x.x.x/len) + type: str + required: true + cost: + description: + - Cost to use for the range. + type: int + not_advertise: + description: + - Suppress advertising the specified range. + type: bool + stub: + description: + - Settings for configuring the area as a stub. + type: dict + suboptions: + set: + description: + - Configure the area as a stub. + type: bool + no_summary: + description: + - Prevent ABR from sending summary LSAs into stub area. + type: bool + auto_cost: + description: + - Calculate OSPF cost according to bandwidth. + type: dict + suboptions: + reference_bandwidth: + description: + - Reference bandwidth used to assign OSPF cost. + type: int + required: true + unit: + description: + - Specify in which unit the reference bandwidth is specified. + type: str + required: True + choices: [Gbps, Mbps] + bfd: + description: + - Enable BFD on all OSPF interfaces. + type: bool + default_information: + description: + - Control distribution of default routes. + type: dict + suboptions: + originate: + description: + - Distribute a default route. + type: dict + suboptions: + set: + description: + - Enable distribution of default route. + type: bool + always: + description: + - Always advertise a default route. + type: bool + route_map: + description: + - Policy to control distribution of default routes + type: str + default_metric: + description: + - Specify default metric for redistributed routes. + type: int + distance: + description: + - Configure the OSPF administrative distance. + type: int + down_bit_ignore: + description: + - Configure a PE router to ignore the DN bit for network summary, + external and NSSA external LSA. + type: bool + capability: + description: + - OSPF capability settings. + type: dict + suboptions: + vrf_lite: + description: + - Enable VRF-lite capability settings. + type: dict + suboptions: + set: + description: + - Enable VRF-lite support. + type: bool + evpn: + description: + - Ethernet VPN. + type: bool + graceful_restart: + description: + - Configure graceful restart. + type: dict + suboptions: + set: + description: + - Enable graceful-restart. + type: bool + grace_period: + description: + - Configure maximum interval to restart gracefully. + type: int + helper_disable: + description: + - Enable/Disable helper mode. + type: bool + log_adjacency_changes: + description: + - Log changes in adjacency state. + type: dict + suboptions: + log: + description: + - Enable/disable logging changes in adjacency state. + type: bool + detail: + description: + - Notify all state changes. + type: bool + max_lsa: + description: + - Feature to limit the number of non-self-originated LSAs. + type: dict + suboptions: + max_non_self_generated_lsa: + description: + - Set the maximum number of non self-generated LSAs. + type: int + required: true + threshold: + description: + - Threshold value (%) at which to generate a warning message. + type: int + ignore_count: + description: + - Set count on how many times adjacencies can be suppressed. + type: int + ignore_time: + description: + - Set time during which all adjacencies are suppressed. + type: int + reset_time: + description: + - Set number of minutes after which ignore-count is reset to zero. + type: int + warning_only: + description: + - Log a warning message when limit is exceeded. + type: bool + max_metric: + description: + - Maximize the cost metric. + type: dict + suboptions: + router_lsa: + description: + - Router LSA configuration. + type: dict + suboptions: + set: + description: + - Set router-lsa attribute. + type: bool + external_lsa: + description: + - External LSA configuration. + type: dict + suboptions: + set: + description: + - Set external-lsa attribute. + type: bool + max_metric_value: + description: + - Set max metric value for external LSAs. + type: int + include_stub: + description: + - Advertise Max metric for Stub links as well. + type: bool + on_startup: + description: + - Effective only at startup. + type: dict + suboptions: + set: + description: + - Set on-startup attribute. + type: bool + wait_period: + description: + - Wait period in seconds after startup. + type: int + wait_for_bgp_asn: + description: + - ASN of BGP to wait for. + type: int + summary_lsa: + description: + - Summary LSAs configuration. + type: dict + suboptions: + set: + description: + - Set summary-lsa attribute. + type: bool + max_metric_value: + description: + - Max metric value for summary LSAs. + type: int + maximum_paths: + description: + - Maximum paths per destination. + type: int + name_lookup: + description: + - Display OSPF router ids as DNS names. + type: bool + passive_interface: + description: + - Suppress routing updates on the interface. + type: dict + suboptions: + default: + description: + - Interfaces passive by default. + type: bool + redistribute: + description: + - Redistribute information from another routing protocol. + type: list + elements: dict + suboptions: + protocol: + description: + - The name of the protocol. + type: str + choices: [bgp, direct, eigrp, isis, lisp, ospf, rip, static] + required: true + id: + description: + - The identifier for the protocol specified. + type: str + route_map: + description: + - The route map policy to constrain redistribution. + type: str + required: true + rfc1583compatibility: + description: + - Configure 1583 compatibility for external path preferences. + type: bool + router_id: + description: + - Set OSPF process router-id. + type: str + shutdown: + description: + - Shutdown the OSPF protocol instance. + type: bool + summary_address: + description: + - Configure route summarization for redistribution. + type: list + elements: dict + suboptions: + prefix: + description: + - IP prefix in format x.x.x.x/ml. + type: str + required: true + not_advertise: + description: + - Supress advertising the specified summary. + type: bool + tag: + description: + - A 32-bit tag value. + type: int + table_map: + description: + - Policy for filtering/modifying OSPF routes before sending them to + RIB. + type: dict + suboptions: + name: + description: + - The Route Map name. + type: str + required: true + filter: + description: + - Block the OSPF routes from being sent to RIB. + type: bool + timers: + description: + - Configure timer related constants. + type: dict + suboptions: + lsa_arrival: + description: + - Mimimum interval between arrival of a LSA. + type: int + lsa_group_pacing: + description: + - LSA group refresh/maxage interval. + type: int + throttle: + description: + - Configure throttle related constants. + type: dict + suboptions: + lsa: + description: + - Set rate-limiting for LSA generation. + type: dict + suboptions: + start_interval: + description: + - The start interval. + type: int + hold_interval: + description: + - The hold interval. + type: int + max_interval: + description: + - The max interval. + type: int + spf: + description: + - Set OSPF SPF timers. + type: dict + suboptions: + initial_spf_delay: + description: + - Initial SPF schedule delay in milliseconds. + type: int + min_hold_time: + description: + - Minimum hold time between SPF calculations. + type: int + max_wait_time: + description: + - Maximum wait time between SPF calculations. + type: int + vrf: + description: + - Name/Identifier of the VRF. + type: str + required: true + state: + description: + - The state the configuration should be left in. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - parsed + - rendered + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# nxos-9k-rdo# + +- name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 198.51.100.64/27 + not_advertise: true + - prefix: 198.51.100.96/27 + cost: 120 + - area_id: 0.0.0.101 + authentication: + message_digest: true + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: static + route_map: zone1-static-connect + summary_address: + - prefix: 198.51.100.128/27 + tag: 121 + - prefix: 198.51.100.160/27 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: merged + +# Task output +# ------------- +# before: {} +# +# commands: +# - router ospf 102 +# - router-id 198.51.100.1 +# - redistribute eigrp 120 route-map rmap_1 +# - redistribute direct route-map ospf102-direct-connect +# - area 0.0.0.100 filter-list route-map rmap_1 in +# - area 0.0.0.100 filter-list route-map rmap_2 out +# - area 0.0.0.100 range 198.51.100.64/27 not-advertise +# - area 0.0.0.100 range 198.51.100.96/27 cost 120 +# - area 0.0.0.101 authentication message-digest +# - vrf zone1 +# - router-id 198.51.100.129 +# - summary-address 198.51.100.128/27 tag 121 +# - summary-address 198.51.100.160/27 +# - redistribute static route-map zone1-static-connect +# - area 0.0.0.102 nssa no-summary default-information-originate +# - area 0.0.0.103 nssa no-summary +# - area 0.0.0.103 nssa translate type7 always +# - vrf zone2 +# - auto-cost reference-bandwidth 45 Gbps +# - router ospf 100 +# - router-id 203.0.113.20 +# +# after: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# - cost: 120 +# prefix: 198.51.100.96/27 +# - area_id: 0.0.0.101 +# authentication: +# message_digest: true +# process_id: "102" +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# redistribute: +# - protocol: static +# route_map: zone1-static-connect +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 +# router ospf 102 +# router-id 198.51.100.1 +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# area 0.0.0.100 range 198.51.100.96/27 cost 120 +# area 0.0.0.101 authentication message-digest +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# redistribute static route-map zone1-static-connect +# summary-address 198.51.100.128/27 tag 121 +# summary-address 198.51.100.160/27 +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +# Using replaced + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 +# router ospf 102 +# router-id 198.51.100.1 +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# area 0.0.0.100 range 198.51.100.96/27 cost 120 +# area 0.0.0.101 authentication message-digest +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# redistribute static route-map zone1-static-connect +# summary-address 198.51.100.128/27 tag 121 +# summary-address 198.51.100.160/27 +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Replace device configurations of listed OSPF processes with provided configurations + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_8 + direction: in + ranges: + - prefix: 198.51.100.64/27 + not_advertise: true + - area_id: 0.0.0.101 + stub: + no_summary: true + redistribute: + - protocol: eigrp + id: 130 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: bgp + id: 65563 + route_map: zone1-bgp-connect + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + state: replaced + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# - cost: 120 +# prefix: 198.51.100.96/27 +# - area_id: 0.0.0.101 +# authentication: +# message_digest: true +# process_id: "102" +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# redistribute: +# - protocol: static +# route_map: zone1-static-connect +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - router ospf 102 +# - redistribute eigrp 130 route-map rmap_1 +# - no redistribute eigrp 120 route-map rmap_1 +# - area 0.0.0.100 filter-list route-map rmap_8 in +# - no area 0.0.0.100 filter-list route-map rmap_2 out +# - no area 0.0.0.100 range 198.51.100.96/27 +# - no area 0.0.0.101 authentication +# - area 0.0.0.101 stub no-summary +# - vrf zone1 +# - no summary-address 198.51.100.128/27 tag 121 +# - no summary-address 198.51.100.160/27 +# - redistribute bgp 65563 route-map zone1-bgp-connect +# - no redistribute static route-map zone1-static-connect +# - no area 0.0.0.103 nssa +# - no area 0.0.0.103 nssa translate type7 always +# - no vrf zone2 +# +# after: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - areas: +# - area_id: 0.0.0.101 +# stub: +# no_summary: true +# - area_id: 0.0.0.100 +# filter_list: +# - direction: in +# route_map: rmap_8 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# process_id: "102" +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "130" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# redistribute: +# - id: "65563" +# protocol: bgp +# route_map: zone1-bgp-connect +# router_id: 198.51.100.129 +# vrf: zone1 + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 +# router ospf 102 +# router-id 198.51.100.1 +# area 0.0.0.101 stub no-summary +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 130 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_8 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# redistribute bgp 65563 route-map zone1-bgp-connect + +# Using overridden + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 +# router ospf 102 +# router-id 198.51.100.1 +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# area 0.0.0.100 range 198.51.100.96/27 cost 120 +# area 0.0.0.101 authentication message-digest +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# redistribute static route-map zone1-static-connect +# summary-address 198.51.100.128/27 tag 121 +# summary-address 198.51.100.160/27 +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Overridde all OSPF configuration with provided configuration + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 104 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + shutdown: true + state: overridden + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# - cost: 120 +# prefix: 198.51.100.96/27 +# - area_id: 0.0.0.101 +# authentication: +# message_digest: true +# process_id: "102" +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# redistribute: +# - protocol: static +# route_map: zone1-static-connect +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - no router ospf 100 +# - router ospf 104 +# - router-id 203.0.113.20 +# - router ospf 102 +# - shutdown +# - no redistribute direct route-map ospf102-direct-connect +# - no redistribute eigrp 120 route-map rmap_1 +# - no area 0.0.0.100 filter-list route-map rmap_2 out +# - no area 0.0.0.100 filter-list route-map rmap_1 in +# - no area 0.0.0.100 range 198.51.100.64/27 +# - no area 0.0.0.100 range 198.51.100.96/27 +# - no area 0.0.0.101 authentication +# - no vrf zone1 +# - no vrf zone2 +# +# after: +# processes: +# - process_id: "102" +# router_id: 198.51.100.1 +# shutdown: true +# - process_id: "104" +# router_id: 203.0.113.20 + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 102 +# router-id 198.51.100.1 +# shutdown +# router ospf 104 +# router-id 203.0.113.20 + +# Using deleted to delete a single OSPF process + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 +# router ospf 102 +# router-id 198.51.100.1 +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# area 0.0.0.100 range 198.51.100.96/27 cost 120 +# area 0.0.0.101 authentication message-digest +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# redistribute static route-map zone1-static-connect +# summary-address 198.51.100.128/27 tag 121 +# summary-address 198.51.100.160/27 +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Delete a single OSPF process + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 102 + state: deleted + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# - cost: 120 +# prefix: 198.51.100.96/27 +# - area_id: 0.0.0.101 +# authentication: +# message_digest: true +# process_id: "102" +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# redistribute: +# - protocol: static +# route_map: zone1-static-connect +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - no router ospf 102 +# +# after: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 + +# Using deleted all OSPF processes from the device + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospf 100 +# router-id 203.0.113.20 +# router ospf 102 +# router-id 198.51.100.1 +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# area 0.0.0.100 range 198.51.100.96/27 cost 120 +# area 0.0.0.101 authentication message-digest +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# redistribute static route-map zone1-static-connect +# summary-address 198.51.100.128/27 tag 121 +# summary-address 198.51.100.160/27 +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Delete all OSPF processes from the device + cisco.nxos.nxos_ospfv2: + state: deleted + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# - cost: 120 +# prefix: 198.51.100.96/27 +# - area_id: 0.0.0.101 +# authentication: +# message_digest: true +# process_id: "102" +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# redistribute: +# - protocol: static +# route_map: zone1-static-connect +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - no router ospf 100 +# - no router ospf 102 +# +# after: {} + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# nxos-9k-rdo# + +# Using rendered + +- name: Render platform specific configuration lines (without connecting to the device) + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 198.51.100.64/27 + not_advertise: true + - prefix: 198.51.100.96/27 + cost: 120 + - area_id: 0.0.0.101 + authentication: + message_digest: true + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: static + route_map: zone1-static-connect + summary_address: + - prefix: 198.51.100.128/27 + tag: 121 + - prefix: 198.51.100.160/27 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: rendered + +# Task Output (redacted) +# ----------------------- +# rendered: +# - router ospf 100 +# - router-id 203.0.113.20 +# - router ospf 102 +# - router-id 198.51.100.1 +# - redistribute eigrp 120 route-map rmap_1 +# - redistribute direct route-map ospf102-direct-connect +# - area 0.0.0.100 filter-list route-map rmap_1 in +# - area 0.0.0.100 filter-list route-map rmap_2 out +# - area 0.0.0.100 range 198.51.100.64/27 not-advertise +# - area 0.0.0.100 range 198.51.100.96/27 cost 120 +# - area 0.0.0.101 authentication message-digest +# - vrf zone1 +# - router-id 198.51.100.129 +# - summary-address 198.51.100.128/27 tag 121 +# - summary-address 198.51.100.160/27 +# - redistribute static route-map zone1-static-connect +# - area 0.0.0.102 nssa no-summary default-information-originate +# - area 0.0.0.103 nssa no-summary +# - area 0.0.0.103 nssa translate type7 always +# - vrf zone2 +# - auto-cost reference-bandwidth 45 Gbps + +# Using parsed + +# parsed.cfg +# ------------ +# router ospf 100 +# router-id 192.0.100.1 +# area 0.0.0.101 nssa no-summary no-redistribution +# area 0.0.0.102 stub no-summary +# redistribute direct route-map ospf-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 192.0.2.0/24 not-advertise +# area 0.0.0.100 range 192.0.3.0/24 cost 120 +# area 0.0.0.100 authentication message-digest +# vrf zone1 +# router-id 192.0.100.2 +# area 0.0.100.1 nssa no-summary no-redistribution +# redistribute static route-map zone1-direct-connect +# summary-address 10.0.0.0/24 tag 120 +# summary-address 11.0.0.0/24 not-advertise +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps +# down-bit-ignore +# capability vrf-lite evpn +# shutdown +# router ospf 102 +# router-id 198.54.100.1 +# shutdown +# vrf zone2 +# summary-address 192.0.8.0/24 tag 120 +# vrf zone4 +# shutdown + +- name: Parse externally provided OSPFv2 config + cisco.nxos.nxos_ospfv2: + running_config: "{{ lookup('file', 'ospfv2.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# parsed: +# processes: +# - process_id: "100" +# areas: +# - area_id: 0.0.0.101 +# nssa: +# no_redistribution: true +# no_summary: true +# - area_id: 0.0.0.102 +# stub: +# no_summary: true +# - area_id: 0.0.0.100 +# authentication: +# message_digest: true +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 192.0.2.0/24 +# - cost: 120 +# prefix: 192.0.3.0/24 +# redistribute: +# - protocol: direct +# route_map: ospf-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 192.0.100.1 +# vrfs: +# - vrf: zone1 +# areas: +# - area_id: 0.0.100.1 +# nssa: +# no_redistribution: true +# no_summary: true +# redistribute: +# - protocol: static +# route_map: zone1-direct-connect +# router_id: 192.0.100.2 +# summary_address: +# - prefix: 10.0.0.0/24 +# tag: 120 +# - not_advertise: true +# prefix: 11.0.0.0/24 +# - vrf: zone2 +# auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# capability: +# vrf_lite: +# evpn: true +# down_bit_ignore: true +# shutdown: true +# - process_id: "102" +# router_id: 198.54.100.1 +# shutdown: true +# vrfs: +# - vrf: zone2 +# summary_address: +# - prefix: 192.0.8.0/24 +# tag: 120 +# - vrf: zone4 +# shutdown: true + +# Using gathered + +- name: Gather OSPFv2 facts using gathered + cisco.nxos.nxos_ospfv2: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# processes: +# - process_id: "102" +# areas: +# - area_id: 0.0.0.101 +# stub: +# no_summary: true +# - area_id: 0.0.0.100 +# filter_list: +# - direction: in +# route_map: rmap_8 +# ranges: +# - not_advertise: true +# prefix: 198.51.100.64/27 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "130" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 198.51.100.1 +# vrfs: +# - vrf: zone1 +# areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# redistribute: +# - id: "65563" +# protocol: bgp +# route_map: zone1-bgp-connect +# router_id: 198.51.100.129 +# +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: + - "router ospf 102" + - "router-id 198.54.100.1" + - "router ospf 100" + - "router-id 192.0.100.1" + - "redistribute eigrp 120 route-map rmap_1" + - "redistribute direct route-map ospf-direct-connect" + - "area 0.0.0.100 filter-list route-map rmap_1 in" + - "area 0.0.0.100 filter-list route-map rmap_2 out" + - "area 0.0.0.100 range 192.0.2.0/24 not-advertise" + - "area 0.0.0.100 range 192.0.3.0/24 cost 120" + - "vrf zone1" + - "router-id 192.0.100.2" + - "summary-address 10.0.0.0/24 tag 121" + - "summary-address 11.0.0.0/24" + - "redistribute static route-map zone1-direct-connect" + - "vrf zone2" + - "auto-cost reference-bandwidth 45 Gbps" + - "capability vrf-lite evpn" +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospfv2.ospfv2 import ( + Ospfv2Args, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.ospfv2.ospfv2 import ( + Ospfv2, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [ + ("state", "merged", ("config",)), + ("state", "replaced", ("config",)), + ("state", "overridden", ("config",)), + ("state", "rendered", ("config",)), + ("state", "parsed", ("running_config",)), + ] + module = AnsibleModule( + argument_spec=Ospfv2Args.argument_spec, + required_if=required_if, + supports_check_mode=True, + ) + + result = Ospfv2(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv3.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv3.py new file mode 100644 index 00000000..2783a6cf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ospfv3.py @@ -0,0 +1,1699 @@ +#!/usr/bin/python +# -*- 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) + +############################################# +# 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 module file for nxos_ospfv3 +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = """ +module: nxos_ospfv3 +short_description: OSPFv3 resource module +description: +- This module manages OSPFv3 configuration on devices running Cisco NX-OS. +version_added: 1.2.0 +notes: +- Tested against NX-OS 7.0(3)I5(1). +- This module works with connection C(network_cli) and C(httpapi). +author: Nilashish Chakraborty (@NilashishC) +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the command B(show running-config | section "^router ospfv3"). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A list of OSPFv3 process configuration. + type: dict + suboptions: + processes: + description: + - A list of OSPFv3 instances' configurations. + type: list + elements: dict + suboptions: + address_family: + description: + - IPv6 unicast address-family OSPFv3 settings. + type: dict + suboptions: + afi: + description: + - Configure OSPFv3 settings under IPv6 address-family. + type: str + choices: ['ipv6'] + safi: + description: + - Configure OSPFv3 settings under IPv6 unicast address-family. + type: str + choices: ['unicast'] + areas: + description: + - Configure properties of OSPF Areas under address-family. + type: list + elements: dict + suboptions: + area_id: + description: + - The Area ID as an integer or IP Address. + type: str + required: True + default_cost: + description: + - Specify the default cost. + type: int + filter_list: + description: + - Filter prefixes between OSPF areas. + type: list + elements: dict + suboptions: + route_map: + description: + - The Route-map name. + type: str + required: True + direction: + description: + - The direction to apply the route map. + type: str + choices: [in, out] + required: True + ranges: + description: + - Configure an address range for the area. + type: list + elements: dict + suboptions: + prefix: + description: + - IP in Prefix format (x.x.x.x/len) + type: str + required: True + cost: + description: + - Cost to use for the range. + type: int + not_advertise: + description: + - Suppress advertising the specified range. + type: bool + default_information: + description: + - Control distribution of default routes. + type: dict + suboptions: + originate: + description: + - Distribute a default route. + type: dict + suboptions: + set: + description: + - Enable distribution of default route. + type: bool + always: + description: + - Always advertise a default route. + type: bool + route_map: + description: + - Policy to control distribution of default routes + type: str + distance: + description: + - Configure the OSPF administrative distance. + type: int + maximum_paths: + description: + - Maximum paths per destination. + type: int + redistribute: + description: + - Redistribute information from another routing protocol. + type: list + elements: dict + suboptions: + protocol: + description: + - The name of the protocol. + type: str + choices: [bgp, direct, eigrp, isis, lisp, ospfv3, rip, static] + required: True + id: + description: + - The identifier for the protocol specified. + type: str + route_map: + description: + - The route map policy to constrain redistribution. + type: str + required: True + summary_address: + description: + - Configure route summarization for redistribution. + type: list + elements: dict + suboptions: + prefix: + description: + - IPv6 prefix format 'xxxx:xxxx/ml', 'xxxx:xxxx::/ml' or 'xxxx::xx/128' + type: str + required: True + not_advertise: + description: + - Supress advertising the specified summary. + type: bool + tag: + description: + - A 32-bit tag value. + type: int + table_map: + description: + - Policy for filtering/modifying OSPF routes before sending them to + RIB. + type: dict + suboptions: + name: + description: + - The Route Map name. + type: str + required: True + filter: + description: + - Block the OSPF routes from being sent to RIB. + type: bool + timers: + description: + - Configure timer related constants. + type: dict + suboptions: + throttle: + description: + - Configure throttle related constants. + type: dict + suboptions: + spf: + description: + - Set OSPF SPF timers. + type: dict + suboptions: + initial_spf_delay: + description: + - Initial SPF schedule delay in milliseconds. + type: int + min_hold_time: + description: + - Minimum hold time between SPF calculations. + type: int + max_wait_time: + description: + - Maximum wait time between SPF calculations. + type: int + areas: + description: + - Configure properties of OSPF Areas. + type: list + elements: dict + suboptions: + area_id: + description: + - The Area ID as an integer or IP Address. + type: str + required: True + nssa: + description: + - NSSA settings for the area. + type: dict + suboptions: + set: + description: + - Configure area as NSSA. + type: bool + default_information_originate: + description: + - Originate Type-7 default LSA into NSSA area. + type: bool + no_redistribution: + description: + - Do not send redistributed LSAs into NSSA area. + type: bool + no_summary: + description: + - Do not send summary LSAs into NSSA area. + type: bool + route_map: + description: + - Policy to control distribution of default route. + type: str + translate: + description: + - Translate LSA. + type: dict + suboptions: + type7: + description: + - Translate from Type 7 to Type 5. + type: dict + suboptions: + always: + description: + - Always translate LSAs + type: bool + never: + description: + - Never translate LSAs + type: bool + supress_fa: + description: + - Suppress forwarding address in translated LSAs. + type: bool + stub: + description: + - Settings for configuring the area as a stub. + type: dict + suboptions: + set: + description: + - Configure the area as a stub. + type: bool + no_summary: + description: + - Prevent ABR from sending summary LSAs into stub area. + type: bool + auto_cost: + description: + - Calculate OSPF cost according to bandwidth. + type: dict + suboptions: + reference_bandwidth: + description: + - Reference bandwidth used to assign OSPF cost. + type: int + required: True + unit: + description: + - Specify in which unit the reference bandwidth is specified. + type: str + required: True + choices: [Gbps, Mbps] + flush_routes: + description: + - Flush routes on a non-graceful controlled restart. + type: bool + graceful_restart: + description: + - Configure graceful restart. + type: dict + suboptions: + set: + description: + - Enable graceful-restart. + type: bool + grace_period: + description: + - Configure maximum interval to restart gracefully. + type: int + helper_disable: + description: + - Enable/Disable helper mode. + type: bool + planned_only: + description: + - Enable graceful restart only for a planned restart + type: bool + isolate: + description: + - Isolate this router from OSPF perspective. + type: bool + log_adjacency_changes: + description: + - Log changes in adjacency state. + type: dict + suboptions: + log: + description: + - Enable/disable logging changes in adjacency state. + type: bool + detail: + description: + - Notify all state changes. + type: bool + max_lsa: + description: + - Feature to limit the number of non-self-originated LSAs. + type: dict + suboptions: + max_non_self_generated_lsa: + description: + - Set the maximum number of non self-generated LSAs. + type: int + required: True + threshold: + description: + - Threshold value (%) at which to generate a warning message. + type: int + ignore_count: + description: + - Set count on how many times adjacencies can be suppressed. + type: int + ignore_time: + description: + - Set time during which all adjacencies are suppressed. + type: int + reset_time: + description: + - Set number of minutes after which ignore-count is reset to zero. + type: int + warning_only: + description: + - Log a warning message when limit is exceeded. + type: bool + max_metric: + description: + - Maximize the cost metric. + type: dict + suboptions: + router_lsa: + description: + - Router LSA configuration. + type: dict + suboptions: + set: + description: + - Set router-lsa attribute. + type: bool + external_lsa: + description: + - External LSA configuration. + type: dict + suboptions: + set: + description: + - Set external-lsa attribute. + type: bool + max_metric_value: + description: + - Set max metric value for external LSAs. + type: int + stub_prefix_lsa: + description: + - Advertise Max metric for Stub links as well. + type: bool + on_startup: + description: + - Effective only at startup. + type: dict + suboptions: + set: + description: + - Set on-startup attribute. + type: bool + wait_period: + description: + - Wait period in seconds after startup. + type: int + wait_for_bgp_asn: + description: + - ASN of BGP to wait for. + type: int + inter_area_prefix_lsa: + description: + - Inter-area-prefix LSAs configuration. + type: dict + suboptions: + set: + description: + - Set summary-lsa attribute. + type: bool + max_metric_value: + description: + - Max metric value for summary LSAs. + type: int + name_lookup: + description: + - Display OSPF router ids as DNS names. + type: bool + passive_interface: + description: + - Suppress routing updates on the interface. + type: dict + suboptions: + default: + description: + - Interfaces passive by default. + type: bool + process_id: + description: + - The OSPF process tag. + type: str + required: True + router_id: + description: + - Set OSPF process router-id. + type: str + shutdown: + description: + - Shutdown the OSPF protocol instance. + type: bool + timers: + description: + - Configure timer related constants. + type: dict + suboptions: + lsa_arrival: + description: + - Mimimum interval between arrival of a LSA. + type: int + lsa_group_pacing: + description: + - LSA group refresh/maxage interval. + type: int + throttle: + description: + - Configure throttle related constants. + type: dict + suboptions: + lsa: + description: + - Set rate-limiting for LSA generation. + type: dict + suboptions: + start_interval: + description: + - The start interval. + type: int + hold_interval: + description: + - The hold interval. + type: int + max_interval: + description: + - The max interval. + type: int + vrfs: + description: + - Configure VRF specific OSPF settings. + type: list + elements: dict + suboptions: + areas: + description: + - Configure properties of OSPF Areas. + type: list + elements: dict + suboptions: + area_id: + description: + - The Area ID as an integer or IP Address. + type: str + required: True + nssa: + description: + - NSSA settings for the area. + type: dict + suboptions: + set: + description: + - Configure area as NSSA. + type: bool + default_information_originate: + description: + - Originate Type-7 default LSA into NSSA area. + type: bool + no_redistribution: + description: + - Do not send redistributed LSAs into NSSA area. + type: bool + no_summary: + description: + - Do not send summary LSAs into NSSA area. + type: bool + route_map: + description: + - Policy to control distribution of default route. + type: str + translate: + description: + - Translate LSA. + type: dict + suboptions: + type7: + description: + - Translate from Type 7 to Type 5. + type: dict + suboptions: + always: + description: + - Always translate LSAs + type: bool + never: + description: + - Never translate LSAs + type: bool + supress_fa: + description: + - Suppress forwarding address in translated LSAs. + type: bool + stub: + description: + - Settings for configuring the area as a stub. + type: dict + suboptions: + set: + description: + - Configure the area as a stub. + type: bool + no_summary: + description: + - Prevent ABR from sending summary LSAs into stub area. + type: bool + auto_cost: + description: + - Calculate OSPF cost according to bandwidth. + type: dict + suboptions: + reference_bandwidth: + description: + - Reference bandwidth used to assign OSPF cost. + type: int + required: True + unit: + description: + - Specify in which unit the reference bandwidth is specified. + type: str + required: True + choices: [Gbps, Mbps] + graceful_restart: + description: + - Configure graceful restart. + type: dict + suboptions: + set: + description: + - Enable graceful-restart. + type: bool + grace_period: + description: + - Configure maximum interval to restart gracefully. + type: int + helper_disable: + description: + - Enable/Disable helper mode. + type: bool + planned_only: + description: + - Enable graceful restart only for a planned restart + type: bool + log_adjacency_changes: + description: + - Log changes in adjacency state. + type: dict + suboptions: + log: + description: + - Enable/disable logging changes in adjacency state. + type: bool + detail: + description: + - Notify all state changes. + type: bool + max_lsa: + description: + - Feature to limit the number of non-self-originated LSAs. + type: dict + suboptions: + max_non_self_generated_lsa: + description: + - Set the maximum number of non self-generated LSAs. + type: int + required: True + threshold: + description: + - Threshold value (%) at which to generate a warning message. + type: int + ignore_count: + description: + - Set count on how many times adjacencies can be suppressed. + type: int + ignore_time: + description: + - Set time during which all adjacencies are suppressed. + type: int + reset_time: + description: + - Set number of minutes after which ignore-count is reset to zero. + type: int + warning_only: + description: + - Log a warning message when limit is exceeded. + type: bool + max_metric: + description: + - Maximize the cost metric. + type: dict + suboptions: + router_lsa: + description: + - Router LSA configuration. + type: dict + suboptions: + set: + description: + - Set router-lsa attribute. + type: bool + external_lsa: + description: + - External LSA configuration. + type: dict + suboptions: + set: + description: + - Set external-lsa attribute. + type: bool + max_metric_value: + description: + - Set max metric value for external LSAs. + type: int + stub_prefix_lsa: + description: + - Advertise Max metric for Stub links as well. + type: bool + on_startup: + description: + - Effective only at startup. + type: dict + suboptions: + set: + description: + - Set on-startup attribute. + type: bool + wait_period: + description: + - Wait period in seconds after startup. + type: int + wait_for_bgp_asn: + description: + - ASN of BGP to wait for. + type: int + inter_area_prefix_lsa: + description: + - Inter-area-prefix LSAs configuration. + type: dict + suboptions: + set: + description: + - Set summary-lsa attribute. + type: bool + max_metric_value: + description: + - Max metric value for summary LSAs. + type: int + name_lookup: + description: + - Display OSPF router ids as DNS names. + type: bool + passive_interface: + description: + - Suppress routing updates on the interface. + type: dict + suboptions: + default: + description: + - Interfaces passive by default. + type: bool + router_id: + description: + - Set OSPF process router-id. + type: str + shutdown: + description: + - Shutdown the OSPF protocol instance. + type: bool + timers: + description: + - Configure timer related constants. + type: dict + suboptions: + lsa_arrival: + description: + - Mimimum interval between arrival of a LSA. + type: int + lsa_group_pacing: + description: + - LSA group refresh/maxage interval. + type: int + throttle: + description: + - Configure throttle related constants. + type: dict + suboptions: + lsa: + description: + - Set rate-limiting for LSA generation. + type: dict + suboptions: + start_interval: + description: + - The start interval. + type: int + hold_interval: + description: + - The hold interval. + type: int + max_interval: + description: + - The max interval. + type: int + vrf: + description: + - Name/Identifier of the VRF. + type: str + required: True + state: + description: + - The state the configuration should be left in. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - parsed + - rendered + default: merged +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# nxos-9k-rdo# + +- name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 2001:db2::/32 + not_advertise: true + - prefix: 2001:db3::/32 + cost: 120 + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: merged + +# Task output +# ------------- +# before: {} +# +# commands: +# - router ospf 102 +# - router-id 198.51.100.1 +# - address-family ipv6 unicast +# - redistribute eigrp 120 route-map rmap_1 +# - redistribute direct route-map ospf102-direct-connect +# - area 0.0.0.100 filter-list route-map rmap_1 in +# - area 0.0.0.100 filter-list route-map rmap_2 out +# - area 0.0.0.100 range 2001:db2::/32 not-advertise +# - area 0.0.0.100 range 2001:db3::/32 cost 120 +# - vrf zone1 +# - router-id 198.51.100.129 +# - area 0.0.0.102 nssa no-summary default-information-originate +# - area 0.0.0.103 nssa no-summary +# - area 0.0.0.103 nssa translate type7 always +# - vrf zone2 +# - auto-cost reference-bandwidth 45 Gbps +# - router ospf 100 +# - router-id 203.0.113.20 +# +# after: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv4 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# - cost: 120 +# prefix: 2001:db3::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 100 +# router-id 203.0.113.20 +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family ipv6 unicast +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 2001:db2::/32 not-advertise +# area 0.0.0.100 range 2001:db3::/32 cost 120 +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +# Using replaced + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 100 +# router-id 203.0.113.20 +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family upv6 unicast +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 2001:db2::/32 not-advertise +# area 0.0.0.100 range 2001:db3::/32 cost 120 +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Replace device configurations of listed OSPFv3 processes with provided configurations + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_8 + direction: in + ranges: + - not_advertise: true + prefix: 2001:db2::/32 + redistribute: + - protocol: eigrp + id: 130 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + state: replaced + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv4 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# - cost: 120 +# prefix: 2001:db3::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - router ospf 102 +# - address-family ipv6 unicast +# - redistribute eigrp 130 route-map rmap_1 +# - no redistribute eigrp 120 route-map rmap_1 +# - area 0.0.0.100 filter-list route-map rmap_8 in +# - no area 0.0.0.100 filter-list route-map rmap_2 out +# - no area 0.0.0.100 range 2001:db3::/32 +# - vrf zone1 +# - no area 0.0.0.103 nssa +# - no area 0.0.0.103 nssa translate type7 always +# - no vrf zone2 +# +# after: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv6 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: in +# route_map: rmap_8 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "130" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# router_id: 198.51.100.129 +# vrf: zone1 + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 100 +# router-id 203.0.113.20 +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family ipv6 unicast +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 130 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_8 in +# area 0.0.0.100 range 198.51.100.64/27 not-advertise +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate + +# Using overridden + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 100 +# router-id 203.0.113.20 +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family ipv6 unicast +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 2001:db2::/32 not-advertise +# area 0.0.0.100 range 2001:db3::/32 cost 120 +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Overridde all OSPFv3 configuration with provided configuration + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 104 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + shutdown: true + state: overridden + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv4 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# - cost: 120 +# prefix: 2001:db3::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - no router ospfv3 100 +# - router ospfv3 104 +# - router-id 203.0.113.20 +# - router ospfv3 102 +# - shutdown +# - address-family ipv6 unicast +# - no redistribute direct route-map ospf102-direct-connect +# - no redistribute eigrp 120 route-map rmap_1 +# - no area 0.0.0.100 filter-list route-map rmap_2 out +# - no area 0.0.0.100 filter-list route-map rmap_1 in +# - no area 0.0.0.100 range 2001:db2::/32 +# - no area 0.0.0.100 range 2001:db3::/32 +# - no vrf zone1 +# - no vrf zone2 +# +# after: +# processes: +# - process_id: "102" +# router_id: 198.51.100.1 +# shutdown: true +# address_family: +# afi: ipv6 +# safi: unicast +# - process_id: "104" +# router_id: 203.0.113.20 + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family ipv6 unicast +# shutdown +# router ospfv3 104 +# router-id 203.0.113.20 + +# Using deleted to delete a single OSPF process + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospf .*" +# router ospfv3 100 +# router-id 203.0.113.20 +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family ipv6 unicast +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 2001:db2::/32 not-advertise +# area 0.0.0.100 range 2001:db3::/32 cost 120 +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Delete a single OSPFv3 process + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 102 + state: deleted + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv4 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# - cost: 120 +# prefix: 2001:db3::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - no router ospfv3 102 +# +# after: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 100 +# router-id 203.0.113.20 + +# Using deleted all OSPFv3 processes from the device + +# Before state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# router ospfv3 100 +# router-id 203.0.113.20 +# router ospfv3 102 +# router-id 198.51.100.1 +# address-family ipv6 unicast +# redistribute direct route-map ospf102-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 2001:db2::/32 not-advertise +# area 0.0.0.100 range 2001:db3::/32 cost 120 +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.0.102 nssa no-summary default-information-originate +# area 0.0.0.103 nssa no-summary +# area 0.0.0.103 nssa translate type7 always +# vrf zone2 +# auto-cost reference-bandwidth 45 Gbps + +- name: Delete all OSPFv3 processes from the device + cisco.nxos.nxos_ospfv3: + state: deleted + +# Task output +# ------------- +# before: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv4 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# - cost: 120 +# prefix: 2001:db3::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +# commands: +# - no router ospfv3 100 +# - no router ospfv3 102 +# +# after: {} + +# After state: +# ------------ +# nxos-9k-rdo# sh running-config | section "^router ospfv3" +# nxos-9k-rdo# + +# Using rendered + +- name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 2001:db2::/32 + not_advertise: true + - prefix: 2001:db3::/32 + cost: 120 + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: true + translate: + type7: + always: true + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: rendered + +# Task Output (redacted) +# ----------------------- +# rendered: +# - router ospfv3 100 +# - router-id 203.0.113.20 +# - router ospfv3 102 +# - router-id 198.51.100.1 +# - address-family ipv6 unicast +# - redistribute eigrp 120 route-map rmap_1 +# - redistribute direct route-map ospf102-direct-connect +# - area 0.0.0.100 filter-list route-map rmap_1 in +# - area 0.0.0.100 filter-list route-map rmap_2 out +# - area 0.0.0.100 range 2001:db2::/32 not-advertise +# - area 0.0.0.100 range 2001:db3::/32 cost 120 +# - vrf zone1 +# - router-id 198.51.100.129 +# - area 0.0.0.102 nssa no-summary default-information-originate +# - area 0.0.0.103 nssa no-summary +# - area 0.0.0.103 nssa translate type7 always +# - vrf zone2 +# - auto-cost reference-bandwidth 45 Gbps + +# Using parsed + +# parsed.cfg +# ------------ +# router ospfv3 100 +# router-id 192.0.100.1 +# address-family ipv6 unicast +# redistribute direct route-map ospf-direct-connect +# redistribute eigrp 120 route-map rmap_1 +# area 0.0.0.100 filter-list route-map rmap_2 out +# area 0.0.0.100 filter-list route-map rmap_1 in +# area 0.0.0.100 range 2001:db2::/32 not-advertise +# area 0.0.0.100 range 2001:db3::/32 cost 120 +# vrf zone1 +# router-id 198.51.100.129 +# area 0.0.100.1 nssa no-summary no-redistribution +# router ospfv3 102 +# router-id 198.54.100.1 +# shutdown + +- name: Parse externally provided OSPFv3 config + cisco.nxos.nxos_ospfv3: + running_config: "{{ lookup('file', 'ospfv2.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- +# parsed: +# processes: +# - process_id: "100" +# address_family: +# afi: ipv6 +# safi: unicast +# areas: +# - area_id: 0.0.0.101 +# nssa: +# no_redistribution: true +# no_summary: true +# - area_id: 0.0.0.102 +# stub: +# no_summary: true +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 192.0.2.0/24 +# - cost: 120 +# prefix: 192.0.3.0/24 +# redistribute: +# - protocol: direct +# route_map: ospf-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# router_id: 192.0.100.1 +# vrfs: +# - vrf: zone1 +# areas: +# - area_id: 0.0.100.1 +# nssa: +# no_redistribution: true +# no_summary: true +# router_id: 192.0.100.2 +# - process_id: "102" +# router_id: 198.54.100.1 +# shutdown: True + +# Using gathered + +- name: Gather OSPFv3 facts using gathered + cisco.nxos.nxos_ospfv3: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# processes: +# - process_id: "100" +# router_id: 203.0.113.20 +# - address_family: +# afi: ipv4 +# safi: unicast +# areas: +# - area_id: 0.0.0.100 +# filter_list: +# - direction: out +# route_map: rmap_2 +# - direction: in +# route_map: rmap_1 +# ranges: +# - not_advertise: true +# prefix: 2001:db2::/32 +# - cost: 120 +# prefix: 2001:db3::/32 +# redistribute: +# - protocol: direct +# route_map: ospf102-direct-connect +# - id: "120" +# protocol: eigrp +# route_map: rmap_1 +# process_id: "102" +# router_id: 198.51.100.1 +# vrfs: +# - areas: +# - area_id: 0.0.0.102 +# nssa: +# default_information_originate: true +# no_summary: true +# - area_id: 0.0.0.103 +# nssa: +# no_summary: true +# translate: +# type7: +# always: true +# router_id: 198.51.100.129 +# vrf: zone1 +# - auto_cost: +# reference_bandwidth: 45 +# unit: Gbps +# vrf: zone2 +# +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: + - "router ospfv3 102" + - "router-id 198.54.100.1" + - "router ospfv3 100" + - "router-id 192.0.100.1" + - "address-family ipv6 unicast" + - "redistribute eigrp 120 route-map rmap_1" + - "redistribute direct route-map ospf-direct-connect" + - "area 0.0.0.100 filter-list route-map rmap_1 in" + - "area 0.0.0.100 filter-list route-map rmap_2 out" + - "area 0.0.0.100 range 2001:db2::/32 not-advertise" + - "area 0.0.0.100 range 2001:db3::/32 cost 120" + - "vrf zone1" + - "router-id 192.0.100.2" + - "vrf zone2" + - "auto-cost reference-bandwidth 45 Gbps" +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospfv3.ospfv3 import ( + Ospfv3Args, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.ospfv3.ospfv3 import ( + Ospfv3, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=Ospfv3Args.argument_spec, + mutually_exclusive=[["config", "running_config"]], + required_if=[ + ["state", "merged", ["config"]], + ["state", "replaced", ["config"]], + ["state", "overridden", ["config"]], + ["state", "rendered", ["config"]], + ["state", "parsed", ["running_config"]], + ], + supports_check_mode=True, + ) + + result = Ospfv3(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_overlay_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_overlay_global.py new file mode 100644 index 00000000..1ea560c3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_overlay_global.py @@ -0,0 +1,204 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_overlay_global +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Configures anycast gateway MAC of the switch. +description: +- Configures anycast gateway MAC of the switch. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Default restores params default value +- Supported MAC address format are "E.E.E", "EE-EE-EE-EE-EE-EE", "EE:EE:EE:EE:EE:EE" + and "EEEE.EEEE.EEEE" +options: + anycast_gateway_mac: + description: + - Anycast gateway mac of the switch. + required: true + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_overlay_global: + anycast_gateway_mac: b.b.b +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["fabric forwarding anycast-gateway-mac 000B.000B.000B"] +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + +PARAM_TO_COMMAND_KEYMAP = { + "anycast_gateway_mac": "fabric forwarding anycast-gateway-mac" +} + + +def get_existing(module, args): + existing = {} + config = str(get_config(module)) + + for arg in args: + command = PARAM_TO_COMMAND_KEYMAP[arg] + has_command = re.findall( + r"(?:{0}\s)(?P.*)$".format(command), config, re.M + ) + value = "" + if has_command: + value = has_command[0] + existing[arg] = value + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if value: + new_dict[new_key] = value + return new_dict + + +def get_commands(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, proposed in proposed_commands.items(): + existing_value = existing_commands.get(key) + if proposed == "default" and existing_value: + commands.append("no {0} {1}".format(key, existing_value)) + elif "anycast-gateway-mac" in key and proposed != "default": + proposed = normalize_mac(proposed, module) + existing_value = normalize_mac(existing_value, module) + if proposed != existing_value: + command = "{0} {1}".format(key, proposed) + commands.append(command) + if commands: + candidate.add(commands, parents=[]) + + +def normalize_mac(proposed_mac, module): + if proposed_mac is None: + return "" + try: + if "-" in proposed_mac: + splitted_mac = proposed_mac.split("-") + if len(splitted_mac) != 6: + raise ValueError + + for octect in splitted_mac: + if len(octect) != 2: + raise ValueError + + elif "." in proposed_mac: + splitted_mac = [] + splitted_dot_mac = proposed_mac.split(".") + if len(splitted_dot_mac) != 3: + raise ValueError + + for octect in splitted_dot_mac: + if len(octect) > 4: + raise ValueError + else: + octect_len = len(octect) + padding = 4 - octect_len + splitted_mac.append(octect.zfill(padding + 1)) + + elif ":" in proposed_mac: + splitted_mac = proposed_mac.split(":") + if len(splitted_mac) != 6: + raise ValueError + + for octect in splitted_mac: + if len(octect) != 2: + raise ValueError + else: + raise ValueError + except ValueError: + module.fail_json( + msg="Invalid MAC address format", proposed_mac=proposed_mac + ) + + joined_mac = "".join(splitted_mac) + # fmt: off + mac = [joined_mac[i: i + 4] for i in range(0, len(joined_mac), 4)] + # fmt: on + return ".".join(mac).upper() + + +def main(): + argument_spec = dict(anycast_gateway_mac=dict(required=True, type="str")) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + result = {"changed": False, "commands": [], "warnings": warnings} + + args = PARAM_TO_COMMAND_KEYMAP.keys() + + existing = get_existing(module, args) + proposed = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + candidate = CustomNetworkConfig(indent=3) + get_commands(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + result["commands"] = candidate + + if not module.check_mode: + load_config(module, candidate) + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim.py new file mode 100644 index 00000000..1f8aefc6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim.py @@ -0,0 +1,220 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_pim +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages configuration of a PIM instance. +description: +- Manages configuration of a Protocol Independent Multicast (PIM) instance. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +options: + bfd: + description: + - Enables BFD on all PIM interfaces. + - "Dependency: ''feature bfd''" + type: str + choices: + - enable + - disable + ssm_range: + description: + - Configure group ranges for Source Specific Multicast (SSM). Valid values are + multicast addresses or the keyword C(none) or keyword C(default). C(none) removes + all SSM group ranges. C(default) will set ssm_range to the default multicast + address. If you set multicast address, please ensure that it is not the same + as the C(default), otherwise use the C(default) option. + type: list + elements: str +""" +EXAMPLES = """ +- name: Configure ssm_range, enable bfd + cisco.nxos.nxos_pim: + bfd: enable + ssm_range: 224.0.0.0/8 + +- name: Set to default + cisco.nxos.nxos_pim: + ssm_range: default + +- name: Remove all ssm group ranges + cisco.nxos.nxos_pim: + ssm_range: none +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - ip pim bfd + - ip pim ssm range 224.0.0.0/8 +""" + + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +PARAM_TO_COMMAND_KEYMAP = { + "bfd": "ip pim bfd", + "ssm_range": "ip pim ssm range", +} + + +def get_existing(module, args): + existing = {} + config = str(get_config(module)) + + for arg in args: + if "ssm_range" in arg: + # may be 'n.n.n.n/s', 'none', or 'default' + m = re.search( + r"ssm range (?P(?:[\s\d.\/]+|none|default))?$", + config, + re.M, + ) + if m: + # Remove rsvd SSM range + value = m.group("value").replace("232.0.0.0/8", "") + existing[arg] = value.split() + + elif "bfd" in arg and "ip pim bfd" in config: + existing[arg] = "enable" + + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if value is not None: + new_dict[new_key] = value + return new_dict + + +def get_commands(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + + for key, value in proposed_commands.items(): + command = "" + if key == "ip pim ssm range": + if value == "default": + # no cmd needs a value but the actual value does not matter + command = "no ip pim ssm range none" + elif value == "none": + command = "ip pim ssm range none" + elif value: + command = "ip pim ssm range {0}".format(value) + elif key == "ip pim bfd": + no_cmd = "no " if value == "disable" else "" + command = no_cmd + key + + if command: + commands.append(command) + + if commands: + candidate.add(commands, parents=[]) + + +def main(): + argument_spec = dict( + bfd=dict(required=False, type="str", choices=["enable", "disable"]), + ssm_range=dict( + required=False, type="list", default=[], elements="str" + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + warnings = list() + result = {"changed": False, "commands": [], "warnings": warnings} + + params = module.params + args = [k for k in PARAM_TO_COMMAND_KEYMAP.keys() if params[k] is not None] + + # SSM syntax check + if "ssm_range" in args: + for item in params["ssm_range"]: + if re.search("none|default", item): + break + if len(item.split(".")) != 4: + module.fail_json( + msg="Valid ssm_range values are multicast addresses " + "or the keyword 'none' or the keyword 'default'." + ) + + existing = get_existing(module, args) + proposed_args = dict((k, v) for k, v in params.items() if k in args) + + proposed = {} + for key, value in proposed_args.items(): + if key == "ssm_range": + if value and value[0] == "default": + if existing.get(key): + proposed[key] = "default" + else: + v = sorted(set([str(i) for i in value])) + ex = sorted(set([str(i) for i in existing.get(key, [])])) + if v != ex: + proposed[key] = " ".join(str(s) for s in v) + + elif key == "bfd": + if value != existing.get("bfd", "disable"): + proposed[key] = value + + elif value != existing.get(key): + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + get_commands(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + result["commands"] = candidate + result["changed"] = True + load_config(module, candidate) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_interface.py new file mode 100644 index 00000000..5c0a9601 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_interface.py @@ -0,0 +1,621 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +DOCUMENTATION = """ +module: nxos_pim_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages PIM interface configuration. +description: +- Manages PIM interface configuration settings. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- When C(state=default), supported params will be reset to a default state. These + include C(dr_prio), C(hello_auth_key), C(hello_interval), C(jp_policy_out), C(jp_policy_in), + C(jp_type_in), C(jp_type_out), C(border), C(neighbor_policy), C(neighbor_type). +- The C(hello_auth_key) param is not idempotent. +- C(hello_auth_key) only supports clear text passwords. +- When C(state=absent), pim interface configuration will be set to defaults and pim-sm + will be disabled on the interface. +- PIM must be enabled on the device to use this module. +- This module is for Layer 3 interfaces. +options: + interface: + description: + - Full name of the interface such as Ethernet1/33. + type: str + required: true + sparse: + description: + - Enable/disable sparse-mode on the interface. + type: bool + default: false + bfd: + description: + - Enables BFD for PIM at the interface level. This overrides the bfd variable + set at the pim global level. + - Valid values are 'enable', 'disable' or 'default'. + - "Dependency: ''feature bfd''" + type: str + choices: + - enable + - disable + - default + dr_prio: + description: + - Configures priority for PIM DR election on interface. + type: str + hello_auth_key: + description: + - Authentication for hellos on this interface. + type: str + hello_interval: + description: + - Hello interval in milliseconds for this interface. + type: int + jp_policy_out: + description: + - Policy for join-prune messages (outbound). + type: str + jp_policy_in: + description: + - Policy for join-prune messages (inbound). + type: str + jp_type_out: + description: + - Type of policy mapped to C(jp_policy_out). + type: str + choices: + - prefix + - routemap + jp_type_in: + description: + - Type of policy mapped to C(jp_policy_in). + type: str + choices: + - prefix + - routemap + border: + description: + - Configures interface to be a boundary of a PIM domain. + type: bool + default: false + neighbor_policy: + description: + - Configures a neighbor policy for filtering adjacencies. + type: str + neighbor_type: + description: + - Type of policy mapped to neighbor_policy. + type: str + choices: + - prefix + - routemap + state: + description: + - Manages desired state of the resource. + type: str + choices: + - present + - absent + - default + default: present +""" +EXAMPLES = """ +- name: Ensure PIM is not running on the interface + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + state: absent + +- name: Ensure the interface has pim-sm enabled with the appropriate priority and + hello interval + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + dr_prio: 10 + hello_interval: 40 + state: present + +- name: Ensure join-prune policies exist + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + jp_policy_in: JPIN + jp_policy_out: JPOUT + jp_type_in: routemap + jp_type_out: routemap + +- name: disable bfd on the interface + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + bfd: disable + +- name: Ensure defaults are in place + cisco.nxos.nxos_pim_interface: + interface: eth1/33 + state: default +""" + +RETURN = r""" +commands: + description: command sent to the device + returned: always + type: list + sample: ["interface eth1/33", + "ip pim neighbor-policy test", + "ip pim bfd-instance disable", + "ip pim neighbor-policy test" + ] +""" + +import re +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_interface_type, +) + + +PARAM_TO_COMMAND_KEYMAP = { + "interface": "", + "bfd": "ip pim bfd-instance", + "sparse": "ip pim sparse-mode", + "dr_prio": "ip pim dr-priority {0}", + "hello_interval": "ip pim hello-interval {0}", + "hello_auth_key": "ip pim hello-authentication ah-md5 {0}", + "border": "ip pim border", + "jp_policy_out": "ip pim jp-policy prefix-list {0} out", + "jp_policy_in": "ip pim jp-policy prefix-list {0} in", + "jp_type_in": "", + "jp_type_out": "", + "neighbor_policy": "ip pim neighbor-policy prefix-list {0}", + "neighbor_type": "", +} + +PARAM_TO_DEFAULT_KEYMAP = { + "bfd": "default", + "dr_prio": "1", + "hello_interval": "30000", + "sparse": False, + "border": False, + "hello_auth_key": False, +} + +BFD_KEYMAP = { + None: None, + "default": "no ip pim bfd-instance", + "disable": "ip pim bfd-instance disable", + "enable": "ip pim bfd-instance", +} + + +def execute_show_command(command, module, text=False): + if text: + cmds = [{"command": command, "output": "text"}] + else: + cmds = [{"command": command, "output": "json"}] + + return run_commands(module, cmds) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def local_existing(gexisting): + jp_bidir = False + isauth = False + if gexisting: + jp_bidir = gexisting.get("jp_bidir") + isauth = gexisting.get("isauth") + if jp_bidir and isauth: + gexisting.pop("jp_bidir") + gexisting.pop("isauth") + + return gexisting, jp_bidir, isauth + + +def get_interface_mode(interface, intf_type, module): + mode = "unknown" + command = "show interface {0}".format(interface) + body = execute_show_command(command, module) + + try: + interface_table = body[0]["TABLE_interface"]["ROW_interface"] + except (KeyError, AttributeError, IndexError): + return mode + + if intf_type in ["ethernet", "portchannel"]: + mode = str(interface_table.get("eth_mode", "layer3")) + if mode in ["access", "trunk"]: + mode = "layer2" + elif mode == "routed": + mode = "layer3" + elif intf_type in ["loopback", "svi"]: + mode = "layer3" + return mode + + +def get_pim_interface(module, interface): + pim_interface = {} + body = get_config(module, flags=["interface {0}".format(interface)]) + + pim_interface["bfd"] = "default" + pim_interface["neighbor_type"] = None + pim_interface["neighbor_policy"] = None + pim_interface["jp_policy_in"] = None + pim_interface["jp_policy_out"] = None + pim_interface["jp_type_in"] = None + pim_interface["jp_type_out"] = None + pim_interface["jp_bidir"] = False + pim_interface["isauth"] = False + + if body: + all_lines = body.splitlines() + + for each in all_lines: + if "jp-policy" in each: + policy_name = re.search( + r"ip pim jp-policy(?: prefix-list)? (\S+)(?: \S+)?", each + ).group(1) + if "prefix-list" in each: + ptype = "prefix" + else: + ptype = "routemap" + if "out" in each: + pim_interface["jp_policy_out"] = policy_name + pim_interface["jp_type_out"] = ptype + elif "in" in each: + pim_interface["jp_policy_in"] = policy_name + pim_interface["jp_type_in"] = ptype + else: + pim_interface["jp_policy_in"] = policy_name + pim_interface["jp_policy_out"] = policy_name + pim_interface["jp_bidir"] = True + elif "neighbor-policy" in each: + pim_interface["neighbor_policy"] = re.search( + r"ip pim neighbor-policy(?: prefix-list)? (\S+)", each + ).group(1) + if "prefix-list" in each: + pim_interface["neighbor_type"] = "prefix" + else: + pim_interface["neighbor_type"] = "routemap" + elif "ah-md5" in each: + pim_interface["isauth"] = True + elif "sparse-mode" in each: + pim_interface["sparse"] = True + elif "bfd-instance" in each: + m = re.search( + r"ip pim bfd-instance(?P disable)?", each + ) + if m: + pim_interface["bfd"] = ( + "disable" if m.group("disable") else "enable" + ) + elif "border" in each: + pim_interface["border"] = True + elif "hello-interval" in each: + pim_interface["hello_interval"] = re.search( + r"ip pim hello-interval (\d+)", body + ).group(1) + elif "dr-priority" in each: + pim_interface["dr_prio"] = re.search( + r"ip pim dr-priority (\d+)", body + ).group(1) + + return pim_interface + + +def fix_delta(delta, existing): + for key in list(delta): + if key in ["dr_prio", "hello_interval", "sparse", "border"]: + if ( + delta.get(key) == PARAM_TO_DEFAULT_KEYMAP.get(key) + and existing.get(key) is None + ): + delta.pop(key) + return delta + + +def config_pim_interface(delta, existing, jp_bidir, isauth): + command = None + commands = [] + + delta = fix_delta(delta, existing) + + if jp_bidir: + if delta.get("jp_policy_in") or delta.get("jp_policy_out"): + if existing.get("jp_type_in") == "prefix": + command = "no ip pim jp-policy prefix-list {0}".format( + existing.get("jp_policy_in") + ) + else: + command = "no ip pim jp-policy {0}".format( + existing.get("jp_policy_in") + ) + if command: + commands.append(command) + + for k, v in delta.items(): + if k in [ + "bfd", + "dr_prio", + "hello_interval", + "hello_auth_key", + "border", + "sparse", + ]: + if k == "bfd": + command = BFD_KEYMAP[v] + elif v: + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(v) + elif k == "hello_auth_key": + if isauth: + command = "no ip pim hello-authentication ah-md5" + else: + command = "no " + PARAM_TO_COMMAND_KEYMAP.get(k).format(v) + + if command: + commands.append(command) + elif k in [ + "neighbor_policy", + "jp_policy_in", + "jp_policy_out", + "neighbor_type", + ]: + if k in ["neighbor_policy", "neighbor_type"]: + temp = delta.get("neighbor_policy") or existing.get( + "neighbor_policy" + ) + if delta.get("neighbor_type") == "prefix": + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) + elif delta.get("neighbor_type") == "routemap": + command = "ip pim neighbor-policy {0}".format(temp) + elif existing.get("neighbor_type") == "prefix": + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) + elif existing.get("neighbor_type") == "routemap": + command = "ip pim neighbor-policy {0}".format(temp) + elif k in ["jp_policy_in", "jp_type_in"]: + temp = delta.get("jp_policy_in") or existing.get( + "jp_policy_in" + ) + if delta.get("jp_type_in") == "prefix": + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) + elif delta.get("jp_type_in") == "routemap": + command = "ip pim jp-policy {0} in".format(temp) + elif existing.get("jp_type_in") == "prefix": + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) + elif existing.get("jp_type_in") == "routemap": + command = "ip pim jp-policy {0} in".format(temp) + elif k in ["jp_policy_out", "jp_type_out"]: + temp = delta.get("jp_policy_out") or existing.get( + "jp_policy_out" + ) + if delta.get("jp_type_out") == "prefix": + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) + elif delta.get("jp_type_out") == "routemap": + command = "ip pim jp-policy {0} out".format(temp) + elif existing.get("jp_type_out") == "prefix": + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) + elif existing.get("jp_type_out") == "routemap": + command = "ip pim jp-policy {0} out".format(temp) + if command: + commands.append(command) + command = None + + if "no ip pim sparse-mode" in commands: + # sparse is long-running on some platforms, process it last + commands.remove("no ip pim sparse-mode") + commands.append("no ip pim sparse-mode") + return commands + + +def get_pim_interface_defaults(): + + args = dict( + dr_prio=PARAM_TO_DEFAULT_KEYMAP.get("dr_prio"), + bfd=PARAM_TO_DEFAULT_KEYMAP.get("bfd"), + border=PARAM_TO_DEFAULT_KEYMAP.get("border"), + sparse=PARAM_TO_DEFAULT_KEYMAP.get("sparse"), + hello_interval=PARAM_TO_DEFAULT_KEYMAP.get("hello_interval"), + hello_auth_key=PARAM_TO_DEFAULT_KEYMAP.get("hello_auth_key"), + ) + + default = dict( + (param, value) for (param, value) in args.items() if value is not None + ) + + return default + + +def default_pim_interface_policies(existing, jp_bidir): + commands = [] + + if jp_bidir: + if existing.get("jp_policy_in") or existing.get("jp_policy_out"): + if existing.get("jp_type_in") == "prefix": + command = "no ip pim jp-policy prefix-list {0}".format( + existing.get("jp_policy_in") + ) + if command: + commands.append(command) + + elif not jp_bidir: + command = None + for k in existing: + if k == "jp_policy_in": + if existing.get("jp_policy_in"): + if existing.get("jp_type_in") == "prefix": + command = "no ip pim jp-policy prefix-list {0} in".format( + existing.get("jp_policy_in") + ) + else: + command = "no ip pim jp-policy {0} in".format( + existing.get("jp_policy_in") + ) + elif k == "jp_policy_out": + if existing.get("jp_policy_out"): + if existing.get("jp_type_out") == "prefix": + command = "no ip pim jp-policy prefix-list {0} out".format( + existing.get("jp_policy_out") + ) + else: + command = "no ip pim jp-policy {0} out".format( + existing.get("jp_policy_out") + ) + if command: + commands.append(command) + command = None + + if existing.get("neighbor_policy"): + command = "no ip pim neighbor-policy" + commands.append(command) + + return commands + + +def config_pim_interface_defaults(existing, jp_bidir, isauth): + command = [] + + # returns a dict + defaults = get_pim_interface_defaults() + delta = dict(set(defaults.items()).difference(existing.items())) + if delta: + # returns a list + command = config_pim_interface(delta, existing, jp_bidir, isauth) + comm = default_pim_interface_policies(existing, jp_bidir) + if comm: + for each in comm: + command.append(each) + + return command + + +def normalize_proposed_values(proposed): + keys = proposed.keys() + if "bfd" in keys: + # bfd is a tri-state string: enable, disable, default + proposed["bfd"] = proposed["bfd"].lower() + if "hello_interval" in keys: + proposed["hello_interval"] = str(proposed["hello_interval"] * 1000) + + +def main(): + argument_spec = dict( + interface=dict(type="str", required=True), + sparse=dict(type="bool", default=False), + dr_prio=dict(type="str"), + hello_auth_key=dict(type="str", no_log=True), + hello_interval=dict(type="int"), + jp_policy_out=dict(type="str"), + jp_policy_in=dict(type="str"), + jp_type_out=dict(type="str", choices=["prefix", "routemap"]), + jp_type_in=dict(type="str", choices=["prefix", "routemap"]), + bfd=dict(type="str", choices=["enable", "disable", "default"]), + border=dict(type="bool", default=False), + neighbor_policy=dict(type="str"), + neighbor_type=dict(type="str", choices=["prefix", "routemap"]), + state=dict( + type="str", + default="present", + choices=["absent", "default", "present"], + ), + ) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + state = module.params["state"] + interface = module.params["interface"] + jp_type_in = module.params["jp_type_in"] + jp_type_out = module.params["jp_type_out"] + jp_policy_in = module.params["jp_policy_in"] + jp_policy_out = module.params["jp_policy_out"] + neighbor_policy = module.params["neighbor_policy"] + neighbor_type = module.params["neighbor_type"] + + intf_type = get_interface_type(interface) + if get_interface_mode(interface, intf_type, module) == "layer2": + module.fail_json(msg="this module only works on Layer 3 interfaces.") + + if jp_policy_in: + if not jp_type_in: + module.fail_json( + msg="jp_type_in required when using jp_policy_in." + ) + if jp_policy_out: + if not jp_type_out: + module.fail_json( + msg="jp_type_out required when using jp_policy_out." + ) + if neighbor_policy: + if not neighbor_type: + module.fail_json( + msg="neighbor_type required when using neighbor_policy." + ) + + get_existing = get_pim_interface(module, interface) + existing, jp_bidir, isauth = local_existing(get_existing) + + args = PARAM_TO_COMMAND_KEYMAP.keys() + proposed = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + normalize_proposed_values(proposed) + + delta = dict(set(proposed.items()).difference(existing.items())) + + commands = [] + if state == "present": + if delta: + command = config_pim_interface(delta, existing, jp_bidir, isauth) + if command: + commands.append(command) + elif state == "default" or state == "absent": + defaults = config_pim_interface_defaults(existing, jp_bidir, isauth) + if defaults: + commands.append(defaults) + + if commands: + commands.insert(0, ["interface {0}".format(interface)]) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + if "configure" in cmds: + cmds.pop(0) + + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_rp_address.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_rp_address.py new file mode 100644 index 00000000..70c955c8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_pim_rp_address.py @@ -0,0 +1,256 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_pim_rp_address +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages configuration of an PIM static RP address instance. +description: +- Manages configuration of an Protocol Independent Multicast (PIM) static rendezvous + point (RP) address instance. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) is currently not supported on all platforms. +options: + rp_address: + description: + - Configures a Protocol Independent Multicast (PIM) static rendezvous point (RP) + address. Valid values are unicast addresses. + required: true + type: str + group_list: + description: + - Group range for static RP. Valid values are multicast addresses. + type: str + prefix_list: + description: + - Prefix list policy for static RP. Valid values are prefix-list policy names. + type: str + route_map: + description: + - Route map policy for static RP. Valid values are route-map policy names. + type: str + bidir: + description: + - Group range is treated in PIM bidirectional mode. + type: bool + state: + description: + - Specify desired state of the resource. + default: present + choices: + - present + - absent + type: str +""" +EXAMPLES = """ +- cisco.nxos.nxos_pim_rp_address: + rp_address: 10.1.1.20 + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["router bgp 65535", "vrf test", "router-id 192.0.2.1"] +""" + + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + + +def get_existing(module, args, gl): + existing = {} + config = str(get_config(module)) + address = module.params["rp_address"] + + pim_address_re = r"ip pim rp-address (?P.*)$" + for line in re.findall(pim_address_re, config, re.M): + + values = line.split() + if values[0] != address: + continue + if gl and "group-list" not in line: + continue + elif not gl and "group-list" in line: + if "224.0.0.0/4" not in line: # ignore default group-list + continue + + existing["bidir"] = existing.get("bidir") or "bidir" in line + if len(values) > 2: + value = values[2] + if values[1] == "route-map": + existing["route_map"] = value + elif values[1] == "prefix-list": + existing["prefix_list"] = value + elif values[1] == "group-list": + if value != "224.0.0.0/4": # ignore default group-list + existing["group_list"] = value + + return existing + + +def state_present(module, existing, proposed, candidate): + address = module.params["rp_address"] + command = "ip pim rp-address {0}".format(address) + if module.params["group_list"] and not proposed.get("group_list"): + command += " group-list " + module.params["group_list"] + if module.params["prefix_list"]: + if not proposed.get("prefix_list"): + command += " prefix-list " + module.params["prefix_list"] + if module.params["route_map"]: + if not proposed.get("route_map"): + command += " route-map " + module.params["route_map"] + commands = build_command(proposed, command) + if commands: + candidate.add(commands, parents=[]) + + +def build_command(param_dict, command): + for param in ["group_list", "prefix_list", "route_map"]: + if param_dict.get(param): + command += " {0} {1}".format( + param.replace("_", "-"), param_dict.get(param) + ) + if param_dict.get("bidir"): + command += " bidir" + return [command] + + +def state_absent(module, existing, candidate): + address = module.params["rp_address"] + + commands = [] + command = "no ip pim rp-address {0}".format(address) + if module.params["group_list"] == existing.get("group_list"): + commands = build_command(existing, command) + elif not module.params["group_list"]: + commands = [command] + + if commands: + candidate.add(commands, parents=[]) + + +def get_proposed(pargs, existing): + proposed = {} + + for key, value in pargs.items(): + if key != "rp_address": + if str(value).lower() == "true": + value = True + elif str(value).lower() == "false": + value = False + + if existing.get(key) != value: + proposed[key] = value + + return proposed + + +def main(): + argument_spec = dict( + rp_address=dict(required=True, type="str"), + group_list=dict(required=False, type="str"), + prefix_list=dict(required=False, type="str"), + route_map=dict(required=False, type="str"), + bidir=dict(required=False, type="bool"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + ) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[ + ["group_list", "route_map"], + ["group_list", "prefix_list"], + ["route_map", "prefix_list"], + ], + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False, "commands": [], "warnings": warnings} + + state = module.params["state"] + + args = ["rp_address", "group_list", "prefix_list", "route_map", "bidir"] + + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + if module.params["group_list"]: + existing = get_existing(module, args, True) + proposed = get_proposed(proposed_args, existing) + + else: + existing = get_existing(module, args, False) + proposed = get_proposed(proposed_args, existing) + + candidate = CustomNetworkConfig(indent=3) + if state == "present" and (proposed or not existing): + state_present(module, existing, proposed, candidate) + elif state == "absent" and existing: + state_absent(module, existing, candidate) + + if candidate: + candidate = candidate.items_text() + result["commands"] = candidate + result["changed"] = True + msgs = load_config(module, candidate, True) + if msgs: + for item in msgs: + if item: + if isinstance(item, dict): + err_str = item["clierror"] + else: + err_str = item + if "No policy was configured" in err_str: + if state == "absent": + addr = module.params["rp_address"] + new_cmd = "no ip pim rp-address {0}".format(addr) + load_config(module, new_cmd) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ping.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ping.py new file mode 100644 index 00000000..11f08a93 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_ping.py @@ -0,0 +1,237 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_ping +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Tests reachability using ping from Nexus switch. +description: +- Tests reachability using ping from switch to a remote destination. +- For a general purpose network module, see the M(ansible.netcommon.net_ping) module. +- For Windows targets, use the M(ansible.windows.win_ping) module instead. +- For targets running Python, use the M(ansible.builtin.ping) module instead. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +options: + dest: + description: + - IP address or hostname (resolvable by switch) of remote node. + required: true + type: str + count: + description: + - Number of packets to send. + default: 5 + type: int + source: + description: + - Source IP Address or hostname (resolvable by switch) + type: str + vrf: + description: + - Outgoing VRF. + type: str + state: + description: + - Determines if the expected result is success or fail. + choices: + - absent + - present + default: present + type: str +notes: +- For a general purpose network module, see the M(ansible.netcommon.net_ping) module. +- For Windows targets, use the M(ansible.windows.win_ping) module instead. +- For targets running Python, use the M(ansible.builtin.ping) module instead. +""" + +EXAMPLES = """ +- name: Test reachability to 8.8.8.8 using mgmt vrf + cisco.nxos.nxos_ping: + dest: 8.8.8.8 + vrf: management + host: 68.170.147.165 + +- name: Test reachability to a few different public IPs using mgmt vrf + cisco.nxos.nxos_ping: + dest: nxos_ping + vrf: management + host: 68.170.147.165 + with_items: + - 8.8.8.8 + - 4.4.4.4 + - 198.6.1.4 +""" + +RETURN = """ +commands: + description: Show the command sent + returned: always + type: list + sample: ["ping 8.8.8.8 count 2 vrf management"] +rtt: + description: Show RTT stats + returned: always + type: dict + sample: {"avg": 6.264, "max": 6.564, "min": 5.978} +packets_rx: + description: Packets successfully received + returned: always + type: int + sample: 2 +packets_tx: + description: Packets successfully transmitted + returned: always + type: int + sample: 2 +packet_loss: + description: Percentage of packets lost + returned: always + type: str + sample: "0.00%" +""" +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def get_summary(results_list, reference_point): + summary_string = results_list[reference_point + 1] + summary_list = summary_string.split(",") + + summary = dict( + packets_tx=int(summary_list[0].split("packets")[0].strip()), + packets_rx=int(summary_list[1].split("packets")[0].strip()), + packet_loss=summary_list[2].split("packet")[0].strip(), + ) + + if "bytes from" not in results_list[reference_point - 2]: + ping_pass = False + else: + ping_pass = True + + return summary, ping_pass + + +def get_rtt(results_list, packet_loss, location): + rtt = dict(min=None, avg=None, max=None) + + if packet_loss != "100.00%": + rtt_string = results_list[location] + base = rtt_string.split("=")[1] + rtt_list = base.split("/") + + rtt["min"] = float(rtt_list[0].lstrip()) + rtt["avg"] = float(rtt_list[1]) + rtt["max"] = float(rtt_list[2][:-3]) + + return rtt + + +def get_statistics_summary_line(response_as_list): + for each in response_as_list: + if "---" in each: + index = response_as_list.index(each) + return index + + +def get_ping_results(command, module): + cmd = {"command": command, "output": "text"} + ping = run_commands(module, [cmd])[0] + + if not ping: + module.fail_json( + msg="An unexpected error occurred. Check all params.", + command=command, + destination=module.params["dest"], + vrf=module.params["vrf"], + source=module.params["source"], + ) + + elif "can't bind to address" in ping: + module.fail_json(msg="Can't bind to source address.", command=command) + elif "bad context" in ping: + module.fail_json( + msg="Wrong VRF name inserted.", + command=command, + vrf=module.params["vrf"], + ) + else: + splitted_ping = ping.split("\n") + reference_point = get_statistics_summary_line(splitted_ping) + summary, ping_pass = get_summary(splitted_ping, reference_point) + rtt = get_rtt( + splitted_ping, summary["packet_loss"], reference_point + 2 + ) + + return (summary, rtt, ping_pass) + + +def main(): + argument_spec = dict( + dest=dict(required=True), + count=dict(required=False, default=5, type="int"), + vrf=dict(required=False), + source=dict(required=False), + state=dict( + required=False, choices=["present", "absent"], default="present" + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + destination = module.params["dest"] + state = module.params["state"] + + ping_command = "ping {0}".format(destination) + for command in ["count", "source", "vrf"]: + arg = module.params[command] + if arg: + ping_command += " {0} {1}".format(command, arg) + + summary, rtt, ping_pass = get_ping_results(ping_command, module) + + results = summary + results["rtt"] = rtt + results["commands"] = [ping_command] + + if ping_pass and state == "absent": + module.fail_json(msg="Ping succeeded unexpectedly") + elif not ping_pass and state == "present": + module.fail_json(msg="Ping failed unexpectedly") + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_reboot.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_reboot.py new file mode 100644 index 00000000..89fcb897 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_reboot.py @@ -0,0 +1,94 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_reboot +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Reboot a network device. +description: +- Reboot a network device. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- The module will fail due to timeout issues, but the reboot will be performed anyway. +options: + confirm: + description: + - Safeguard boolean. Set to true if you're sure you want to reboot. + required: false + default: false + type: bool +""" + +EXAMPLES = """ +- cisco.nxos.nxos_reboot: + confirm: true +""" + +RETURN = """ +rebooted: + description: Whether the device was instructed to reboot. + returned: success + type: bool + sample: true +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def reboot(module): + cmds = "terminal dont-ask ; reload" + opts = {"ignore_timeout": True} + load_config(module, cmds, False, opts) + + +def main(): + argument_spec = dict(confirm=dict(default=False, type="bool")) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = dict(changed=False, warnings=warnings) + + if module.params["confirm"]: + if not module.check_mode: + reboot(module) + results["changed"] = True + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rollback.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rollback.py new file mode 100644 index 00000000..fae27263 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rollback.py @@ -0,0 +1,134 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_rollback +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Set a checkpoint or rollback to a checkpoint. +description: +- This module offers the ability to set a configuration checkpoint file or rollback + to a configuration checkpoint file on Cisco NXOS switches. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Sometimes C(transport=nxapi) may cause a timeout error. +options: + checkpoint_file: + description: + - Name of checkpoint file to create. Mutually exclusive with rollback_to. + type: str + rollback_to: + description: + - Name of checkpoint file to rollback to. Mutually exclusive with checkpoint_file. + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_rollback: + checkpoint_file: backup.cfg + username: '{{ un }}' + password: '{{ pwd }}' + host: '{{ inventory_hostname }}' +- cisco.nxos.nxos_rollback: + rollback_to: backup.cfg + username: '{{ un }}' + password: '{{ pwd }}' + host: '{{ inventory_hostname }}' +""" + +RETURN = """ +filename: + description: The filename of the checkpoint/rollback file. + returned: success + type: str + sample: 'backup.cfg' +status: + description: Which operation took place and whether it was successful. + returned: success + type: str + sample: 'rollback executed' +""" + + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + run_commands, +) +from ansible.module_utils.basic import AnsibleModule + + +def checkpoint(filename, module): + commands = [ + {"command": "terminal dont-ask", "output": "text"}, + {"command": "checkpoint file %s" % filename, "output": "text"}, + ] + run_commands(module, commands) + + +def rollback(filename, module): + commands = [ + { + "command": "rollback running-config file %s" % filename, + "output": "text", + } + ] + run_commands(module, commands) + + +def main(): + argument_spec = dict( + checkpoint_file=dict(required=False), rollback_to=dict(required=False) + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[["checkpoint_file", "rollback_to"]], + supports_check_mode=False, + ) + + checkpoint_file = module.params["checkpoint_file"] + rollback_to = module.params["rollback_to"] + + status = None + filename = None + changed = False + + if checkpoint_file: + checkpoint(checkpoint_file, module) + status = "checkpoint file created" + elif rollback_to: + rollback(rollback_to, module) + status = "rollback executed" + changed = True + filename = rollback_to or checkpoint_file + + module.exit_json(changed=changed, status=status, filename=filename) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rpm.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rpm.py new file mode 100644 index 00000000..ac813c9a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_rpm.py @@ -0,0 +1,421 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_rpm +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Install patch or feature rpms on Cisco NX-OS devices. +description: +- Install software maintenance upgrade (smu) RPMS and 3rd party RPMS on Cisco NX-OS + devices. +version_added: 1.0.0 +author: Sai Chintalapudi (@saichint) +notes: +- Tested against NXOSv 7.0(3)I2(5), 7.0(3)I4(6), 7.0(3)I5(3), 7.0(3)I6(1), 7.0(3)I7(3) +- For patches, the minimum platform version needed is 7.0(3)I2(5) +- For feature rpms, the minimum platform version needed is 7.0(3)I6(1) +- The module manages the entire RPM lifecycle (Add, activate, commit, deactivate, + remove) +- For reload patches, this module is NOT idempotent until the patch is committed. +options: + pkg: + description: + - Name of the RPM package. + type: str + file_system: + description: + - The remote file system of the device. If omitted, devices that support a file_system + parameter will use their default values. + default: bootflash + type: str + aggregate: + description: + - List of RPM/patch definitions. + type: list + elements: dict + suboptions: + pkg: + description: + - Name of the RPM package. + required: True + type: str + file_system: + description: + - The remote file system of the device. If omitted, devices that support a file_system + parameter will use their default values. + type: str + state: + description: + - If the state is present, the rpm will be installed, If the state is absent, + it will be removed. + choices: + - present + - absent + type: str + state: + description: + - If the state is present, the rpm will be installed, If the state is absent, + it will be removed. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_rpm: + pkg: nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000.rpm +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["install add bootflash:nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000.rpm forced", + "install activate nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000 forced", + "install commit nxos.sample-n9k_ALL-1.0.0-7.0.3.I7.3.lib32_n9000"] +""" + + +import time + +from copy import deepcopy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) + + +def execute_show_command(command, module): + iteration = 0 + cmds = [{"command": command, "output": "text"}] + + while iteration < 10: + body = run_commands(module, cmds)[0] + if body: + return body + else: + time.sleep(2) + iteration += 1 + + +def remote_file_exists(module, dst, file_system): + command = "dir {0}:/{1}".format(file_system, dst) + body = execute_show_command(command, module) + if "No such file" in body: + return False + return True + + +def config_cmd_operation(module, cmd): + iteration = 0 + while iteration < 10: + msg = load_config(module, [cmd], True) + if msg: + if ( + "another install operation is in progress" in msg[0].lower() + or "failed" in msg[0].lower() + ): + time.sleep(2) + iteration += 1 + else: + return + else: + return + + +def validate_operation(module, show_cmd, cfg_cmd, pkg, pkg_not_present): + iteration = 0 + while iteration < 10: + body = execute_show_command(show_cmd, module) + if pkg_not_present: + if pkg not in body: + return + else: + if pkg in body: + return + time.sleep(2) + iteration += 1 + + err = 'Operation "{0}" Failed'.format(cfg_cmd) + module.fail_json(msg=err) + + +def add_operation(module, show_cmd, file_system, full_pkg, pkg): + cmd = "install add {0}:{1}".format(file_system, full_pkg) + config_cmd_operation(module, cmd) + validate_operation(module, show_cmd, cmd, pkg, False) + return cmd + + +def activate_operation(module, show_cmd, pkg): + cmd = "install activate {0} forced".format(pkg) + config_cmd_operation(module, cmd) + validate_operation(module, show_cmd, cmd, pkg, False) + return cmd + + +def activate_reload(module, pkg, flag): + iteration = 0 + if flag: + cmd = "install activate {0} forced".format(pkg) + else: + cmd = "install deactivate {0} forced".format(pkg) + opts = {"ignore_timeout": True} + while iteration < 10: + msg = load_config(module, [cmd], True, opts) + if msg: + if isinstance(msg[0], int): + if msg[0] == -32603: + return cmd + elif isinstance(msg[0], str): + if "socket is closed" in msg[0].lower(): + return cmd + if ( + "another install operation is in progress" + in msg[0].lower() + or "failed" in msg[0].lower() + ): + time.sleep(2) + iteration += 1 + + +def commit_operation(module, show_cmd, pkg, flag): + cmd = "install commit {0}".format(pkg) + config_cmd_operation(module, cmd) + validate_operation(module, show_cmd, cmd, pkg, flag) + return cmd + + +def deactivate_operation(module, show_cmd, pkg, flag): + cmd = "install deactivate {0} forced".format(pkg) + config_cmd_operation(module, cmd) + validate_operation(module, show_cmd, cmd, pkg, flag) + return cmd + + +def terminal_operation(module, config): + if config: + cmd = "terminal dont-ask" + else: + cmd = "no terminal dont-ask" + config_cmd_operation(module, cmd) + return cmd + + +def remove_operation(module, show_cmd, pkg): + commands = [] + commands.append(terminal_operation(module, True)) + cmd = "install remove {0} forced".format(pkg) + config_cmd_operation(module, cmd) + validate_operation(module, show_cmd, cmd, pkg, True) + commands.append(cmd) + commands.append(terminal_operation(module, False)) + return commands + + +def install_remove_rpm(module, full_pkg, file_system, state): + commands = [] + reload_patch = False + + splitted_pkg = full_pkg.split(".") + pkg = ".".join(splitted_pkg[0:-1]) + + show_inactive = "show install inactive" + show_active = "show install active" + show_commit = "show install committed" + show_patches = "show install patches" + show_pkg_info = "show install pkg-info {0}".format(pkg) + + if state == "present": + inactive_body = execute_show_command(show_inactive, module) + active_body = execute_show_command(show_active, module) + + if pkg not in inactive_body and pkg not in active_body: + commands.append( + add_operation( + module, show_inactive, file_system, full_pkg, pkg + ) + ) + + patch_type_body = execute_show_command(show_pkg_info, module) + if patch_type_body and "Patch Type : reload" in patch_type_body: + # This is reload smu/patch rpm + reload_patch = True + + if pkg not in active_body: + if reload_patch: + commands.append(activate_reload(module, pkg, True)) + return commands + else: + commands.append(activate_operation(module, show_active, pkg)) + + commit_body = execute_show_command(show_commit, module) + if pkg not in commit_body: + patch_body = execute_show_command(show_patches, module) + if pkg in patch_body: + # This is smu/patch rpm + commands.append( + commit_operation(module, show_commit, pkg, False) + ) + else: + err = 'Operation "install activate {0} forced" Failed'.format( + pkg + ) + module.fail_json(msg=err) + + else: + commit_body = execute_show_command(show_commit, module) + active_body = execute_show_command(show_active, module) + + patch_type_body = execute_show_command(show_pkg_info, module) + if patch_type_body and "Patch Type : reload" in patch_type_body: + # This is reload smu/patch rpm + reload_patch = True + + if pkg in commit_body and pkg in active_body: + if reload_patch: + commands.append(activate_reload(module, pkg, False)) + return commands + else: + commands.append( + deactivate_operation(module, show_active, pkg, True) + ) + commit_body = execute_show_command(show_commit, module) + if pkg in commit_body: + # This is smu/patch rpm + commands.append( + commit_operation(module, show_commit, pkg, True) + ) + commands.extend(remove_operation(module, show_inactive, pkg)) + + elif pkg in commit_body: + # This is smu/patch rpm + commands.append(commit_operation(module, show_commit, pkg, True)) + commands.extend(remove_operation(module, show_inactive, pkg)) + + elif pkg in active_body: + # This is smu/patch rpm + if reload_patch: + commands.append(activate_reload(module, pkg, False)) + return commands + else: + commands.append( + deactivate_operation(module, show_inactive, pkg, False) + ) + commands.extend(remove_operation(module, show_inactive, pkg)) + + else: + inactive_body = execute_show_command(show_inactive, module) + if pkg in inactive_body: + commands.extend(remove_operation(module, show_inactive, pkg)) + + return commands + + +def main(): + element_spec = dict( + pkg=dict(type="str"), + file_system=dict(type="str", default="bootflash"), + state=dict(choices=["absent", "present"], default="present"), + ) + + aggregate_spec = deepcopy(element_spec) + aggregate_spec["pkg"] = dict(required=True) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec) + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + required_one_of = [["pkg", "aggregate"]] + mutually_exclusive = [["pkg", "aggregate"]] + + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + supports_check_mode=False, + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + aggregate = module.params.get("aggregate") + objects = [] + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + objects.append(d) + else: + objects.append( + { + "pkg": module.params["pkg"], + "file_system": module.params["file_system"], + "state": module.params["state"], + } + ) + + for obj in objects: + if obj["state"] == "present": + remote_exists = remote_file_exists( + module, obj["pkg"], file_system=obj["file_system"] + ) + + if not remote_exists: + module.fail_json( + msg="The requested package doesn't exist on the device" + ) + + cmds = install_remove_rpm( + module, obj["pkg"], obj["file_system"], obj["state"] + ) + + if cmds: + results["changed"] = True + results["commands"].extend(cmds) + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_smu.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_smu.py new file mode 100644 index 00000000..4f674a6d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_smu.py @@ -0,0 +1,163 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_smu +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-10-01) Perform SMUs on Cisco NX-OS devices. +description: +- Perform software maintenance upgrades (SMUs) on Cisco NX-OS devices. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +deprecated: + alternative: nxos_rpm + why: Updated modules released with more functionality. + removed_at_date: '2022-10-01' +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- The module can only activate and commit a package, not remove or deactivate it. +- Use C(transport=nxapi) to avoid connection timeout +options: + pkg: + description: + - Name of the remote package. + required: true + type: str + file_system: + description: + - The remote file system of the device. If omitted, devices that support a file_system + parameter will use their default values. + default: 'bootflash:' + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_smu: + pkg: nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["install add bootflash:nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm", + "install activate bootflash:nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm force", + "install commit bootflash:nxos.CSCuz65185-n9k_EOR-1.0.0-7.0.3.I2.2d.lib32_n9000.rpm"] +""" + + +import time + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + cmds = [{"command": command, "output": "text"}] + + return run_commands(module, cmds) + + +def remote_file_exists(module, dst, file_system="bootflash:"): + command = "dir {0}/{1}".format(file_system, dst) + body = execute_show_command(command, module) + if "No such file" in body[0]: + return False + return True + + +def apply_patch(module, commands): + for command in commands: + load_config(module, [command]) + time.sleep(5) + + +def get_commands(module, pkg, file_system): + commands = [] + splitted_pkg = pkg.split(".") + fixed_pkg = ".".join(splitted_pkg[0:-1]) + + command = "show install inactive" + inactive_body = execute_show_command(command, module) + + command = "show install active" + active_body = execute_show_command(command, module) + + if fixed_pkg not in inactive_body[0] and fixed_pkg not in active_body[0]: + commands.append("install add {0}{1}".format(file_system, pkg)) + + if fixed_pkg not in active_body[0]: + commands.append("install activate {0} force".format(pkg)) + command = "show install committed" + install_body = execute_show_command(command, module) + if fixed_pkg not in install_body[0]: + commands.append("install commit {0}".format(pkg)) + + return commands + + +def main(): + argument_spec = dict( + pkg=dict(required=True), + file_system=dict(required=False, default="bootflash:"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + pkg = module.params["pkg"] + file_system = module.params["file_system"] + remote_exists = remote_file_exists(module, pkg, file_system=file_system) + + if not remote_exists: + module.fail_json( + msg="The requested package doesn't exist on the device" + ) + + commands = get_commands(module, pkg, file_system) + if commands: + results["changed"] = True + if not module.check_mode: + apply_patch(module, commands) + if "configure" in commands: + commands.pop(0) + results["commands"] = commands + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snapshot.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snapshot.py new file mode 100644 index 00000000..864977f6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snapshot.py @@ -0,0 +1,425 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +DOCUMENTATION = """ +module: nxos_snapshot +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manage snapshots of the running states of selected features. +description: +- Create snapshots of the running states of selected features, add new show commands + for snapshot creation, delete and compare existing snapshots. +version_added: 1.0.0 +author: +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(transport=cli) may cause timeout errors. +- The C(element_key1) and C(element_key2) parameter specify the tags used to distinguish + among row entries. In most cases, only the element_key1 parameter needs to specified + to be able to distinguish among row entries. +- C(action=compare) will always store a comparison report on a local file. +options: + action: + description: + - Define what snapshot action the module would perform. + required: true + choices: + - add + - compare + - create + - delete + - delete_all + type: str + snapshot_name: + description: + - Snapshot name, to be used when C(action=create) or C(action=delete). + type: str + description: + description: + - Snapshot description to be used when C(action=create). + type: str + snapshot1: + description: + - First snapshot to be used when C(action=compare). + type: str + snapshot2: + description: + - Second snapshot to be used when C(action=compare). + type: str + comparison_results_file: + description: + - Name of the file where snapshots comparison will be stored when C(action=compare). + type: str + compare_option: + description: + - Snapshot options to be used when C(action=compare). + choices: + - summary + - ipv4routes + - ipv6routes + type: str + section: + description: + - Used to name the show command output, to be used when C(action=add). + type: str + show_command: + description: + - Specify a new show command, to be used when C(action=add). + type: str + row_id: + description: + - Specifies the tag of each row entry of the show command's XML output, to be + used when C(action=add). + type: str + element_key1: + description: + - Specify the tags used to distinguish among row entries, to be used when C(action=add). + type: str + element_key2: + description: + - Specify the tags used to distinguish among row entries, to be used when C(action=add). + type: str + save_snapshot_locally: + description: + - Specify to locally store a new created snapshot, to be used when C(action=create). + type: bool + default: no + path: + description: + - Specify the path of the file where new created snapshot or snapshots comparison + will be stored, to be used when C(action=create) and C(save_snapshot_locally=true) + or C(action=compare). + default: ./ + type: str +""" + +EXAMPLES = """ +# Create a snapshot and store it locally +- cisco.nxos.nxos_snapshot: + action: create + snapshot_name: test_snapshot + description: Done with Ansible + save_snapshot_locally: true + path: /home/user/snapshots/ + +# Delete a snapshot +- cisco.nxos.nxos_snapshot: + action: delete + snapshot_name: test_snapshot + +# Delete all existing snapshots +- cisco.nxos.nxos_snapshot: + action: delete_all + +# Add a show command for snapshots creation +- cisco.nxos.nxos_snapshot: + section: myshow + show_command: show ip interface brief + row_id: ROW_intf + element_key1: intf-name + +# Compare two snapshots +- cisco.nxos.nxos_snapshot: + action: compare + snapshot1: pre_snapshot + snapshot2: post_snapshot + comparison_results_file: compare_snapshots.txt + compare_option: summary + path: ../snapshot_reports/ +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: verbose mode + type: list + sample: ["snapshot create post_snapshot Post-snapshot"] +""" + +import os +import re + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) + + +def execute_show_command(command, module): + command = [{"command": command, "output": "text"}] + + return run_commands(module, command) + + +def get_existing(module): + existing = [] + command = "show snapshots" + + body = execute_show_command(command, module)[0] + if body: + split_body = body.splitlines() + snapshot_regex = ( + r"(?P\S+)\s+(?P\w+\s+\w+\s+\d+\s+\d+" + r":\d+:\d+\s+\d+)\s+(?P.*)" + ) + for snapshot in split_body: + temp = {} + try: + match_snapshot = re.match(snapshot_regex, snapshot, re.DOTALL) + snapshot_group = match_snapshot.groupdict() + temp["name"] = snapshot_group["name"] + temp["date"] = snapshot_group["date"] + temp["description"] = snapshot_group["description"] + existing.append(temp) + except AttributeError: + pass + + return existing + + +def action_create(module, existing_snapshots): + commands = list() + exist = False + for snapshot in existing_snapshots: + if module.params["snapshot_name"] == snapshot["name"]: + exist = True + + if exist is False: + commands.append( + "snapshot create {0} {1}".format( + module.params["snapshot_name"], module.params["description"] + ) + ) + + return commands + + +def action_add(module, existing_snapshots): + commands = list() + command = "show snapshot sections" + sections = [] + body = execute_show_command(command, module)[0] + + if body: + section_regex = r".*\[(?P
\S+)\].*" + split_body = body.split("\n\n") + for section in split_body: + temp = {} + for line in section.splitlines(): + try: + match_section = re.match(section_regex, section, re.DOTALL) + temp["section"] = match_section.groupdict()["section"] + except (AttributeError, KeyError): + pass + + if "show command" in line: + temp["show_command"] = line.split("show command: ")[1] + elif "row id" in line: + temp["row_id"] = line.split("row id: ")[1] + elif "key1" in line: + temp["element_key1"] = line.split("key1: ")[1] + elif "key2" in line: + temp["element_key2"] = line.split("key2: ")[1] + + if temp: + sections.append(temp) + + proposed = { + "section": module.params["section"], + "show_command": module.params["show_command"], + "row_id": module.params["row_id"], + "element_key1": module.params["element_key1"], + "element_key2": module.params["element_key2"] or "-", + } + + if proposed not in sections: + if module.params["element_key2"]: + commands.append( + 'snapshot section add {0} "{1}" {2} {3} {4}'.format( + module.params["section"], + module.params["show_command"], + module.params["row_id"], + module.params["element_key1"], + module.params["element_key2"], + ) + ) + else: + commands.append( + 'snapshot section add {0} "{1}" {2} {3}'.format( + module.params["section"], + module.params["show_command"], + module.params["row_id"], + module.params["element_key1"], + ) + ) + + return commands + + +def action_compare(module, existing_snapshots): + command = "show snapshot compare {0} {1}".format( + module.params["snapshot1"], module.params["snapshot2"] + ) + + if module.params["compare_option"]: + command += " {0}".format(module.params["compare_option"]) + + body = execute_show_command(command, module)[0] + return body + + +def action_delete(module, existing_snapshots): + commands = list() + + exist = False + for snapshot in existing_snapshots: + if module.params["snapshot_name"] == snapshot["name"]: + exist = True + + if exist: + commands.append( + "snapshot delete {0}".format(module.params["snapshot_name"]) + ) + + return commands + + +def action_delete_all(module, existing_snapshots): + commands = list() + if existing_snapshots: + commands.append("snapshot delete all") + return commands + + +def invoke(name, *args, **kwargs): + func = globals().get(name) + if func: + return func(*args, **kwargs) + + +def write_on_file(content, filename, module): + path = module.params["path"] + if path[-1] != "/": + path += "/" + filepath = "{0}{1}".format(path, filename) + try: + report = open(filepath, "w") + report.write(content) + report.close() + except Exception: + module.fail_json(msg="Error while writing on file.") + + return filepath + + +def main(): + argument_spec = dict( + action=dict( + required=True, + choices=["create", "add", "compare", "delete", "delete_all"], + ), + snapshot_name=dict(type="str"), + description=dict(type="str"), + snapshot1=dict(type="str"), + snapshot2=dict(type="str"), + compare_option=dict(choices=["summary", "ipv4routes", "ipv6routes"]), + comparison_results_file=dict(type="str"), + section=dict(type="str"), + show_command=dict(type="str"), + row_id=dict(type="str"), + element_key1=dict(type="str"), + element_key2=dict(type="str"), + save_snapshot_locally=dict(type="bool", default=False), + path=dict(type="str", default="./"), + ) + + argument_spec.update(nxos_argument_spec) + + required_if = [ + ( + "action", + "compare", + ["snapshot1", "snapshot2", "comparison_results_file"], + ), + ("action", "create", ["snapshot_name", "description"]), + ( + "action", + "add", + ["section", "show_command", "row_id", "element_key1"], + ), + ("action", "delete", ["snapshot_name"]), + ] + + module = AnsibleModule( + argument_spec=argument_spec, + required_if=required_if, + supports_check_mode=True, + ) + + action = module.params["action"] + comparison_results_file = module.params["comparison_results_file"] + + if not os.path.isdir(module.params["path"]): + module.fail_json( + msg="{0} is not a valid directory name.".format( + module.params["path"] + ) + ) + + existing_snapshots = invoke("get_existing", module) + action_results = invoke("action_%s" % action, module, existing_snapshots) + + result = {"changed": False, "commands": []} + + if not module.check_mode: + if action == "compare": + result["commands"] = [] + + if module.params["path"] and comparison_results_file: + snapshot1 = module.params["snapshot1"] + snapshot2 = module.params["snapshot2"] + compare_option = module.params["compare_option"] + command = "show snapshot compare {0} {1}".format( + snapshot1, snapshot2 + ) + if compare_option: + command += " {0}".format(compare_option) + content = execute_show_command(command, module)[0] + if content: + write_on_file(content, comparison_results_file, module) + else: + if action_results: + load_config(module, action_results) + result["commands"] = action_results + result["changed"] = True + + if ( + action == "create" + and module.params["path"] + and module.params["save_snapshot_locally"] + ): + command = "show snapshot dump {0} | json".format( + module.params["snapshot_name"] + ) + content = execute_show_command(command, module)[0] + if content: + write_on_file( + str(content), module.params["snapshot_name"], module + ) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_community.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_community.py new file mode 100644 index 00000000..bb3d2512 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_community.py @@ -0,0 +1,253 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_snmp_community +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages SNMP community configs. +description: +- Manages SNMP community configuration. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +options: + community: + description: + - Case-sensitive community string. + required: true + type: str + access: + description: + - Access type for community. + choices: + - ro + - rw + type: str + group: + description: + - Group to which the community belongs. + type: str + acl: + description: + - ACL name to filter snmp requests or keyword 'default'. + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# ensure snmp community is configured +- cisco.nxos.nxos_snmp_community: + community: TESTING7 + group: network-operator + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["snmp-server community TESTING7 group network-operator"] +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + if "show run" not in command: + output = "json" + else: + output = "text" + cmds = [{"command": command, "output": output}] + + body = run_commands(module, cmds) + return body + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_snmp_groups(module): + data = execute_show_command("show snmp group", module)[0] + group_list = [] + + try: + group_table = data["TABLE_role"]["ROW_role"] + for group in group_table: + group_list.append(group["role_name"]) + except (KeyError, AttributeError): + pass + + return group_list + + +def get_snmp_community(module, name): + command = "show run snmp all | grep word-exp {0}".format(name) + data = execute_show_command(command, module)[0] + community_dict = {} + + if not data: + return community_dict + + community_re = r"snmp-server community (\S+)" + mo = re.search(community_re, data) + if mo: + community_name = mo.group(1) + else: + return community_dict + + community_dict["group"] = None + group_re = r"snmp-server community {0} group (\S+)".format(community_name) + mo = re.search(group_re, data) + if mo: + community_dict["group"] = mo.group(1) + + community_dict["acl"] = None + acl_re = r"snmp-server community {0} use-acl (\S+)".format(community_name) + mo = re.search(acl_re, data) + if mo: + community_dict["acl"] = mo.group(1) + + return community_dict + + +def config_snmp_community(delta, community): + CMDS = { + "group": "snmp-server community {0} group {group}", + "acl": "snmp-server community {0} use-acl {acl}", + "no_acl": "no snmp-server community {0} use-acl {no_acl}", + } + commands = [] + for k in delta.keys(): + cmd = CMDS.get(k).format(community, **delta) + if cmd: + if "group" in cmd: + commands.insert(0, cmd) + else: + commands.append(cmd) + cmd = None + return commands + + +def main(): + argument_spec = dict( + community=dict(required=True, type="str"), + access=dict(choices=["ro", "rw"]), + group=dict(type="str"), + acl=dict(type="str"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=[["access", "group"]], + mutually_exclusive=[["access", "group"]], + supports_check_mode=True, + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + access = module.params["access"] + group = module.params["group"] + community = module.params["community"] + acl = module.params["acl"] + state = module.params["state"] + + if access: + if access == "ro": + group = "network-operator" + elif access == "rw": + group = "network-admin" + + # group check - ensure group being configured exists on the device + configured_groups = get_snmp_groups(module) + + if group not in configured_groups: + module.fail_json( + msg="Group not on switch. Please add before moving forward" + ) + + existing = get_snmp_community(module, community) + args = dict(group=group, acl=acl) + proposed = dict((k, v) for k, v in args.items() if v is not None) + delta = dict(set(proposed.items()).difference(existing.items())) + if delta.get("acl") == "default": + delta.pop("acl") + if existing.get("acl"): + delta["no_acl"] = existing.get("acl") + + commands = [] + + if state == "absent": + if existing: + command = "no snmp-server community {0}".format(community) + commands.append(command) + elif state == "present": + if delta: + command = config_snmp_community(dict(delta), community) + commands.append(command) + + cmds = flatten_list(commands) + + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_contact.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_contact.py new file mode 100644 index 00000000..eacba94c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_contact.py @@ -0,0 +1,151 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_snmp_contact +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages SNMP contact info. +description: +- Manages SNMP contact information. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the contact configuration if it is configured. +options: + contact: + description: + - Contact information. + required: true + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# ensure snmp contact is configured +- cisco.nxos.nxos_snmp_contact: + contact: Test + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["snmp-server contact New_Test"] +""" + + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + command = {"command": command, "output": "text"} + + return run_commands(module, command) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_snmp_contact(module): + contact = {} + contact_regex = r"^\s*snmp-server\scontact\s(?P.+)$" + + body = execute_show_command("show run snmp", module)[0] + match_contact = re.search(contact_regex, body, re.M) + if match_contact: + contact["contact"] = match_contact.group("contact") + + return contact + + +def main(): + argument_spec = dict( + contact=dict(required=True, type="str"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + contact = module.params["contact"] + state = module.params["state"] + + existing = get_snmp_contact(module) + commands = [] + + if state == "absent": + if existing and existing["contact"] == contact: + commands.append("no snmp-server contact") + elif state == "present": + if not existing or existing["contact"] != contact: + commands.append("snmp-server contact {0}".format(contact)) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_host.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_host.py new file mode 100644 index 00000000..15541103 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_host.py @@ -0,0 +1,521 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_snmp_host +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages SNMP host configuration. +description: +- Manages SNMP host configuration parameters. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- C(state=absent) removes the host configuration if it is configured. +options: + snmp_host: + description: + - IP address of hostname of target host. + required: true + type: str + version: + description: + - SNMP version. If this is not specified, v1 is used. + choices: + - v1 + - v2c + - v3 + type: str + v3: + description: + - Use this when verion is v3. SNMPv3 Security level. + choices: + - noauth + - auth + - priv + type: str + community: + description: + - Community string or v3 username. + type: str + udp: + description: + - UDP port number (0-65535). + default: 162 + type: str + snmp_type: + description: + - type of message to send to host. If this is not specified, trap type is used. + choices: + - trap + - inform + type: str + vrf: + description: + - VRF to use to source traffic to source. If state = absent, the vrf is removed. + type: str + vrf_filter: + description: + - Name of VRF to filter. If state = absent, the vrf is removed from the filter. + type: str + src_intf: + description: + - Source interface. Must be fully qualified interface name. If state = absent, + the interface is removed. + type: str + state: + description: + - Manage the state of the resource. If state = present, the host is added to the + configuration. If only vrf and/or vrf_filter and/or src_intf are given, they + will be added to the existing host configuration. If state = absent, the host + is removed if community parameter is given. It is possible to remove only vrf + and/or src_int and/or vrf_filter by providing only those parameters and no community + parameter. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# ensure snmp host is configured +- cisco.nxos.nxos_snmp_host: + snmp_host: 192.0.2.3 + community: TESTING + state: present +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["snmp-server host 192.0.2.3 filter-vrf another_test_vrf"] +""" + + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + command = {"command": command, "output": "json"} + + return run_commands(module, command) + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + value = table.get(key) + if value: + new_dict[new_key] = str(value) + else: + new_dict[new_key] = value + return new_dict + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_snmp_host(host, udp, module): + body = execute_show_command("show snmp host", module) + + host_map = { + "port": "udp", + "version": "version", + "level": "v3", + "type": "snmp_type", + "secname": "community", + } + + host_map_5k = { + "port": "udp", + "version": "version", + "sec_level": "v3", + "notif_type": "snmp_type", + "commun_or_user": "community", + } + + resource = {} + + if body: + try: + resource_table = body[0]["TABLE_host"]["ROW_host"] + + if isinstance(resource_table, dict): + resource_table = [resource_table] + + for each in resource_table: + key = str(each["host"]) + "_" + str(each["port"]).strip() + src = each.get("src_intf") + host_resource = apply_key_map(host_map, each) + + if src: + host_resource["src_intf"] = src + if re.search(r"interface:", src): + host_resource["src_intf"] = src.split(":")[1].strip() + + vrf_filt = each.get("TABLE_vrf_filters") + if vrf_filt: + vrf_filter = ( + vrf_filt["ROW_vrf_filters"]["vrf_filter"] + .split(":")[1] + .split(",") + ) + filters = [vrf.strip() for vrf in vrf_filter] + host_resource["vrf_filter"] = filters + + vrf = each.get("vrf") + if vrf: + host_resource["vrf"] = vrf.split(":")[1].strip() + resource[key] = host_resource + except KeyError: + # Handle the 5K case + try: + resource_table = body[0]["TABLE_hosts"]["ROW_hosts"] + + if isinstance(resource_table, dict): + resource_table = [resource_table] + + for each in resource_table: + key = ( + str(each["address"]) + "_" + str(each["port"]).strip() + ) + src = each.get("src_intf") + host_resource = apply_key_map(host_map_5k, each) + + if src: + host_resource["src_intf"] = src + if re.search(r"interface:", src): + host_resource["src_intf"] = src.split(":")[ + 1 + ].strip() + + vrf = each.get("use_vrf_name") + if vrf: + host_resource["vrf"] = vrf.strip() + + vrf_filt = each.get("TABLE_filter_vrf") + if vrf_filt: + vrf_filter = vrf_filt["ROW_filter_vrf"][ + "filter_vrf_name" + ].split(",") + filters = [vrf.strip() for vrf in vrf_filter] + host_resource["vrf_filter"] = filters + + resource[key] = host_resource + except (KeyError, AttributeError, TypeError): + return resource + except (AttributeError, TypeError): + return resource + + find = resource.get(host + "_" + udp) + + if find: + fix_find = {} + for (key, value) in find.items(): + if isinstance(value, str): + fix_find[key] = value.strip() + else: + fix_find[key] = value + return fix_find + + return {} + + +def remove_snmp_host(host, udp, existing): + commands = [] + if existing["version"] == "v3": + existing["version"] = "3" + command = "no snmp-server host {0} {snmp_type} version \ + {version} {v3} {community} udp-port {1}".format( + host, udp, **existing + ) + + elif existing["version"] == "v2c": + existing["version"] = "2c" + command = "no snmp-server host {0} {snmp_type} version \ + {version} {community} udp-port {1}".format( + host, udp, **existing + ) + + elif existing["version"] == "v1": + existing["version"] = "1" + command = "no snmp-server host {0} {snmp_type} version \ + {version} {community} udp-port {1}".format( + host, udp, **existing + ) + + if command: + commands.append(command) + return commands + + +def remove_vrf(host, udp, proposed, existing): + commands = [] + if existing.get("vrf"): + commands.append( + "no snmp-server host {0} use-vrf \ + {1} udp-port {2}".format( + host, proposed.get("vrf"), udp + ) + ) + return commands + + +def remove_filter(host, udp, proposed, existing): + commands = [] + if existing.get("vrf_filter"): + if proposed.get("vrf_filter") in existing.get("vrf_filter"): + commands.append( + "no snmp-server host {0} filter-vrf \ + {1} udp-port {2}".format( + host, proposed.get("vrf_filter"), udp + ) + ) + return commands + + +def remove_src(host, udp, proposed, existing): + commands = [] + if existing.get("src_intf"): + commands.append( + "no snmp-server host {0} source-interface \ + {1} udp-port {2}".format( + host, proposed.get("src_intf"), udp + ) + ) + return commands + + +def config_snmp_host(delta, udp, proposed, existing, module): + commands = [] + command_builder = [] + host = proposed["snmp_host"] + cmd = "snmp-server host {0}".format(proposed["snmp_host"]) + + snmp_type = delta.get("snmp_type") + version = delta.get("version") + ver = delta.get("v3") + community = delta.get("community") + + command_builder.append(cmd) + if any([snmp_type, version, ver, community]): + type_string = snmp_type or existing.get("type") + if type_string: + command_builder.append(type_string) + + version = version or existing.get("version") + if version: + if version == "v1": + vn = "1" + elif version == "v2c": + vn = "2c" + elif version == "v3": + vn = "3" + + version_string = "version {0}".format(vn) + command_builder.append(version_string) + + if ver: + ver_string = ver or existing.get("v3") + command_builder.append(ver_string) + + if community: + community_string = community or existing.get("community") + command_builder.append(community_string) + + udp_string = " udp-port {0}".format(udp) + command_builder.append(udp_string) + + cmd = " ".join(command_builder) + + commands.append(cmd) + + CMDS = { + "vrf_filter": "snmp-server host {0} filter-vrf {vrf_filter} udp-port {1}", + "vrf": "snmp-server host {0} use-vrf {vrf} udp-port {1}", + "src_intf": "snmp-server host {0} source-interface {src_intf} udp-port {1}", + } + + for key in delta: + command = CMDS.get(key) + if command: + cmd = command.format(host, udp, **delta) + commands.append(cmd) + return commands + + +def main(): + argument_spec = dict( + snmp_host=dict(required=True, type="str"), + community=dict(type="str"), + udp=dict(type="str", default="162"), + version=dict(choices=["v1", "v2c", "v3"]), + src_intf=dict(type="str"), + v3=dict(choices=["noauth", "auth", "priv"]), + vrf_filter=dict(type="str"), + vrf=dict(type="str"), + snmp_type=dict(choices=["trap", "inform"]), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + snmp_host = module.params["snmp_host"] + community = module.params["community"] + udp = module.params["udp"] + version = module.params["version"] + src_intf = module.params["src_intf"] + v3 = module.params["v3"] + vrf_filter = module.params["vrf_filter"] + vrf = module.params["vrf"] + snmp_type = module.params["snmp_type"] + state = module.params["state"] + + existing = get_snmp_host(snmp_host, udp, module) + + if version is None: + if existing: + version = existing.get("version") + else: + version = "v1" + + if snmp_type is None: + if existing: + snmp_type = existing.get("snmp_type") + else: + snmp_type = "trap" + + if v3 is None: + if version == "v3" and existing: + v3 = existing.get("v3") + + if snmp_type == "inform" and version == "v1": + module.fail_json(msg="inform requires snmp v2c or v3") + + if (version == "v1" or version == "v2c") and v3: + module.fail_json( + msg='param: "v3" should not be used when ' + "using version v1 or v2c" + ) + + if not any([vrf_filter, vrf, src_intf]): + if not all([snmp_type, version, community, udp]): + module.fail_json( + msg="when not configuring options like " + "vrf_filter, vrf, and src_intf," + "the following params are required: " + "type, version, community" + ) + + if version == "v3" and v3 is None: + module.fail_json( + msg="when using version=v3, the param v3 " + "(options: auth, noauth, priv) is also required" + ) + + # existing returns the list of vrfs configured for a given host + # checking to see if the proposed is in the list + store = existing.get("vrf_filter") + if existing and store: + if vrf_filter not in existing["vrf_filter"]: + existing["vrf_filter"] = None + else: + existing["vrf_filter"] = vrf_filter + commands = [] + + args = dict( + community=community, + snmp_host=snmp_host, + udp=udp, + version=version, + src_intf=src_intf, + vrf_filter=vrf_filter, + v3=v3, + vrf=vrf, + snmp_type=snmp_type, + ) + proposed = dict((k, v) for k, v in args.items() if v is not None) + + if state == "absent" and existing: + if proposed.get("community"): + commands.append(remove_snmp_host(snmp_host, udp, existing)) + else: + if proposed.get("src_intf"): + commands.append(remove_src(snmp_host, udp, proposed, existing)) + if proposed.get("vrf"): + commands.append(remove_vrf(snmp_host, udp, proposed, existing)) + if proposed.get("vrf_filter"): + commands.append( + remove_filter(snmp_host, udp, proposed, existing) + ) + + elif state == "present": + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = config_snmp_host(delta, udp, proposed, existing, module) + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_location.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_location.py new file mode 100644 index 00000000..ed742cbd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_location.py @@ -0,0 +1,156 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_snmp_location +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages SNMP location information. +description: +- Manages SNMP location configuration. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +options: + location: + description: + - Location information. + required: true + type: str + state: + description: + - Manage the state of the resource. + required: false + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# ensure snmp location is configured +- cisco.nxos.nxos_snmp_location: + location: Test + state: present + +# ensure snmp location is not configured +- cisco.nxos.nxos_snmp_location: + location: Test + state: absent +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["snmp-server location New_Test"] +""" + + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + command = {"command": command, "output": "text"} + + return run_commands(module, command) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_snmp_location(module): + location = {} + location_regex = r"^\s*snmp-server\s+location\s+(?P.+)$" + + body = execute_show_command("show run snmp", module)[0] + match_location = re.search(location_regex, body, re.M) + if match_location: + location["location"] = match_location.group("location") + + return location + + +def main(): + argument_spec = dict( + location=dict(required=True, type="str"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + location = module.params["location"] + state = module.params["state"] + + existing = get_snmp_location(module) + commands = [] + + if state == "absent": + if existing and existing["location"] == location: + commands.append("no snmp-server location") + elif state == "present": + if not existing or existing["location"] != location: + commands.append("snmp-server location {0}".format(location)) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_traps.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_traps.py new file mode 100644 index 00000000..c48f6a27 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_traps.py @@ -0,0 +1,331 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_snmp_traps +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages SNMP traps. +description: +- Manages SNMP traps configurations. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- This module works at the group level for traps. If you need to only enable/disable + 1 specific trap within a group, use the M(cisco.nxos.nxos_command) module. +- Be aware that you can set a trap only for an enabled feature. +options: + group: + description: + - Case sensitive group. + required: true + choices: + - aaa + - bfd + - bgp + - bridge + - callhome + - cfs + - config + - eigrp + - entity + - feature-control + - generic + - hsrp + - license + - link + - lldp + - mmode + - ospf + - pim + - rf + - rmon + - snmp + - storm-control + - stpx + - switchfabric + - syslog + - sysmgr + - system + - upgrade + - vtp + - all + type: str + state: + description: + - Manage the state of the resource. + required: false + default: enabled + choices: + - enabled + - disabled + type: str +""" + +EXAMPLES = """ +# ensure lldp trap configured +- cisco.nxos.nxos_snmp_traps: + group: lldp + state: enabled + +# ensure lldp trap is not configured +- cisco.nxos.nxos_snmp_traps: + group: lldp + state: disabled +""" + +RETURN = """ +commands: + description: command sent to the device + returned: always + type: list + sample: "snmp-server enable traps lldp ;" +""" + + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, +) +from ansible.module_utils.basic import AnsibleModule + + +def get_platform_id(module): + info = get_capabilities(module).get("device_info", {}) + return info.get("network_os_platform", "") + + +def execute_show_command(command, module): + command = {"command": command, "output": "text"} + + return run_commands(module, command) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_snmp_traps(group, module): + body = execute_show_command("show run snmp all", module)[0].split("\n") + + resource = {} + feature_list = [ + "aaa", + "bfd", + "bgp", + "bridge", + "callhome", + "cfs", + "config", + "eigrp", + "entity", + "feature-control", + "generic", + "hsrp", + "license", + "link", + "lldp", + "mmode", + "ospf", + "pim", + "rf", + "rmon", + "snmp", + "storm-control", + "stpx", + "switchfabric", + "syslog", + "sysmgr", + "system", + "upgrade", + "vtp", + ] + + if "all" in group and "N3K-C35" in get_platform_id(module): + module.warn( + "Platform does not support bfd traps; bfd ignored for 'group: all' request" + ) + feature_list.remove("bfd") + + for each in feature_list: + for line in body: + if each == "ospf": + # ospf behaves differently when routers are present + if "snmp-server enable traps ospf" == line: + resource[each] = True + break + else: + if "enable traps {0}".format(each) in line: + if "no " in line: + resource[each] = False + break + else: + resource[each] = True + + for each in feature_list: + if resource.get(each) is None: + # on some platforms, the 'no' cmd does not + # show up and so check if the feature is enabled + body = execute_show_command("show run | inc feature", module)[0] + if "feature {0}".format(each) in body: + resource[each] = False + + find = resource.get(group, None) + + if group == "all".lower(): + return resource + elif find is not None: + trap_resource = {group: find} + return trap_resource + else: + # if 'find' is None, it means that 'group' is a + # currently disabled feature. + return {} + + +def get_trap_commands(group, state, existing, module): + commands = [] + enabled = False + disabled = False + + if group == "all": + if state == "disabled": + for feature in existing: + if existing[feature]: + trap_command = "no snmp-server enable traps {0}".format( + feature + ) + commands.append(trap_command) + + elif state == "enabled": + for feature in existing: + if existing[feature] is False: + trap_command = "snmp-server enable traps {0}".format( + feature + ) + commands.append(trap_command) + + else: + if group in existing: + if existing[group]: + enabled = True + else: + disabled = True + + if state == "disabled" and enabled: + commands.append( + ["no snmp-server enable traps {0}".format(group)] + ) + elif state == "enabled" and disabled: + commands.append(["snmp-server enable traps {0}".format(group)]) + else: + module.fail_json( + msg="{0} is not a currently " "enabled feature.".format(group) + ) + + return commands + + +def main(): + argument_spec = dict( + state=dict(choices=["enabled", "disabled"], default="enabled"), + group=dict( + choices=[ + "aaa", + "bfd", + "bgp", + "bridge", + "callhome", + "cfs", + "config", + "eigrp", + "entity", + "feature-control", + "generic", + "hsrp", + "license", + "link", + "lldp", + "mmode", + "ospf", + "pim", + "rf", + "rmon", + "snmp", + "storm-control", + "stpx", + "switchfabric", + "syslog", + "sysmgr", + "system", + "upgrade", + "vtp", + "all", + ], + required=True, + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + group = module.params["group"].lower() + state = module.params["state"] + + existing = get_snmp_traps(group, module) + + commands = get_trap_commands(group, state, existing, module) + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_user.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_user.py new file mode 100644 index 00000000..32235eb7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_snmp_user.py @@ -0,0 +1,413 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_snmp_user +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages SNMP users for monitoring. +description: +- Manages SNMP user configuration. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Authentication parameters not idempotent. +options: + user: + description: + - Name of the user. + required: true + type: str + group: + description: + - Group to which the user will belong to. If state = present, and the user is + existing, the group is added to the user. If the user is not existing, user + entry is created with this group argument. If state = absent, only the group + is removed from the user entry. However, to maintain backward compatibility, + if the existing user belongs to only one group, and if group argument is same + as the existing user's group, then the user entry also is deleted. + type: str + authentication: + description: + - Authentication parameters for the user. + choices: + - md5 + - sha + type: str + pwd: + description: + - Authentication password when using md5 or sha. This is not idempotent + type: str + privacy: + description: + - Privacy password for the user. This is not idempotent + type: str + encrypt: + description: + - Enables AES-128 bit encryption when using privacy password. + type: bool + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_snmp_user: + user: ntc + group: network-operator + authentication: md5 + pwd: test_password +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["snmp-server user ntc network-operator auth md5 test_password"] +""" + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module, text=False): + command = {"command": command, "output": "json"} + if text: + command["output"] = "text" + + return run_commands(module, command) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_snmp_groups(module): + data = execute_show_command("show snmp group", module)[0] + group_list = [] + + try: + group_table = data["TABLE_role"]["ROW_role"] + for group in group_table: + group_list.append(group["role_name"]) + except (KeyError, AttributeError): + return group_list + + return group_list + + +def get_snmp_user(user, module): + command = "show snmp user {0}".format(user) + body = execute_show_command(command, module, text=True) + body_text = body[0] + + if "No such entry" not in body[0]: + body = execute_show_command(command, module) + + resource = {} + try: + # The TABLE and ROW keys differ between NXOS platforms. + if body[0].get("TABLE_snmp_user"): + tablekey = "TABLE_snmp_user" + rowkey = "ROW_snmp_user" + tablegrpkey = "TABLE_snmp_group_names" + rowgrpkey = "ROW_snmp_group_names" + authkey = "auth_protocol" + privkey = "priv_protocol" + grpkey = "group_names" + elif body[0].get("TABLE_snmp_users"): + tablekey = "TABLE_snmp_users" + rowkey = "ROW_snmp_users" + tablegrpkey = "TABLE_groups" + rowgrpkey = "ROW_groups" + authkey = "auth" + privkey = "priv" + grpkey = "group" + + rt = body[0][tablekey][rowkey] + # on some older platforms, all groups except the 1st one + # are in list elements by themselves and they are + # indexed by 'user'. This is due to a platform bug. + # Get first element if rt is a list due to the bug + # or if there is no bug, parse rt directly + if isinstance(rt, list): + resource_table = rt[0] + else: + resource_table = rt + + resource["user"] = user + resource["authentication"] = str(resource_table[authkey]).strip() + encrypt = str(resource_table[privkey]).strip() + if encrypt.startswith("aes"): + resource["encrypt"] = "aes-128" + else: + resource["encrypt"] = "none" + + groups = [] + if tablegrpkey in resource_table: + group_table = resource_table[tablegrpkey][rowgrpkey] + try: + for group in group_table: + groups.append(str(group[grpkey]).strip()) + except TypeError: + groups.append(str(group_table[grpkey]).strip()) + + # Now for the platform bug case, get the groups + if isinstance(rt, list): + # remove 1st element from the list as this is parsed already + rt.pop(0) + # iterate through other elements indexed by + # 'user' and add it to groups. + for each in rt: + groups.append(each["user"].strip()) + + # Some 'F' platforms use 'group' key instead + elif "group" in resource_table: + # single group is a string, multiple groups in a list + groups = resource_table["group"] + if isinstance(groups, str): + groups = [groups] + + resource["group"] = groups + + except (KeyError, AttributeError, IndexError, TypeError): + if not resource and body_text and "No such entry" not in body_text: + # 6K and other platforms may not return structured output; + # attempt to get state from text output + resource = get_non_structured_snmp_user(body_text) + + return resource + + +def get_non_structured_snmp_user(body_text): + # This method is a workaround for platforms that don't support structured + # output for 'show snmp user '. This workaround may not work on all + # platforms. Sample non-struct output: + # + # User Auth Priv(enforce) Groups acl_filter + # ____ ____ _____________ ______ __________ + # sample1 no no network-admin ipv4:my_acl + # network-operator + # priv-11 + # -OR- + # sample2 md5 des(no) priv-15 + # -OR- + # sample3 md5 aes-128(no) network-admin + resource = {} + output = body_text.rsplit("__________")[-1] + pat = re.compile( + r"^(?P\S+)\s+" + r"(?P\S+)\s+" + r"(?P[\w\d-]+)(?P\([\w\d-]+\))*\s+" + r"(?P\S+)", + re.M, + ) + m = re.search(pat, output) + if not m: + return resource + resource["user"] = m.group("user") + resource["auth"] = m.group("auth") + resource["encrypt"] = ( + "aes-128" if "aes" in str(m.group("priv")) else "none" + ) + + resource["group"] = [m.group("group")] + more_groups = re.findall(r"^\s+([\w\d-]+)\s*$", output, re.M) + if more_groups: + resource["group"] += more_groups + + return resource + + +def remove_snmp_user(user, group=None): + if group: + return ["no snmp-server user {0} {1}".format(user, group)] + else: + return ["no snmp-server user {0}".format(user)] + + +def config_snmp_user(proposed, user, reset): + if reset: + commands = remove_snmp_user(user) + else: + commands = [] + + if proposed.get("group"): + cmd = "snmp-server user {0} {group}".format(user, **proposed) + else: + cmd = "snmp-server user {0}".format(user) + + auth = proposed.get("authentication", None) + pwd = proposed.get("pwd", None) + + if auth and pwd: + cmd += " auth {authentication} {pwd}".format(**proposed) + + encrypt = proposed.get("encrypt", None) + privacy = proposed.get("privacy", None) + + if encrypt and privacy: + cmd += " priv {encrypt} {privacy}".format(**proposed) + elif privacy: + cmd += " priv {privacy}".format(**proposed) + + if cmd: + commands.append(cmd) + + return commands + + +def main(): + argument_spec = dict( + user=dict(required=True, type="str"), + group=dict(type="str"), + pwd=dict(type="str", no_log=True), + privacy=dict(type="str"), + authentication=dict(choices=["md5", "sha"]), + encrypt=dict(type="bool"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + required_together=[["authentication", "pwd"], ["encrypt", "privacy"]], + supports_check_mode=True, + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + user = module.params["user"] + group = module.params["group"] + pwd = module.params["pwd"] + privacy = module.params["privacy"] + encrypt = module.params["encrypt"] + authentication = module.params["authentication"] + state = module.params["state"] + + if privacy and encrypt: + if not pwd and authentication: + module.fail_json( + msg="pwd and authentication must be provided " + "when using privacy and encrypt" + ) + + if group and group not in get_snmp_groups(module): + module.fail_json(msg="group not configured yet on switch.") + + existing = get_snmp_user(user, module) + + if state == "present" and existing: + if group: + if group not in existing["group"]: + existing["group"] = None + else: + existing["group"] = group + else: + existing["group"] = None + + commands = [] + + if state == "absent" and existing: + if group: + if group in existing["group"]: + if len(existing["group"]) == 1: + commands.append(remove_snmp_user(user)) + else: + commands.append(remove_snmp_user(user, group)) + else: + commands.append(remove_snmp_user(user)) + + elif state == "present": + reset = False + + args = dict( + user=user, + pwd=pwd, + group=group, + privacy=privacy, + encrypt=encrypt, + authentication=authentication, + ) + proposed = dict((k, v) for k, v in args.items() if v is not None) + + if not existing: + if encrypt: + proposed["encrypt"] = "aes-128" + commands.append(config_snmp_user(proposed, user, reset)) + + elif existing: + if encrypt and not existing["encrypt"].startswith("aes"): + reset = True + proposed["encrypt"] = "aes-128" + + delta = dict(set(proposed.items()).difference(existing.items())) + + if delta.get("pwd"): + delta["authentication"] = authentication + + if delta and encrypt: + delta["encrypt"] = "aes-128" + + if delta: + command = config_snmp_user(delta, user, reset) + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + + if "configure" in cmds: + cmds.pop(0) + results["commands"] = cmds + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_route.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_route.py new file mode 100644 index 00000000..595a22b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_route.py @@ -0,0 +1,383 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_static_route +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manages static + route configuration +description: +- Manages static route configuration +version_added: 1.0.0 +deprecated: + alternative: nxos_static_routes + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- If no vrf is supplied, vrf is set to default. +- If C(state=absent), the route will be removed, regardless of the non-required parameters. +options: + prefix: + description: + - Destination prefix of static route. + aliases: + - address + type: str + next_hop: + description: + - Next hop address or interface of static route. If interface, it must be the + fully-qualified interface name. + type: str + vrf: + description: + - VRF for static route. + default: default + type: str + tag: + description: + - Route tag value (numeric) or keyword 'default'. + type: str + route_name: + description: + - Name of the route or keyword 'default'. Used with the name parameter on the + CLI. + type: str + pref: + description: + - Preference or administrative difference of route (range 1-255) or keyword 'default'. + aliases: + - admin_distance + type: str + aggregate: + description: List of static route definitions + type: list + elements: dict + suboptions: + prefix: + description: + - Destination prefix of static route. + required: True + type: str + next_hop: + description: + - Next hop address or interface of static route. If interface, it must be the + fully-qualified interface name. + required: true + type: str + vrf: + description: + - VRF for static route. + type: str + tag: + description: + - Route tag value (numeric) or keyword 'default'. + type: str + route_name: + description: + - Name of the route or keyword 'default'. Used with the name parameter on the + CLI. + type: str + pref: + description: + - Preference or administrative difference of route (range 1-255) or keyword 'default'. + aliases: + - admin_distance + type: str + track: + description: + - Track value (range 1 - 512). Track must already be configured on the device + before adding the route. + type: int + state: + description: + - Manage the state of the resource. + choices: + - present + - absent + type: str + track: + description: + - Track value (range 1 - 512). Track must already be configured on the device + before adding the route. + type: int + state: + description: + - Manage the state of the resource. + choices: + - present + - absent + default: present + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_static_route: + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: testing + pref: 100 +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["ip route 192.168.20.0/24 192.0.2.3 name testing 100"] +""" +import re +from copy import deepcopy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) + + +def reconcile_candidate(module, candidate, prefix, want): + state, vrf = want["state"], want["vrf"] + if vrf == "default": + parents = [] + flags = " | include '^ip route'" + else: + parents = ["vrf context {0}".format(vrf)] + flags = " | section '{0}' | include '^ ip route'".format(parents[0]) + + # Find existing routes in this vrf/default + netcfg = CustomNetworkConfig( + indent=2, contents=get_config(module, flags=[flags]) + ) + routes = str(netcfg).split("\n") + # strip whitespace from route strings + routes = [i.strip() for i in routes] + + prefix_and_nh = "ip route {0} {1}".format(prefix, want["next_hop"]) + existing = [i for i in routes if i.startswith(prefix_and_nh)] + proposed = set_route_command(prefix, want, module) + + commands = [] + if state == "absent" and existing: + commands = ["no " + existing[0]] + elif state == "present" and proposed not in routes: + if existing: + commands = ["no " + existing[0]] + commands.append(proposed) + + if commands: + candidate.add(commands, parents=parents) + + +def get_configured_track(module, ctrack): + check_track = "{0}".format(ctrack) + track_exists = False + command = "show track" + try: + body = run_commands(module, {"command": command, "output": "text"}) + match = re.findall(r"Track\s+(\d+)", body[0]) + except IndexError: + return None + if check_track in match: + track_exists = True + return track_exists + + +def set_route_command(prefix, w, module): + route_cmd = "ip route {0} {1}".format(prefix, w["next_hop"]) + + if w["track"]: + if w["track"] in range(1, 512): + if get_configured_track(module, w["track"]): + route_cmd += " track {0}".format(w["track"]) + else: + module.fail_json( + msg="Track {0} not configured on device".format(w["track"]) + ) + else: + module.fail_json(msg="Invalid track number, valid range is 1-512.") + if w["route_name"] and w["route_name"] != "default": + route_cmd += " name {0}".format(w["route_name"]) + if w["tag"]: + if w["tag"] != "default" and w["tag"] != "0": + route_cmd += " tag {0}".format(w["tag"]) + if w["pref"] and w["pref"] != "default": + route_cmd += " {0}".format(w["pref"]) + + return route_cmd + + +def get_dotted_mask(mask): + bits = 0 + for i in range(32 - mask, 32): + bits |= 1 << i + mask = "%d.%d.%d.%d" % ( + (bits & 0xFF000000) >> 24, + (bits & 0xFF0000) >> 16, + (bits & 0xFF00) >> 8, + (bits & 0xFF), + ) + return mask + + +def get_network_start(address, netmask): + address = address.split(".") + netmask = netmask.split(".") + return [str(int(address[x]) & int(netmask[x])) for x in range(0, 4)] + + +def network_from_string(address, mask, module): + octects = address.split(".") + + if len(octects) > 4: + module.fail_json(msg="Incorrect address format.", address=address) + + for octect in octects: + try: + if int(octect) < 0 or int(octect) > 255: + module.fail_json( + msg="Address may contain invalid values.", address=address + ) + except ValueError: + module.fail_json( + msg="Address may contain non-integer values.", address=address + ) + + try: + if int(mask) < 0 or int(mask) > 32: + module.fail_json(msg="Incorrect mask value.", mask=mask) + except ValueError: + module.fail_json(msg="Mask may contain non-integer values.", mask=mask) + + netmask = get_dotted_mask(int(mask)) + return ".".join(get_network_start(address, netmask)) + + +def normalize_prefix(module, prefix): + splitted_prefix = prefix.split("/") + + address = splitted_prefix[0] + if len(splitted_prefix) > 2: + module.fail_json(msg="Incorrect address format.", address=address) + elif len(splitted_prefix) == 2: + mask = splitted_prefix[1] + network = network_from_string(address, mask, module) + + normalized_prefix = str(network) + "/" + str(mask) + else: + normalized_prefix = prefix + "/" + str(32) + + return normalized_prefix + + +def map_params_to_obj(module): + obj = [] + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + obj.append(d) + else: + obj.append( + { + "prefix": module.params["prefix"], + "next_hop": module.params["next_hop"], + "vrf": module.params["vrf"], + "tag": module.params["tag"], + "route_name": module.params["route_name"], + "pref": module.params["pref"], + "state": module.params["state"], + "track": module.params["track"], + } + ) + + return obj + + +def main(): + element_spec = dict( + prefix=dict(type="str", aliases=["address"]), + next_hop=dict(type="str"), + vrf=dict(type="str", default="default"), + tag=dict(type="str"), + route_name=dict(type="str"), + pref=dict(type="str", aliases=["admin_distance"]), + state=dict(choices=["absent", "present"], default="present"), + track=dict(type="int"), + ) + + aggregate_spec = deepcopy(element_spec) + aggregate_spec["prefix"] = dict(required=True) + aggregate_spec["next_hop"] = dict(required=True) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec) + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + result = {"changed": False, "commands": []} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + for w in want: + prefix = normalize_prefix(module, w["prefix"]) + candidate = CustomNetworkConfig(indent=3) + reconcile_candidate(module, candidate, prefix, w) + + if not module.check_mode and candidate: + candidate = candidate.items_text() + load_config(module, candidate) + result["commands"].extend(candidate) + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_routes.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_routes.py new file mode 100644 index 00000000..8117eb39 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_static_routes.py @@ -0,0 +1,476 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_static_routes +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_static_routes +short_description: Static routes resource module +description: This module configures and manages the attributes of static routes on + Cisco NX-OS platforms. +version_added: 1.0.0 +author: Adharsh Srivats Rangarajan (@adharshsrivatsr) +notes: +- Tested against NX-OS 7.3.(0)D1(1) on VIRL +- When a route is configured for a non-existent VRF, the VRF is created and the route + is added to it. +- When deleting routes for a VRF, all routes inside the VRF are deleted, but the VRF + is not deleted. +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the following commands in order B(show running-config | include + '^ip(v6)* route') and B(show running-config | section '^vrf context'). + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: + - A list of configurations for static routes + type: list + elements: dict + suboptions: + vrf: + description: + - The VRF to which the static route(s) belong + type: str + address_families: + description: A dictionary specifying the address family to which the static + route(s) belong. + type: list + elements: dict + suboptions: + afi: + description: + - Specifies the top level address family indicator. + type: str + choices: [ipv4, ipv6] + required: true + routes: + description: A dictionary that specifies the static route configurations + elements: dict + type: list + suboptions: + dest: + description: + - Destination prefix of static route + - The address format is / + - The mask is number in range 0-32 for IPv4 and in range 0-128 for + IPv6 + type: str + required: true + next_hops: + description: + - Details of route to be taken + type: list + elements: dict + suboptions: + forward_router_address: + description: + - IP address of the next hop router + type: str + # required: True + interface: + description: + - Outgoing interface to take. For anything except 'Null0', then + next hop IP address should also be configured. + type: str + admin_distance: + description: + - Preference or administrative distance of route (range 1-255) + type: int + route_name: + description: + - Name of the static route + type: str + tag: + description: + - Route tag value (numeric) + type: int + track: + description: + - Track value (range 1 - 512). Track must already be configured + on the device before adding the route. + type: int + dest_vrf: + description: + - VRF of the destination + type: str + state: + description: + - The state the configuration should be left in + type: str + choices: + - deleted + - merged + - overridden + - replaced + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using deleted: + +# Before state: +# ------------- +# +# ip route 192.0.2.32/28 192.0.2.12 name new_route +# ip route 192.0.2.26/24 192.0.2.13 tag 12 + +- name: Delete all routes + cisco.nxos.nxos_static_routes: + state: deleted + +# After state: +# ------------ +# + + +# Before state: +# ------------ +# +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf +# ip route 192.0.2.64/28 192.0.2.22 tag 4 +# ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 +# ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + +- name: Delete routes based on VRF + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + state: deleted + +# After state: +# ----------- +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf + + +# Before state: +# ------------ +# +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf +# ip route 192.0.2.64/28 192.0.2.22 tag 4 +# ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 +# ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + +- name: Delete routes based on AFI in a VRF + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + state: deleted + +# After state: +# ----------- +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf +# ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + + +# Before state: +# ----------- +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# vrf context trial_vrf +# ipv6 route 2200:10::/36 2048:ae12::1 vrf dest 5 + + +# Using merged + +# Before state: +# ------------- +# + +- name: Merge new static route configuration + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.64/24 + next_hops: + - forward_router_address: 192.0.2.22 + tag: 4 + admin_distance: 2 + + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/24 + next_hops: + - forward_router_address: 192.0.2.24 + route_name: new_route + - afi: ipv6 + routes: + - dest: 2001:db8::/64 + next_hops: + - interface: eth1/3 + forward_router_address: 2001:db8::12 + state: merged + +# After state: +# ------------ +# +# ip route 192.0.2.16/24 192.0.2.24 name new_route +# ipv6 route 2001:db8::/64 Ethernet1/3 2001:db8::12 +# vrf context trial_vrf +# ip route 192.0.2.0/24 192.0.2.22 tag 4 2 + + +# Using overridden: + +# Before state: +# ------------- +# +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf +# ip route 192.0.2.64/28 192.0.2.22 tag 4 +# ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + +- name: Overriden existing static route configuration with new configuration + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.23 + route_name: overridden_route1 + admin_distance: 3 + + - forward_router_address: 192.0.2.45 + route_name: overridden_route2 + dest_vrf: destinationVRF + interface: Ethernet1/2 + state: overridden + +# After state: +# ------------ +# +# ip route 192.0.2.16/28 192.0.2.23 name replaced_route1 3 +# ip route 192.0.2.16/28 Ethernet1/2 192.0.2.45 vrf destinationVRF name replaced_route2 + + +# Using replaced: + +# Before state: +# ------------ +# ip route 192.0.2.16/28 192.0.2.24 name new_route +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf +# ip route 192.0.2.64/28 192.0.2.22 tag 4 +# ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + +- name: Replaced the existing static configuration of a prefix with new configuration + cisco.nxos.nxos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.23 + route_name: replaced_route1 + admin_distance: 3 + + - forward_router_address: 192.0.2.45 + route_name: replaced_route2 + dest_vrf: destinationVRF + interface: Ethernet1/2 + state: replaced + +# After state: +# ----------- +# ip route 192.0.2.16/28 192.0.2.23 name replaced_route1 3 +# ip route 192.0.2.16/28 Ethernet1/2 192.0.2.45 vrf destinationVRF name replaced_route2 +# ip route 192.0.2.80/28 192.0.2.26 tag 12 +# vrf context trial_vrf +# ip route 192.0.2.64/28 192.0.2.22 tag 4 +# ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + + +# Using gathered: + +# Before state: +# ------------- +# ipv6 route 2001:db8:12::/32 2001:db8::12 +# vrf context Test +# ip route 192.0.2.48/28 192.0.2.13 +# ip route 192.0.2.48/28 192.0.2.14 5 + +- name: Gather the exisitng condiguration + cisco.nxos.nxos_static_routes: + state: gathered + +# returns: +# gathered: +# - vrf: Test +# address_families: +# - afi: ipv4 +# routes: +# - dest: 192.0.2.48/28 +# next_hops: +# - forward_router_address: 192.0.2.13 +# +# - forward_router_address: 192.0.2.14 +# admin_distance: 5 +# +# - address_families: +# - afi: ipv6 +# routes: +# - dest: 2001:db8:12::/32 +# next_hops: +# - forward_router_address: 2001:db8::12 + + +# Using rendered: + +- name: Render required configuration to be pushed to the device + cisco.nxos.nxos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.48/28 + next_hops: + - forward_router_address: 192.0.2.13 + + - afi: ipv6 + routes: + - dest: 2001:db8::/64 + next_hops: + - interface: eth1/3 + forward_router_address: 2001:db8::12 + state: rendered + +# returns +# rendered: +# vrf context default +# ip route 192.0.2.48/28 192.0.2.13 +# ipv6 route 2001:db8::/64 Ethernet1/3 2001:db8::12 + + +# Using parsed + +- name: Parse the config to structured data + cisco.nxos.nxos_static_routes: + running_config: | + ipv6 route 2002:db8:12::/32 2002:db8:12::1 + vrf context Test + ip route 192.0.2.48/28 192.0.2.13 + ip route 192.0.2.48/28 192.0.2.14 5 + +# returns: +# parsed: +# - vrf: Test +# address_families: +# - afi: ipv4 +# routes: +# - dest: 192.0.2.48/28 +# next_hops: +# - forward_router_address: 192.0.2.13 +# +# - forward_router_address: 192.0.2.14 +# admin_distance: 5 +# +# - address_families: +# - afi: ipv6 +# routes: +# - dest: 2002:db8:12::/32 +# next_hops: +# - forward_router_address: 2002:db8:12::1 + + +""" +RETURN = """ +before: + description: The configuration prior to the model invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The resulting configuration model invocation. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['ip route 192.0.2.48/28 192.0.2.12 Ethernet1/2 name sample_route', + 'ipv6 route 2001:db8:3000::/36 2001:db8:200:2::2', 'vrf context test','ip route 192.0.2.48/28 192.0.2.121'] +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.static_routes.static_routes import ( + Static_routesArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.static_routes.static_routes import ( + Static_routes, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=Static_routesArgs.argument_spec, supports_check_mode=True + ) + + result = Static_routes(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_system.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_system.py new file mode 100644 index 00000000..0ab78d3e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_system.py @@ -0,0 +1,402 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_system +extends_documentation_fragment: +- cisco.nxos.nxos +author: Peter Sprygada (@privateip) +short_description: Manage the system attributes on Cisco NXOS devices +description: +- This module provides declarative management of node system attributes on Cisco NXOS + devices. It provides an option to configure host system parameters or remove those + parameters from the device active configuration. +version_added: 1.0.0 +options: + hostname: + description: + - Configure the device hostname parameter. This option takes an ASCII string value + or keyword 'default' + type: str + domain_name: + description: + - Configures the default domain name suffix to be used when referencing this node + by its FQDN. This argument accepts either a list of domain names or a list + of dicts that configure the domain name and VRF name or keyword 'default'. See + examples. + type: list + elements: raw + domain_lookup: + description: + - Enables or disables the DNS lookup feature in Cisco NXOS. This argument accepts + boolean values. When enabled, the system will try to resolve hostnames using + DNS and when disabled, hostnames will not be resolved. + type: bool + domain_search: + description: + - Configures a list of domain name suffixes to search when performing DNS name + resolution. This argument accepts either a list of domain names or a list of + dicts that configure the domain name and VRF name or keyword 'default'. See + examples. + type: list + elements: raw + name_servers: + description: + - 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 or keyword 'default'. See examples. + type: list + elements: raw + system_mtu: + description: + - Specifies the mtu, must be an integer or keyword 'default'. + type: str + state: + description: + - State of the configuration values in the device's current active configuration. When + set to I(present), the values should be configured in the device active configuration + and when set to I(absent) the values should not be in the device active configuration + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- name: configure hostname and domain-name + cisco.nxos.nxos_system: + hostname: nxos01 + domain_name: test.example.com + +- name: remove configuration + cisco.nxos.nxos_system: + state: absent + +- name: configure name servers + cisco.nxos.nxos_system: + name_servers: + - 8.8.8.8 + - 8.8.4.4 + +- name: configure name servers with VRF support + cisco.nxos.nxos_system: + name_servers: + - {server: 8.8.8.8, vrf: mgmt} + - {server: 8.8.4.4, vrf: mgmt} +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always + type: list + sample: + - hostname nxos01 + - ip domain-name test.example.com +""" +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.six import iteritems +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 ( + ComplexList, +) + +_CONFIGURED_VRFS = None + + +def has_vrf(module, vrf): + global _CONFIGURED_VRFS + if _CONFIGURED_VRFS is not None: + return vrf in _CONFIGURED_VRFS + config = get_config(module) + _CONFIGURED_VRFS = re.findall(r"vrf context (\S+)", config) + return vrf in _CONFIGURED_VRFS + + +def map_obj_to_commands(want, have, module): + commands = list() + state = module.params["state"] + + def needs_update(x): + return want.get(x) and (want.get(x) != have.get(x)) + + def difference(x, y, z): + return [item for item in x[z] if item not in y[z]] + + def remove(cmd, commands, vrf=None): + if vrf: + commands.append("vrf context %s" % vrf) + commands.append(cmd) + if vrf: + commands.append("exit") + + def add(cmd, commands, vrf=None): + if vrf: + if not has_vrf(module, vrf): + module.fail_json(msg="invalid vrf name %s" % vrf) + return remove(cmd, commands, vrf) + + if state == "absent": + if have["hostname"]: + commands.append("no hostname") + + for item in have["domain_name"]: + cmd = "no ip domain-name %s" % item["name"] + remove(cmd, commands, item["vrf"]) + + for item in have["domain_search"]: + cmd = "no ip domain-list %s" % item["name"] + remove(cmd, commands, item["vrf"]) + + for item in have["name_servers"]: + cmd = "no ip name-server %s" % item["server"] + remove(cmd, commands, item["vrf"]) + + if have["system_mtu"]: + commands.append("no system jumbomtu") + + if state == "present": + if needs_update("hostname"): + if want["hostname"] == "default": + if have["hostname"]: + commands.append("no hostname") + else: + commands.append("hostname %s" % want["hostname"]) + + if want.get("domain_lookup") is not None: + if have.get("domain_lookup") != want.get("domain_lookup"): + cmd = "ip domain-lookup" + if want["domain_lookup"] is False: + cmd = "no %s" % cmd + commands.append(cmd) + + if want["domain_name"]: + if want.get("domain_name")[0]["name"] == "default": + if have["domain_name"]: + for item in have["domain_name"]: + cmd = "no ip domain-name %s" % item["name"] + remove(cmd, commands, item["vrf"]) + else: + for item in difference(have, want, "domain_name"): + cmd = "no ip domain-name %s" % item["name"] + remove(cmd, commands, item["vrf"]) + for item in difference(want, have, "domain_name"): + cmd = "ip domain-name %s" % item["name"] + add(cmd, commands, item["vrf"]) + + if want["domain_search"]: + if want.get("domain_search")[0]["name"] == "default": + if have["domain_search"]: + for item in have["domain_search"]: + cmd = "no ip domain-list %s" % item["name"] + remove(cmd, commands, item["vrf"]) + else: + for item in difference(have, want, "domain_search"): + cmd = "no ip domain-list %s" % item["name"] + remove(cmd, commands, item["vrf"]) + for item in difference(want, have, "domain_search"): + cmd = "ip domain-list %s" % item["name"] + add(cmd, commands, item["vrf"]) + + if want["name_servers"]: + if want.get("name_servers")[0]["server"] == "default": + if have["name_servers"]: + for item in have["name_servers"]: + cmd = "no ip name-server %s" % item["server"] + remove(cmd, commands, item["vrf"]) + else: + for item in difference(have, want, "name_servers"): + cmd = "no ip name-server %s" % item["server"] + remove(cmd, commands, item["vrf"]) + for item in difference(want, have, "name_servers"): + cmd = "ip name-server %s" % item["server"] + add(cmd, commands, item["vrf"]) + + if needs_update("system_mtu"): + if want["system_mtu"] == "default": + if have["system_mtu"]: + commands.append("no system jumbomtu") + else: + commands.append("system jumbomtu %s" % want["system_mtu"]) + + return commands + + +def parse_hostname(config): + match = re.search(r"^hostname (\S+)", config, re.M) + if match: + return match.group(1) + + +def parse_domain_name(config, vrf_config): + objects = list() + match = re.search(r"^ip domain-name (\S+)", config, re.M) + if match: + objects.append({"name": match.group(1), "vrf": None}) + + for vrf, cfg in iteritems(vrf_config): + match = re.search(r"ip domain-name (\S+)", cfg, re.M) + if match: + objects.append({"name": match.group(1), "vrf": vrf}) + + return objects + + +def parse_domain_search(config, vrf_config): + objects = list() + + for item in re.findall(r"^ip domain-list (\S+)", config, re.M): + objects.append({"name": item, "vrf": None}) + + for vrf, cfg in iteritems(vrf_config): + for item in re.findall(r"ip domain-list (\S+)", cfg, re.M): + objects.append({"name": item, "vrf": vrf}) + + return objects + + +def parse_name_servers(config, vrf_config, vrfs): + objects = list() + + match = re.search("^ip name-server (.+)$", config, re.M) + if match and "use-vrf" not in match.group(1): + for addr in match.group(1).split(" "): + objects.append({"server": addr, "vrf": None}) + + for vrf, cfg in iteritems(vrf_config): + vrf_match = re.search("ip name-server (.+)", cfg, re.M) + if vrf_match: + for addr in vrf_match.group(1).split(" "): + objects.append({"server": addr, "vrf": vrf}) + + return objects + + +def parse_system_mtu(config): + match = re.search(r"^system jumbomtu (\d+)", config, re.M) + if match: + return match.group(1) + + +def map_config_to_obj(module): + config = get_config(module) + configobj = NetworkConfig(indent=2, contents=config) + + vrf_config = {} + + vrfs = re.findall(r"^vrf context (\S+)$", config, re.M) + for vrf in vrfs: + config_data = configobj.get_block_config(path=["vrf context %s" % vrf]) + vrf_config[vrf] = config_data + + return { + "hostname": parse_hostname(config), + "domain_lookup": "no ip domain-lookup" not in config, + "domain_name": parse_domain_name(config, vrf_config), + "domain_search": parse_domain_search(config, vrf_config), + "name_servers": parse_name_servers(config, vrf_config, vrfs), + "system_mtu": parse_system_mtu(config), + } + + +def map_params_to_obj(module): + obj = { + "hostname": module.params["hostname"], + "domain_lookup": module.params["domain_lookup"], + "system_mtu": module.params["system_mtu"], + } + + domain_name = ComplexList(dict(name=dict(key=True), vrf=dict()), module) + + domain_search = ComplexList(dict(name=dict(key=True), vrf=dict()), module) + + name_servers = ComplexList(dict(server=dict(key=True), vrf=dict()), module) + + for arg, cast in [ + ("domain_name", domain_name), + ("domain_search", domain_search), + ("name_servers", name_servers), + ]: + if module.params[arg] is not None: + obj[arg] = cast(module.params[arg]) + else: + obj[arg] = None + + return obj + + +def main(): + """ main entry point for module execution + """ + argument_spec = dict( + hostname=dict(), + domain_lookup=dict(type="bool"), + # { name: , vrf: } + domain_name=dict(type="list", elements="raw"), + # {name: , vrf: } + domain_search=dict(type="list", elements="raw"), + # { server: ; vrf: } + name_servers=dict(type="list", elements="raw"), + system_mtu=dict(type="str"), + state=dict(default="present", choices=["present", "absent"]), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + have = map_config_to_obj(module) + + commands = map_obj_to_commands(want, have, module) + result["commands"] = commands + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_telemetry.py new file mode 100644 index 00000000..af619a69 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_telemetry.py @@ -0,0 +1,337 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright 2019 Cisco and/or its affiliates. +# 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 module file for nxos_telemetry +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_telemetry +short_description: TELEMETRY resource module +description: Manages Telemetry Monitoring Service (TMS) configuration +version_added: 1.0.0 +author: Mike Wiebe (@mikewiebe) +notes: +- Supported on N9k Version 7.0(3)I7(5) and later. +options: + config: + description: The provided configuration + type: dict + suboptions: + certificate: + type: dict + description: + - Certificate SSL/TLS and hostname values. + - Value must be a dict defining values for keys (key and hostname). + suboptions: + key: + description: + - Certificate key + type: str + hostname: + description: + - Certificate hostname + type: str + compression: + type: str + description: + - Destination profile compression method. + choices: + - gzip + source_interface: + type: str + description: + - Destination profile source interface. + - Valid value is a str representing the source interface name. + vrf: + type: str + description: + - Destination profile vrf. + - Valid value is a str representing the vrf name. + destination_groups: + type: list + description: + - List of telemetry destination groups. + elements: raw + suboptions: + id: + type: int + description: + - Destination group identifier. + - Value must be a int representing the destination group identifier. + destination: + type: dict + description: + - Group destination ipv4, port, protocol and encoding values. + - Value must be a dict defining values for keys (ip, port, protocol, encoding). + suboptions: + ip: + type: str + description: + - Destination group IP address. + port: + type: int + description: + - Destination group port number. + protocol: + type: str + description: + - Destination group protocol. + choices: + - HTTP + - TCP + - UDP + - gRPC + encoding: + type: str + description: + - Destination group encoding. + choices: + - GPB + - JSON + sensor_groups: + type: list + description: + - List of telemetry sensor groups. + elements: raw + suboptions: + id: + type: int + description: + - Sensor group identifier. + - Value must be a int representing the sensor group identifier. + data_source: + type: str + description: + - Telemetry data source. + choices: + - NX-API + - DME + - YANG + path: + type: dict + description: + - Telemetry sensor path. + - Value must be a dict defining values for keys (name, depth, filter_condition, + query_condition). + - Mandatory Keys (name) + - Optional Keys (depth, filter_condition, query_condition) + suboptions: + name: + type: str + description: + - Sensor group path name. + depth: + type: str + description: + - Sensor group depth. + filter_condition: + type: str + description: + - Sensor group filter condition. + query_condition: + type: str + description: + - Sensor group query condition. + subscriptions: + type: list + description: + - List of telemetry subscriptions. + elements: raw + suboptions: + id: + type: int + description: + - Subscription identifier. + - Value must be a int representing the subscription identifier. + destination_group: + type: int + description: + - Associated destination group. + sensor_group: + type: dict + description: + - Associated sensor group. + - Value must be a dict defining values for keys (id, sample_interval). + suboptions: + id: + type: int + description: + - Associated sensor group id. + sample_interval: + type: int + description: + - Associated sensor group id sample interval. + state: + description: + - Final configuration state + type: str + choices: + - merged + - replaced + - deleted + default: merged + +""" +EXAMPLES = """ +# Using deleted +# This action will delete all telemetry configuration on the device + +- name: Delete Telemetry Configuration + cisco.nxos.nxos_telemetry: + state: deleted + + +# Using merged +# This action will merge telemetry configuration defined in the playbook with +# telemetry configuration that is already on the device. + +- name: Merge Telemetry Configuration + cisco.nxos.nxos_telemetry: + config: + certificate: + key: /bootflash/server.key + hostname: localhost + compression: gzip + source_interface: Ethernet1/1 + vrf: management + destination_groups: + - id: 2 + destination: + ip: 192.168.0.2 + port: 50001 + protocol: gPRC + encoding: GPB + - id: 55 + destination: + ip: 192.168.0.55 + port: 60001 + protocol: gPRC + encoding: GPB + sensor_groups: + - id: 1 + data_source: NX-API + path: + name: '"show lldp neighbors detail"' + depth: 0 + - id: 55 + data_source: DME + path: + name: sys/ch + depth: unbounded + filter_condition: ne(eqptFt.operSt,"ok") + subscriptions: + - id: 5 + destination_group: 55 + sensor_group: + id: 1 + sample_interval: 1000 + - id: 6 + destination_group: 2 + sensor_group: + id: 55 + sample_interval: 2000 + state: merged + + +# Using replaced +# This action will replace telemetry configuration on the device with the +# telemetry configuration defined in the playbook. + +- name: Override Telemetry Configuration + cisco.nxos.nxos_telemetry: + config: + certificate: + key: /bootflash/server.key + hostname: localhost + compression: gzip + source_interface: Ethernet1/1 + vrf: management + destination_groups: + - id: 2 + destination: + ip: 192.168.0.2 + port: 50001 + protocol: gPRC + encoding: GPB + subscriptions: + - id: 5 + destination_group: 55 + state: replaced + + +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: dict + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['command 1', 'command 2', 'command 3'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.telemetry.telemetry import ( + TelemetryArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.telemetry.telemetry import ( + Telemetry, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=TelemetryArgs.argument_spec, supports_check_mode=True + ) + + result = Telemetry(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld.py new file mode 100644 index 00000000..b509c7ed --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld.py @@ -0,0 +1,266 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_udld +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages UDLD global configuration params. +description: +- Manages UDLD global configuration params. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Module will fail if the udld feature has not been previously enabled. +options: + aggressive: + description: + - Toggles aggressive mode. + choices: + - enabled + - disabled + type: str + msg_time: + description: + - Message time in seconds for UDLD packets or keyword 'default'. + type: str + reset: + description: + - Ability to reset all ports shut down by UDLD. 'state' parameter cannot be 'absent' + when this is present. + type: bool + state: + description: + - Manage the state of the resource. When set to 'absent', aggressive and msg_time + are set to their default values. + default: present + choices: + - present + - absent + type: str +""" +EXAMPLES = """ +# ensure udld aggressive mode is globally disabled and se global message interval is 20 +- cisco.nxos.nxos_udld: + aggressive: disabled + msg_time: 20 + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + +# Ensure agg mode is globally enabled and msg time is 15 +- cisco.nxos.nxos_udld: + aggressive: enabled + msg_time: 15 + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"aggressive": "enabled", "msg_time": "40"} +existing: + description: + - k/v pairs of existing udld configuration + returned: always + type: dict + sample: {"aggressive": "disabled", "msg_time": "15"} +end_state: + description: k/v pairs of udld configuration after module execution + returned: always + type: dict + sample: {"aggressive": "enabled", "msg_time": "40"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["udld message-time 40", "udld aggressive"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +PARAM_TO_DEFAULT_KEYMAP = {"msg_time": "15"} + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + value = table.get(key) + if value: + new_dict[new_key] = str(value) + else: + new_dict[new_key] = value + return new_dict + + +def get_commands_config_udld_global(delta, reset, existing): + commands = [] + for param, value in delta.items(): + if param == "aggressive": + command = ( + "udld aggressive" + if value == "enabled" + else "no udld aggressive" + ) + commands.append(command) + elif param == "msg_time": + if value == "default": + if existing.get("msg_time") != PARAM_TO_DEFAULT_KEYMAP.get( + "msg_time" + ): + commands.append("no udld message-time") + else: + commands.append("udld message-time " + value) + if reset: + command = "udld reset" + commands.append(command) + return commands + + +def get_commands_remove_udld_global(existing): + commands = [] + if existing.get("aggressive") == "enabled": + command = "no udld aggressive" + commands.append(command) + if existing.get("msg_time") != PARAM_TO_DEFAULT_KEYMAP.get("msg_time"): + command = "no udld message-time" + commands.append(command) + return commands + + +def get_udld_global(module): + command = "show udld global | json" + udld_table = run_commands(module, [command])[0] + + status = str(udld_table.get("udld-global-mode", None)) + if status == "enabled-aggressive": + aggressive = "enabled" + else: + aggressive = "disabled" + + interval = str(udld_table.get("message-interval", None)) + udld = dict(msg_time=interval, aggressive=aggressive) + + return udld + + +def main(): + argument_spec = dict( + aggressive=dict(required=False, choices=["enabled", "disabled"]), + msg_time=dict(required=False, type="str"), + reset=dict(required=False, type="bool"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + aggressive = module.params["aggressive"] + msg_time = module.params["msg_time"] + reset = module.params["reset"] + state = module.params["state"] + + if reset and state == "absent": + module.fail_json(msg="state must be present when using reset flag.") + + args = dict(aggressive=aggressive, msg_time=msg_time, reset=reset) + proposed = dict((k, v) for k, v in args.items() if v is not None) + + existing = get_udld_global(module) + end_state = existing + + delta = set(proposed.items()).difference(existing.items()) + changed = False + + commands = [] + if state == "present": + if delta: + command = get_commands_config_udld_global( + dict(delta), reset, existing + ) + commands.append(command) + + elif state == "absent": + command = get_commands_remove_udld_global(existing) + if command: + commands.append(command) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + end_state = get_udld_global(module) + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["end_state"] = end_state + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld_interface.py new file mode 100644 index 00000000..d37530b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_udld_interface.py @@ -0,0 +1,315 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_udld_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages UDLD interface configuration params. +description: +- Manages UDLD interface configuration params. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Feature UDLD must be enabled on the device to use this module. +options: + mode: + description: + - Manages UDLD mode for an interface. + required: true + choices: + - enabled + - disabled + - aggressive + type: str + interface: + description: + - FULL name of the interface, i.e. Ethernet1/1- + required: true + type: str + state: + description: + - Manage the state of the resource. + required: false + default: present + choices: + - present + - absent + type: str +""" +EXAMPLES = """ +# ensure Ethernet1/1 is configured to be in aggressive mode +- cisco.nxos.nxos_udld_interface: + interface: Ethernet1/1 + mode: aggressive + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + +# Remove the aggressive config only if it's currently in aggressive mode and then disable udld (switch default) +- cisco.nxos.nxos_udld_interface: + interface: Ethernet1/1 + mode: aggressive + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + +# ensure Ethernet1/1 has aggressive mode enabled +- cisco.nxos.nxos_udld_interface: + interface: Ethernet1/1 + mode: enabled + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"mode": "enabled"} +existing: + description: + - k/v pairs of existing configuration + returned: always + type: dict + sample: {"mode": "aggressive"} +end_state: + description: k/v pairs of configuration after module execution + returned: always + type: dict + sample: {"mode": "enabled"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["interface ethernet1/33", + "no udld aggressive ; no udld disable"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_udld_interface(module, interface): + command = "show run udld all | section " + interface.title() + "$" + interface_udld = {} + mode = None + mode_str = None + try: + body = run_commands(module, [{"command": command, "output": "text"}])[ + 0 + ] + if "aggressive" in body: + mode = "aggressive" + mode_str = "aggressive" + elif "no udld enable" in body: + mode = "disabled" + mode_str = "no udld enable" + elif "no udld disable" in body: + mode = "enabled" + mode_str = "no udld disable" + elif "udld disable" in body: + mode = "disabled" + mode_str = "udld disable" + elif "udld enable" in body: + mode = "enabled" + mode_str = "udld enable" + interface_udld["mode"] = mode + + except (KeyError, AttributeError, IndexError): + interface_udld = {} + + return interface_udld, mode_str + + +def get_commands_config_udld_interface1(delta, interface, module, existing): + commands = [] + mode = delta["mode"] + if mode == "aggressive": + commands.append("udld aggressive") + else: + commands.append("no udld aggressive") + commands.insert(0, "interface {0}".format(interface)) + + return commands + + +def get_commands_config_udld_interface2(delta, interface, module, existing): + commands = [] + existing, mode_str = get_udld_interface(module, interface) + mode = delta["mode"] + if mode == "enabled": + if mode_str == "no udld enable": + command = "udld enable" + else: + command = "no udld disable" + else: + if mode_str == "no udld disable": + command = "udld disable" + else: + command = "no udld enable" + if command: + commands.append(command) + commands.insert(0, "interface {0}".format(interface)) + + return commands + + +def get_commands_remove_udld_interface(delta, interface, module, existing): + commands = [] + existing, mode_str = get_udld_interface(module, interface) + + mode = delta["mode"] + if mode == "aggressive": + command = "no udld aggressive" + else: + if mode == "enabled": + if mode_str == "udld enable": + command = "no udld enable" + else: + command = "udld disable" + elif mode == "disabled": + if mode_str == "no udld disable": + command = "udld disable" + else: + command = "no udld enable" + if command: + commands.append(command) + commands.insert(0, "interface {0}".format(interface)) + + return commands + + +def main(): + argument_spec = dict( + mode=dict( + choices=["enabled", "disabled", "aggressive"], required=True + ), + interface=dict(type="str", required=True), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + interface = module.params["interface"].lower() + mode = module.params["mode"] + state = module.params["state"] + + proposed = dict(mode=mode) + existing, mode_str = get_udld_interface(module, interface) + end_state = existing + + delta = dict(set(proposed.items()).difference(existing.items())) + + changed = False + commands = [] + cmds = [] + if state == "present": + if delta: + command = get_commands_config_udld_interface1( + delta, interface, module, existing + ) + commands.append(command) + cmds = flatten_list(commands) + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + + if delta["mode"] == "enabled" or delta["mode"] == "disabled": + commands = [] + command = get_commands_config_udld_interface2( + delta, interface, module, existing + ) + commands.append(command) + cmds = flatten_list(commands) + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + load_config(module, cmds) + + else: + common = set(proposed.items()).intersection(existing.items()) + if common: + command = get_commands_remove_udld_interface( + dict(common), interface, module, existing + ) + cmds = flatten_list(commands) + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + + if not module.check_mode: + end_state, mode_str = get_udld_interface(module, interface) + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["end_state"] = end_state + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_user.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_user.py new file mode 100644 index 00000000..06c291cc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_user.py @@ -0,0 +1,483 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_user +extends_documentation_fragment: +- cisco.nxos.nxos +author: Peter Sprygada (@privateip) +short_description: Manage the collection of local users on Nexus devices +description: +- This module provides declarative management of the local usernames configured on + Cisco Nexus 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. +version_added: 1.0.0 +options: + aggregate: + description: + - The set of username objects to be configured on the remote Cisco Nexus device. The + list entries can either be the username or a hash of username and properties. This + argument is mutually exclusive with the C(name) argument. + aliases: + - users + - collection + type: list + elements: dict + suboptions: + name: + description: + - The username to be configured on the remote Cisco Nexus device. This argument + accepts a string value and is mutually exclusive with the C(aggregate) argument. + type: str + configured_password: + description: + - The password to be configured on the network device. The password needs to be + provided in cleartext and it will be encrypted on the device. Please note that + this option is not same as C(provider password). + type: str + update_password: + description: + - Since passwords are encrypted in the device running config, this argument will + instruct the module when to change the password. When set to C(always), the + password will always be updated in the device and when set to C(on_create) the + password will be updated only if the username is created. + choices: + - on_create + - always + type: str + roles: + description: + - The C(role) argument 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. + aliases: + - role + type: list + elements: str + sshkey: + description: + - The C(sshkey) argument defines the SSH public key to configure for the username. This + argument accepts a valid SSH key value. + type: str + state: + description: + - The C(state) argument configures the state of the username definition as it + relates to the device operational configuration. When set to I(present), the + username(s) should be configured in the device active configuration and when + set to I(absent) the username(s) should not be in the device active configuration + choices: + - present + - absent + type: str + name: + description: + - The username to be configured on the remote Cisco Nexus device. This argument + accepts a string value and is mutually exclusive with the C(aggregate) argument. + type: str + configured_password: + description: + - The password to be configured on the network device. The password needs to be + provided in cleartext and it will be encrypted on the device. Please note that + this option is not same as C(provider password). + type: str + update_password: + description: + - Since passwords are encrypted in the device running config, this argument will + instruct the module when to change the password. When set to C(always), the + password will always be updated in the device and when set to C(on_create) the + password will be updated only if the username is created. + default: always + choices: + - on_create + - always + type: str + roles: + description: + - The C(role) argument 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. + aliases: + - role + type: list + elements: str + sshkey: + description: + - The C(sshkey) argument defines the SSH public key to configure for the username. This + argument accepts a valid SSH key value. + type: str + purge: + description: + - The C(purge) argument 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 nxos constraints. + type: bool + default: no + state: + description: + - The C(state) argument configures the state of the username definition as it + relates to the device operational configuration. When set to I(present), the + username(s) should be configured in the device active configuration and when + set to I(absent) the username(s) should not be in the device active configuration + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- name: create a new user + cisco.nxos.nxos_user: + name: ansible + sshkey: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" + state: present + +- name: remove all users except admin + cisco.nxos.nxos_user: + purge: yes + +- name: set multiple users role + cisco.nxos.nxos_user: + aggregate: + - name: netop + - name: netend + role: network-operator + state: present +""" + +RETURN = """ +commands: + description: The list of configuration mode commands to send to the device + returned: always + type: list + sample: + - name ansible + - name ansible password password +""" +import re + +from copy import deepcopy +from functools import partial + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + run_commands, + load_config, + get_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, + to_list, +) + +BUILTIN_ROLES = [ + "network-admin", + "network-operator", + "vdc-admin", + "vdc-operator", + "priv-15", + "priv-14", + "priv-13", + "priv-12", + "priv-11", + "priv-10", + "priv-9", + "priv-8", + "priv-7", + "priv-6", + "priv-5", + "priv-4", + "priv-3", + "priv-2", + "priv-1", + "priv-0", +] + + +def get_custom_roles(module): + return re.findall( + r"^role name (\S+)", + get_config(module, flags=["| include '^role name'"]), + re.M, + ) + + +def validate_roles(value, module): + valid_roles = BUILTIN_ROLES + get_custom_roles(module) + for item in value: + if item not in valid_roles: + module.fail_json(msg="invalid role specified") + + +def map_obj_to_commands(updates, module): + commands = list() + update_password = module.params["update_password"] + + for update in updates: + want, have = update + + def needs_update(x): + return want.get(x) and (want.get(x) != have.get(x)) + + def add(x): + return commands.append("username %s %s" % (want["name"], x)) + + def remove(x): + return commands.append("no username %s %s" % (want["name"], x)) + + def configure_roles(): + if want["roles"]: + if have: + for item in set(have["roles"]).difference(want["roles"]): + remove("role %s" % item) + + for item in set(want["roles"]).difference(have["roles"]): + add("role %s" % item) + else: + for item in want["roles"]: + add("role %s" % item) + + return True + return False + + if want["state"] == "absent": + commands.append("no username %s" % want["name"]) + continue + + roles_configured = False + if want["state"] == "present" and not have: + roles_configured = configure_roles() + if not roles_configured: + commands.append("username %s" % want["name"]) + + if needs_update("configured_password"): + if update_password == "always" or not have: + add("password %s" % want["configured_password"]) + + if needs_update("sshkey"): + add("sshkey %s" % want["sshkey"]) + + if not roles_configured: + configure_roles() + + return commands + + +def parse_password(data): + if not data.get("remote_login"): + return "" + + +def parse_roles(data): + configured_roles = None + if "TABLE_role" in data: + configured_roles = data.get("TABLE_role")["ROW_role"] + + roles = list() + if configured_roles: + for item in to_list(configured_roles): + roles.append(item["role"]) + return roles + + +def map_config_to_obj(module): + out = run_commands( + module, [{"command": "show user-account", "output": "json"}] + ) + data = out[0] + + objects = list() + + for item in to_list(data["TABLE_template"]["ROW_template"]): + objects.append( + { + "name": item["usr_name"], + "configured_password": parse_password(item), + "sshkey": item.get("sshkey_info"), + "roles": parse_roles(item), + "state": "present", + } + ) + return objects + + +def get_param_value(key, item, module): + # if key doesn't exist in the item, get it from module.params + if not item.get(key): + value = module.params[key] + + # if key does exist, do a type check on it to validate it + else: + value_type = module.argument_spec[key].get("type", "str") + type_checker = module._CHECK_ARGUMENT_TYPES_DISPATCHER[value_type] + type_checker(item[key]) + value = item[key] + + return value + + +def map_params_to_obj(module): + aggregate = module.params["aggregate"] + if not aggregate: + if not module.params["name"] and module.params["purge"]: + return list() + elif not module.params["name"]: + module.fail_json(msg="username is required") + else: + collection = [{"name": module.params["name"]}] + else: + collection = list() + for item in aggregate: + if not isinstance(item, dict): + collection.append({"name": item}) + elif "name" not in item: + module.fail_json(msg="name is required") + else: + collection.append(item) + + objects = list() + + for item in collection: + get_value = partial(get_param_value, item=item, module=module) + item.update( + { + "configured_password": get_value("configured_password"), + "sshkey": get_value("sshkey"), + "roles": get_value("roles"), + "state": get_value("state"), + } + ) + + for key, value in iteritems(item): + if value: + # validate the param value (if validator func exists) + validator = globals().get("validate_%s" % key) + if all((value, validator)): + validator(value, module) + + objects.append(item) + + return objects + + +def update_objects(want, have): + updates = list() + for entry in want: + item = next((i for i in have if i["name"] == entry["name"]), None) + if all((item is None, entry["state"] == "present")): + updates.append((entry, {})) + elif item: + for key, value in iteritems(entry): + if value and value != item[key]: + updates.append((entry, item)) + return updates + + +def main(): + """ main entry point for module execution + """ + element_spec = dict( + name=dict(), + configured_password=dict(no_log=True), + update_password=dict( + default="always", choices=["on_create", "always"] + ), + roles=dict(type="list", aliases=["role"], elements="str"), + sshkey=dict(), + state=dict(default="present", choices=["present", "absent"]), + ) + + aggregate_spec = deepcopy(element_spec) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict( + type="list", + elements="dict", + options=aggregate_spec, + aliases=["collection", "users"], + ), + purge=dict(type="bool", default=False), + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + mutually_exclusive = [("name", "aggregate")] + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + result = {"changed": False, "warnings": []} + + want = map_params_to_obj(module) + have = map_config_to_obj(module) + + commands = map_obj_to_commands(update_objects(want, have), module) + + if module.params["purge"]: + want_users = [x["name"] for x in want] + have_users = [x["name"] for x in have] + for item in set(have_users).difference(want_users): + if item != "admin": + item = item.replace("\\", "\\\\") + commands.append("no username %s" % item) + + result["commands"] = commands + + # the nxos cli prevents this by rule so capture it and display + # a nice failure message + if "no username admin" in commands: + module.fail_json(msg="cannot delete the `admin` account") + + if commands: + if not module.check_mode: + responses = load_config(module, commands) + for resp in responses: + if resp.lower().startswith("wrong password"): + module.fail_json(msg=resp) + else: + result["warnings"].extend( + [ + x[9:] + for x in resp.splitlines() + if x.startswith("WARNING: ") + ] + ) + + result["changed"] = True + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlan.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlan.py new file mode 100644 index 00000000..a5729b68 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlan.py @@ -0,0 +1,849 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vlan +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: (deprecated, removed after 2022-06-01) Manages VLAN + resources and attributes. +description: +- Manages VLAN configurations on NX-OS switches. +version_added: 1.0.0 +deprecated: + alternative: nxos_vlans + why: Updated modules released with more functionality + removed_at_date: '2022-06-01' +author: Jason Edelman (@jedelman8) +options: + vlan_id: + description: + - Single VLAN ID. + type: int + vlan_range: + description: + - Range of VLANs such as 2-10 or 2,5,10-15, etc. + type: str + name: + description: + - Name of VLAN or keyword 'default'. + type: str + interfaces: + description: + - List of interfaces that should be associated to the VLAN or keyword 'default'. + type: list + elements: str + associated_interfaces: + description: + - This is a intent option and checks the operational state of the for given vlan + C(name) for associated interfaces. If the value in the C(associated_interfaces) + does not match with the operational state of vlan interfaces on device it will + result in failure. + type: list + elements: str + vlan_state: + description: + - Manage the vlan operational state of the VLAN + default: active + choices: + - active + - suspend + type: str + admin_state: + description: + - Manage the VLAN administrative state of the VLAN equivalent to shut/no shut + in VLAN config mode. + default: up + choices: + - up + - down + type: str + mapped_vni: + description: + - The Virtual Network Identifier (VNI) ID that is mapped to the VLAN. Valid values + are integer and keyword 'default'. Range 4096-16773119. + type: str + aggregate: + description: List of VLANs definitions. + type: list + elements: dict + suboptions: + vlan_id: + description: + - Single VLAN ID. + required: True + type: int + vlan_range: + description: + - Range of VLANs such as 2-10 or 2,5,10-15, etc. + type: str + name: + description: + - Name of VLAN or keyword 'default'. + type: str + interfaces: + description: + - List of interfaces that should be associated to the VLAN or keyword 'default'. + type: list + elements: str + associated_interfaces: + description: + - This is a intent option and checks the operational state of the for given vlan + C(name) for associated interfaces. If the value in the C(associated_interfaces) + does not match with the operational state of vlan interfaces on device it will + result in failure. + type: list + elements: str + vlan_state: + description: + - Manage the vlan operational state of the VLAN + choices: + - active + - suspend + type: str + admin_state: + description: + - Manage the VLAN administrative state of the VLAN equivalent to shut/no shut + in VLAN config mode. + choices: + - up + - down + type: str + mapped_vni: + description: + - The Virtual Network Identifier (VNI) ID that is mapped to the VLAN. Valid values + are integer and keyword 'default'. Range 4096-16773119. + type: str + mode: + description: + - Set VLAN mode to classical ethernet or fabricpath. This is a valid option for + Nexus 5000 and 7000 series. + choices: + - ce + - fabricpath + type: str + delay: + description: + - Time in seconds to wait before checking for the operational state on remote + device. This wait is applicable for operational state arguments. + type: int + state: + description: + - Manage the state of the resource. + choices: + - present + - absent + type: str + state: + description: + - Manage the state of the resource. + default: present + choices: + - present + - absent + type: str + mode: + description: + - Set VLAN mode to classical ethernet or fabricpath. This is a valid option for + Nexus 5000 and 7000 series. + choices: + - ce + - fabricpath + default: ce + type: str + purge: + description: + - Purge VLANs not defined in the I(aggregate) parameter. This parameter can be + used without aggregate as well. + - Removal of Vlan 1 is not allowed and will be ignored by purge. + type: bool + default: no + delay: + description: + - Time in seconds to wait before checking for the operational state on remote + device. This wait is applicable for operational state arguments. + default: 10 + type: int + + +""" + +EXAMPLES = """ +- name: Ensure a range of VLANs are not present on the switch + cisco.nxos.nxos_vlan: + vlan_range: 2-10,20,50,55-60,100-150 + state: absent + +- name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state + cisco.nxos.nxos_vlan: + vlan_id: 50 + admin_state: down + name: WEB + +- name: Ensure VLAN is NOT on the device + cisco.nxos.nxos_vlan: + vlan_id: 50 + state: absent + +- name: Add interfaces to VLAN and check intent (config + intent) + cisco.nxos.nxos_vlan: + vlan_id: 100 + interfaces: + - Ethernet2/1 + - Ethernet2/5 + associated_interfaces: + - Ethernet2/1 + - Ethernet2/5 + +- name: Check interfaces assigned to VLAN + cisco.nxos.nxos_vlan: + vlan_id: 100 + associated_interfaces: + - Ethernet2/1 + - Ethernet2/5 + +- name: Create aggregate of vlans + cisco.nxos.nxos_vlan: + aggregate: + - {vlan_id: 4000, mode: ce} + - {vlan_id: 4001, name: vlan-4001} + +- name: purge vlans - removes all other vlans except the ones mentioned in aggregate) + cisco.nxos.nxos_vlan: + aggregate: + - vlan_id: 1 + - vlan_id: 4001 + purge: yes + +""" + +RETURN = """ +commands: + description: Set of command strings to send to the remote device + returned: always + type: list + sample: ["vlan 20", "vlan 55", "vn-segment 5000"] +""" + +import re +import time + +from copy import deepcopy + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + normalize_interface, + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) + + +def search_obj_in_list(vlan_id, lst): + for o in lst: + if o["vlan_id"] == vlan_id: + return o + + +def get_diff(w, obj): + c = deepcopy(w) + entries = ("interfaces", "associated_interfaces", "delay", "vlan_range") + for key in entries: + if key in c: + del c[key] + + o = deepcopy(obj) + del o["interfaces"] + if o["vlan_id"] == w["vlan_id"]: + diff_dict = dict(set(c.items()) - set(o.items())) + return diff_dict + + +def is_default_name(obj, vlan_id): + cname = obj["name"] + if "VLAN" in cname: + vid = int(cname[4:]) + if vid == int(vlan_id): + return True + + return False + + +def map_obj_to_commands(updates, module): + commands = list() + purge = module.params["purge"] + want, have = updates + info = get_capabilities(module).get("device_info") + os_platform = info.get("network_os_platform") + + for w in want: + vlan_id = w["vlan_id"] + name = w["name"] + interfaces = w.get("interfaces") or [] + mapped_vni = w["mapped_vni"] + mode = w["mode"] + vlan_state = w["vlan_state"] + admin_state = w["admin_state"] + state = w["state"] + del w["state"] + + obj_in_have = search_obj_in_list(vlan_id, have) or {} + if not re.match("N[567]", os_platform) or ( + not obj_in_have.get("mode") and mode == "ce" + ): + mode = w["mode"] = None + + if state == "absent": + if obj_in_have: + commands.append("no vlan {0}".format(vlan_id)) + + elif state == "present": + if not obj_in_have: + commands.append("vlan {0}".format(vlan_id)) + + if name and name != "default": + commands.append("name {0}".format(name)) + if mode: + commands.append("mode {0}".format(mode)) + if vlan_state: + commands.append("state {0}".format(vlan_state)) + if mapped_vni != "None" and mapped_vni != "default": + commands.append("vn-segment {0}".format(mapped_vni)) + if admin_state == "up": + commands.append("no shutdown") + if admin_state == "down": + commands.append("shutdown") + commands.append("exit") + + if interfaces and interfaces[0] != "default": + for i in interfaces: + commands.append("interface {0}".format(i)) + commands.append("switchport") + commands.append("switchport mode access") + commands.append( + "switchport access vlan {0}".format(vlan_id) + ) + + else: + diff = get_diff(w, obj_in_have) + if diff: + commands.append("vlan {0}".format(vlan_id)) + for key, value in diff.items(): + if key == "name": + if name != "default": + if name is not None: + commands.append("name {0}".format(value)) + else: + if not is_default_name(obj_in_have, vlan_id): + commands.append("no name") + if key == "vlan_state" and value: + commands.append("state {0}".format(value)) + if key == "mapped_vni": + if value == "default": + if obj_in_have["mapped_vni"] != "None": + commands.append("no vn-segment") + elif value != "None": + commands.append("vn-segment {0}".format(value)) + if key == "admin_state": + if value == "up": + commands.append("no shutdown") + elif value == "down": + commands.append("shutdown") + if key == "mode" and value: + commands.append("mode {0}".format(value)) + if len(commands) > 1: + commands.append("exit") + else: + del commands[:] + + if interfaces and interfaces[0] != "default": + if not obj_in_have["interfaces"]: + for i in interfaces: + commands.append("vlan {0}".format(vlan_id)) + commands.append("exit") + commands.append("interface {0}".format(i)) + commands.append("switchport") + commands.append("switchport mode access") + commands.append( + "switchport access vlan {0}".format(vlan_id) + ) + + elif set(interfaces) != set(obj_in_have["interfaces"]): + missing_interfaces = list( + set(interfaces) - set(obj_in_have["interfaces"]) + ) + for i in missing_interfaces: + commands.append("vlan {0}".format(vlan_id)) + commands.append("exit") + commands.append("interface {0}".format(i)) + commands.append("switchport") + commands.append("switchport mode access") + commands.append( + "switchport access vlan {0}".format(vlan_id) + ) + + superfluous_interfaces = list( + set(obj_in_have["interfaces"]) - set(interfaces) + ) + for i in superfluous_interfaces: + commands.append("vlan {0}".format(vlan_id)) + commands.append("exit") + commands.append("interface {0}".format(i)) + commands.append("switchport") + commands.append("switchport mode access") + commands.append( + "no switchport access vlan {0}".format(vlan_id) + ) + + elif interfaces and interfaces[0] == "default": + if obj_in_have["interfaces"]: + for i in obj_in_have["interfaces"]: + commands.append("vlan {0}".format(vlan_id)) + commands.append("exit") + commands.append("interface {0}".format(i)) + commands.append("switchport") + commands.append("switchport mode access") + commands.append( + "no switchport access vlan {0}".format(vlan_id) + ) + + if purge: + for h in have: + if h["vlan_id"] == "1": + module.warn( + "Deletion of vlan 1 is not allowed; purge will ignore vlan 1" + ) + continue + obj_in_want = search_obj_in_list(h["vlan_id"], want) + if not obj_in_want: + commands.append("no vlan {0}".format(h["vlan_id"])) + + return commands + + +def want_vlan_list(module): + result = [] + vlan_range = module.params["vlan_range"] + for part in vlan_range.split(","): + if part == "none": + break + if "-" in part: + start, end = part.split("-") + start, end = int(start), int(end) + result.extend([str(i) for i in range(start, end + 1)]) + else: + result.append(part) + return result + + +def have_vlan_list(have): + result = [] + if have: + for h in have: + result.append(str(h.get("vlan_id"))) + return result + + +def vlan_range_commands(module, have): + commands = list() + proposed_vlans_list = want_vlan_list(module) + existing_vlans_list = have_vlan_list(have) + + if module.params["state"] == "absent": + vlans = set(proposed_vlans_list).intersection(existing_vlans_list) + for vlan in vlans: + commands.append("no vlan {0}".format(vlan)) + + elif module.params["state"] == "present": + vlans = set(proposed_vlans_list).difference(existing_vlans_list) + for vlan in vlans: + commands.append("vlan {0}".format(vlan)) + + return commands + + +def normalize(interfaces): + normalized = None + if interfaces: + normalized = [normalize_interface(i) for i in interfaces] + return normalized + + +def map_params_to_obj(module): + obj = [] + if module.params["vlan_range"]: + return [] + + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + d["vlan_id"] = str(d["vlan_id"]) + d["mapped_vni"] = str(d["mapped_vni"]) + d["interfaces"] = normalize(d["interfaces"]) + d["associated_interfaces"] = normalize(d["associated_interfaces"]) + + obj.append(d) + else: + interfaces = normalize(module.params["interfaces"]) + associated_interfaces = normalize( + module.params["associated_interfaces"] + ) + + obj.append( + { + "vlan_id": str(module.params["vlan_id"]), + "name": module.params["name"], + "interfaces": interfaces, + "vlan_state": module.params["vlan_state"], + "mapped_vni": str(module.params["mapped_vni"]), + "state": module.params["state"], + "admin_state": module.params["admin_state"], + "mode": module.params["mode"], + "associated_interfaces": associated_interfaces, + } + ) + + return obj + + +def parse_admin_state(vlan): + shutstate = vlan.get("vlanshowbr-shutstate") + if shutstate == "noshutdown": + return "up" + elif shutstate == "shutdown": + return "down" + + +def parse_mode(config): + mode = None + + if config: + match = re.search(r"mode (\S+)", config) + if match: + mode = match.group(1) + return mode + + +def parse_vni(config): + vni = None + + if config: + match = re.search(r"vn-segment (\S+)", config) + if match: + vni = match.group(1) + return str(vni) + + +def get_vlan_int(interfaces): + vlan_int = [] + for i in interfaces.split(","): + if "eth" in i.lower() and "-" in i: + int_range = i.split("-") + stop = int((int_range)[1]) + start = int(int_range[0].split("/")[1]) + eth = int_range[0].split("/")[0] + for r in range(start, stop + 1): + vlan_int.append(eth + "/" + str(r)) + else: + vlan_int.append(i) + return vlan_int + + +def parse_interfaces(module, vlan): + vlan_int = [] + interfaces = vlan.get("vlanshowplist-ifidx") + if interfaces: + if isinstance(interfaces, list): + interfaces_list = [i.strip() for i in interfaces] + interfaces_str = ",".join(interfaces_list) + vlan_int = get_vlan_int(interfaces_str) + else: + vlan_int = get_vlan_int(interfaces) + return vlan_int + + +def parse_vlan_config(netcfg, vlan_id): + parents = ["vlan {0}".format(vlan_id)] + config = netcfg.get_section(parents) + return config + + +def parse_vlan_options(module, netcfg, output, vlan): + obj = {} + vlan_id = vlan["vlanshowbr-vlanid-utf"] + config = parse_vlan_config(netcfg, vlan_id) + + obj["vlan_id"] = str(vlan_id) + obj["name"] = vlan.get("vlanshowbr-vlanname") + obj["vlan_state"] = vlan.get("vlanshowbr-vlanstate") + obj["admin_state"] = parse_admin_state(vlan) + obj["mode"] = parse_mode(config) + obj["mapped_vni"] = parse_vni(config) + obj["interfaces"] = parse_interfaces(module, vlan) + return obj + + +def parse_vlan_non_structured(module, netcfg, vlans): + objs = list() + + for vlan in vlans: + vlan_match = re.search(r"(\d+)", vlan, re.M) + if vlan_match: + obj = {} + vlan_id = vlan_match.group(1) + obj["vlan_id"] = str(vlan_id) + + name_match = re.search(r"{0}\s*(\S+)".format(vlan_id), vlan, re.M) + if name_match: + name = name_match.group(1) + obj["name"] = name + state_match = re.search( + r"{0}\s*{1}\s*(\S+)".format(vlan_id, re.escape(name)), + vlan, + re.M, + ) + if state_match: + vlan_state_match = state_match.group(1) + if vlan_state_match == "suspended": + vlan_state = "suspend" + admin_state = "up" + elif vlan_state_match == "sus/lshut": + vlan_state = "suspend" + admin_state = "down" + if vlan_state_match == "active": + vlan_state = "active" + admin_state = "up" + if vlan_state_match == "act/lshut": + vlan_state = "active" + admin_state = "down" + + obj["vlan_state"] = vlan_state + obj["admin_state"] = admin_state + + vlan = ",".join(vlan.splitlines()) + interfaces = list() + intfs_match = re.search( + r"{0}\s*{1}\s*{2}\s*(.*)".format( + vlan_id, re.escape(name), vlan_state_match + ), + vlan, + re.M, + ) + if intfs_match: + intfs = intfs_match.group(1) + intfs = intfs.split() + for i in intfs: + intf = normalize_interface(i.strip(",")) + interfaces.append(intf) + + if interfaces: + obj["interfaces"] = interfaces + else: + obj["interfaces"] = None + + config = parse_vlan_config(netcfg, vlan_id) + obj["mode"] = parse_mode(config) + obj["mapped_vni"] = parse_vni(config) + + objs.append(obj) + + return objs + + +def map_config_to_obj(module): + objs = list() + output = None + + command = ["show vlan brief | json"] + output = run_commands(module, command, check_rc="retry_json")[0] + if output: + netcfg = CustomNetworkConfig( + indent=2, contents=get_config(module, flags=["all"]) + ) + + if isinstance(output, dict): + vlans = None + try: + vlans = output["TABLE_vlanbriefxbrief"]["ROW_vlanbriefxbrief"] + except KeyError: + return objs + + if vlans: + if isinstance(vlans, list): + for vlan in vlans: + obj = parse_vlan_options(module, netcfg, output, vlan) + objs.append(obj) + elif isinstance(vlans, dict): + obj = parse_vlan_options(module, netcfg, output, vlans) + objs.append(obj) + else: + vlans = list() + splitted_line = re.split(r"\n(\d+)|\n{2}", output.strip()) + + for line in splitted_line: + if not line: + continue + if len(line) > 0: + line = line.strip() + if line[0].isdigit(): + match = re.search(r"^(\d+)$", line, re.M) + if match: + v = match.group(1) + pos1 = splitted_line.index(v) + pos2 = pos1 + 1 + # fmt: off + vlaninfo = "".join(splitted_line[pos1: pos2 + 1]) + # fmt: on + vlans.append(vlaninfo) + + if vlans: + objs = parse_vlan_non_structured(module, netcfg, vlans) + else: + return objs + + return objs + + +def check_declarative_intent_params(want, module, result): + + have = None + is_delay = False + + for w in want: + if w.get("associated_interfaces") is None: + continue + + if result["changed"] and not is_delay: + time.sleep(module.params["delay"]) + is_delay = True + + if have is None: + have = map_config_to_obj(module) + + for i in w["associated_interfaces"]: + obj_in_have = search_obj_in_list(w["vlan_id"], have) + if ( + obj_in_have + and "interfaces" in obj_in_have + and i not in obj_in_have["interfaces"] + ): + module.fail_json( + msg="Interface %s not configured on vlan %s" + % (i, w["vlan_id"]) + ) + + +def main(): + """ main entry point for module execution + """ + element_spec = dict( + vlan_id=dict(required=False, type="int"), + vlan_range=dict(required=False), + name=dict(required=False), + interfaces=dict(type="list", elements="str"), + associated_interfaces=dict(type="list", elements="str"), + vlan_state=dict( + choices=["active", "suspend"], required=False, default="active" + ), + mapped_vni=dict(required=False), + delay=dict(default=10, type="int"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + admin_state=dict(choices=["up", "down"], required=False, default="up"), + mode=dict(default="ce", choices=["ce", "fabricpath"]), + ) + + aggregate_spec = deepcopy(element_spec) + aggregate_spec["vlan_id"] = dict(required=True, type="int") + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec), + purge=dict(default=False, type="bool"), + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + required_one_of = [["vlan_id", "aggregate", "vlan_range"]] + mutually_exclusive = [ + ["vlan_id", "aggregate"], + ["vlan_range", "name"], + ["vlan_id", "vlan_range"], + ] + + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + have = map_config_to_obj(module) + want = map_params_to_obj(module) + + if module.params["vlan_range"]: + commands = vlan_range_commands(module, have) + result["commands"] = commands + else: + commands = map_obj_to_commands((want, have), module) + result["commands"] = commands + + if commands: + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + if want: + check_declarative_intent_params(want, module, result) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlans.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlans.py new file mode 100644 index 00000000..8cc4ca90 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vlans.py @@ -0,0 +1,438 @@ +#!/usr/bin/python +# -*- 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 module file for nxos_vlans +""" + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = """ +module: nxos_vlans +short_description: VLANs resource module +description: This module creates and manages VLAN configurations on Cisco NX-OS. +version_added: 1.0.0 +author: Trishna Guha (@trishnaguha) +notes: +- Tested against NXOS 7.3.(0)D1(1) on VIRL +options: + running_config: + description: + - This option is used only with state I(parsed). + - The value of this option should be the output received from the NX-OS device + by executing the commands B(show vlans | json-pretty) and B(show running-config + | section ^vlan) in order and delimited by a line. + - The state I(parsed) reads the configuration from C(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 I(parsed) key within the result. + type: str + config: + description: A dictionary of Vlan options + type: list + elements: dict + suboptions: + vlan_id: + description: + - Vlan ID. + type: int + required: true + name: + description: + - Name of VLAN. + type: str + state: + description: + - Manage operational state of the vlan. + type: str + choices: + - active + - suspend + enabled: + description: + - Manage administrative state of the vlan. + type: bool + mode: + description: + - Set vlan mode to classical ethernet or fabricpath. This is a valid option + for Nexus 5000, 6000 and 7000 series. + type: str + choices: + - ce + - fabricpath + mapped_vni: + description: + - The Virtual Network Identifier (VNI) ID that is mapped to the VLAN. + type: int + state: + description: + - The state of the configuration after module completion. + - The state I(overridden) would override the configuration of all the + VLANs on the device (including VLAN 1) with the provided configuration in + the task. Use caution with this state. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged + +""" +EXAMPLES = """ +# Using merged + +# Before state: +# ------------- +# vlan 1 + +- name: Merge provided configuration with device configuration. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: test-vlan5 + - vlan_id: 10 + enabled: false + state: merged + +# After state: +# ------------ +# vlan 5 +# name test-vlan5 +# state active +# no shutdown +# vlan 10 +# state active +# shutdown + + +# Using replaced + +# Before state: +# ------------- +# vlan 1 +# vlan 5 +# name test-vlan5 +# vlan 10 +# shutdown + +- name: Replace device configuration of specified vlan with provided configuration. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: test-vlan + enabled: false + - vlan_id: 10 + enabled: false + state: replaced + +# After state: +# ------------ +# vlan 1 +# vlan 5 +# name test-vlan +# state active +# shutdown +# vlan 10 +# state active +# shutdown + + +# Using overridden + +# Before state: +# ------------- +# vlan 1 +# vlan 3 +# name testing +# vlan 5 +# name test-vlan5 +# shutdown +# vlan 10 +# shutdown + +- name: Override device configuration of all vlans with provided configuration. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: test-vlan + - vlan_id: 10 + state: active + state: overridden + +# After state: +# ------------ +# vlan 5 +# name test-vlan +# state active +# no shutdown +# vlan 10 +# state active +# no shutdown + + +# Using deleted + +# Before state: +# ------------- +# vlan 1 +# vlan 5 +# vlan 10 + +- name: Delete vlans. + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + - vlan_id: 10 + state: deleted + +# After state: +# ------------ +# + +# Using rendered + +- name: Use rendered state to convert task input to device specific commands + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: vlan5 + mapped_vni: 100 + + - vlan_id: 6 + name: vlan6 + state: suspend + state: rendered + +# Task Output (redacted) +# ----------------------- + +# rendered: +# - vlan 5 +# - name vlan5 +# - vn-segment 100 +# - vlan 6 +# - name vlan6 +# - state suspend + +# Using parsed + +# parsed.cfg +# ------------ +# { +# "TABLE_vlanbrief": { +# "ROW_vlanbrief": [ +# { +# "vlanshowbr-vlanid": "1", +# "vlanshowbr-vlanid-utf": "1", +# "vlanshowbr-vlanname": "default", +# "vlanshowbr-vlanstate": "active", +# "vlanshowbr-shutstate": "noshutdown" +# }, +# { +# "vlanshowbr-vlanid": "5", +# "vlanshowbr-vlanid-utf": "5", +# "vlanshowbr-vlanname": "vlan5", +# "vlanshowbr-vlanstate": "suspend", +# "vlanshowbr-shutstate": "noshutdown" +# }, +# { +# "vlanshowbr-vlanid": "6", +# "vlanshowbr-vlanid-utf": "6", +# "vlanshowbr-vlanname": "VLAN0006", +# "vlanshowbr-vlanstate": "active", +# "vlanshowbr-shutstate": "noshutdown" +# }, +# { +# "vlanshowbr-vlanid": "7", +# "vlanshowbr-vlanid-utf": "7", +# "vlanshowbr-vlanname": "vlan7", +# "vlanshowbr-vlanstate": "active", +# "vlanshowbr-shutstate": "noshutdown" +# } +# ] +# }, +# "TABLE_mtuinfo": { +# "ROW_mtuinfo": [ +# { +# "vlanshowinfo-vlanid": "1", +# "vlanshowinfo-media-type": "enet", +# "vlanshowinfo-vlanmode": "ce-vlan" +# }, +# { +# "vlanshowinfo-vlanid": "5", +# "vlanshowinfo-media-type": "enet", +# "vlanshowinfo-vlanmode": "ce-vlan" +# }, +# { +# "vlanshowinfo-vlanid": "6", +# "vlanshowinfo-media-type": "enet", +# "vlanshowinfo-vlanmode": "ce-vlan" +# }, +# { +# "vlanshowinfo-vlanid": "7", +# "vlanshowinfo-media-type": "enet", +# "vlanshowinfo-vlanmode": "ce-vlan" +# } +# ] +# } +# } +# +# vlan 1,5-7 +# vlan 5 +# state suspend +# name vlan5 +# vlan 7 +# name vlan7 +# vn-segment 100 + +- name: Use parsed state to convert externally supplied config to structured format + cisco.nxos.nxos_vlans: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + +# Task output (redacted) +# ----------------------- + +# parsed: +# - vlan_id: 5 +# enabled: True +# mode: "ce" +# name: "vlan5" +# state: suspend +# +# - vlan_id: 6 +# enabled: True +# mode: "ce" +# state: active +# +# - vlan_id: 7 +# enabled: True +# mode: "ce" +# name: "vlan7" +# state: active +# mapped_vni: 100 + +# Using gathered + +# Existing device config state +# ------------------------------- +# nxos-9k# show vlan | json +# {"TABLE_vlanbrief": {"ROW_vlanbrief": [{"vlanshowbr-vlanid": "1", "vlanshowbr-vlanid-utf": "1", "vlanshowbr-vlanname": "default", "vlanshowbr-vlanstate +# ": "active", "vlanshowbr-shutstate": "noshutdown"}, {"vlanshowbr-vlanid": "5", "vlanshowbr-vlanid-utf": "5", "vlanshowbr-vlanname": "vlan5", "vlanshowb +# r-vlanstate": "suspend", "vlanshowbr-shutstate": "noshutdown"}, {"vlanshowbr-vlanid": "6", "vlanshowbr-vlanid-utf": "6", "vlanshowbr-vlanname": "VLAN00 +# 06", "vlanshowbr-vlanstate": "active", "vlanshowbr-shutstate": "noshutdown"}, {"vlanshowbr-vlanid": "7", "vlanshowbr-vlanid-utf": "7", "vlanshowbr-vlan +# name": "vlan7", "vlanshowbr-vlanstate": "active", "vlanshowbr-shutstate": "shutdown"}]}, "TABLE_mtuinfo": {"ROW_mtuinfo": [{"vlanshowinfo-vlanid": "1", +# "vlanshowinfo-media-type": "enet", "vlanshowinfo-vlanmode": "ce-vlan"}, {"vlanshowinfo-vlanid": "5", "vlanshowinfo-media-type": "enet", "vlanshowinfo- +# vlanmode": "ce-vlan"}, {"vlanshowinfo-vlanid": "6", "vlanshowinfo-media-type": "enet", "vlanshowinfo-vlanmode": "ce-vlan"}, {"vlanshowinfo-vlanid": "7" +# , "vlanshowinfo-media-type": "enet", "vlanshowinfo-vlanmode": "ce-vlan"}]}} +# +# nxos-9k# show running-config | section ^vlan +# vlan 1,5-7 +# vlan 5 +# state suspend +# name vlan5 +# vlan 7 +# shutdown +# name vlan7 +# vn-segment 190 + +- name: Gather vlans facts from the device using nxos_vlans + cisco.nxos.nxos_vlans: + state: gathered + +# Task output (redacted) +# ----------------------- +# gathered: +# - vlan_id: 5 +# enabled: True +# mode: "ce" +# name: "vlan5" +# state: suspend +# +# - vlan_id: 6 +# enabled: True +# mode: "ce" +# state: active +# +# - vlan_id: 7 +# enabled: False +# mode: "ce" +# name: "vlan7" +# state: active +# mapped_vni: 190 +""" +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +commands: + description: The set of commands pushed to the remote device. + returned: always + type: list + sample: ['vlan 5', 'name test-vlan5', 'state suspend'] +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.vlans.vlans import ( + VlansArgs, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.vlans.vlans import ( + Vlans, +) + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + module = AnsibleModule( + argument_spec=VlansArgs.argument_spec, supports_check_mode=True + ) + + result = Vlans(module).execute_module() + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc.py new file mode 100644 index 00000000..635af126 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc.py @@ -0,0 +1,482 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vpc +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages global VPC configuration +description: +- Manages global VPC configuration +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- The feature vpc must be enabled before this module can be used +- If not using management vrf, vrf must be globally on the device before using in + the pkl config +- Although source IP isn't required on the command line it is required when using + this module. The PKL VRF must also be configured prior to using this module. +- Both pkl_src and pkl_dest are needed when changing PKL VRF. +options: + domain: + description: + - VPC domain + required: true + type: str + role_priority: + description: + - Role priority for device. Remember lower is better. + type: str + system_priority: + description: + - System priority device. Remember they must match between peers. + type: str + pkl_src: + description: + - Source IP address used for peer keepalive link + type: str + pkl_dest: + description: + - Destination (remote) IP address used for peer keepalive link + - pkl_dest is required whenever pkl options are used. + type: str + pkl_vrf: + description: + - VRF used for peer keepalive link + - The VRF must exist on the device before using pkl_vrf. + - "(Note) 'default' is an overloaded term: Default vrf context for pkl_vrf is + 'management'; 'pkl_vrf: default' refers to the literal 'default' rib." + type: str + peer_gw: + description: + - Enables/Disables peer gateway + type: bool + auto_recovery: + description: + - Enables/Disables auto recovery on platforms that support disable + - timers are not modifiable with this attribute + - mutually exclusive with auto_recovery_reload_delay + type: bool + auto_recovery_reload_delay: + description: + - Manages auto-recovery reload-delay timer in seconds + - mutually exclusive with auto_recovery + type: str + delay_restore: + description: + - manages delay restore command and config value in seconds + type: str + delay_restore_interface_vlan: + description: + - manages delay restore interface-vlan command and config value in seconds + - not supported on all platforms + type: str + delay_restore_orphan_port: + description: + - manages delay restore orphan-port command and config value in seconds + - not supported on all platforms + type: str + state: + description: + - Manages desired state of the resource + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- name: configure a simple asn + cisco.nxos.nxos_vpc: + domain: 100 + role_priority: 1000 + system_priority: 2000 + pkl_dest: 192.168.100.4 + pkl_src: 10.1.100.20 + peer_gw: true + auto_recovery: true + +- name: configure + cisco.nxos.nxos_vpc: + domain: 100 + role_priority: 32667 + system_priority: 2000 + peer_gw: true + pkl_src: 10.1.100.2 + pkl_dest: 192.168.100.4 + auto_recovery: true + +- name: Configure VPC with delay restore and existing keepalive VRF + cisco.nxos.nxos_vpc: + domain: 10 + role_priority: 28672 + system_priority: 2000 + delay_restore: 180 + peer_gw: true + pkl_src: 1.1.1.2 + pkl_dest: 1.1.1.1 + pkl_vrf: vpckeepalive + auto_recovery: true +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["vpc domain 100", + "peer-keepalive destination 192.168.100.4 source 10.1.100.20 vrf management", + "auto-recovery", "peer-gateway"] +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +CONFIG_ARGS = { + "role_priority": "role priority {role_priority}", + "system_priority": "system-priority {system_priority}", + "delay_restore": "delay restore {delay_restore}", + "delay_restore_interface_vlan": "delay restore interface-vlan {delay_restore_interface_vlan}", + "delay_restore_orphan_port": "delay restore orphan-port {delay_restore_orphan_port}", + "peer_gw": "{peer_gw} peer-gateway", + "auto_recovery": "{auto_recovery} auto-recovery", + "auto_recovery_reload_delay": "auto-recovery reload-delay {auto_recovery_reload_delay}", +} + +PARAM_TO_DEFAULT_KEYMAP = { + "delay_restore": "60", + "delay_restore_interface_vlan": "10", + "delay_restore_orphan_port": "0", + "role_priority": "32667", + "system_priority": "32667", + "peer_gw": False, + "auto_recovery_reload_delay": 240, +} + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_vrf_list(module): + + try: + body = run_commands(module, ["show vrf all | json"])[0] + vrf_table = body["TABLE_vrf"]["ROW_vrf"] + except (KeyError, AttributeError): + return [] + + vrf_list = [] + if vrf_table: + for each in vrf_table: + vrf_list.append(str(each["vrf_name"].lower())) + + return vrf_list + + +def get_auto_recovery_default(module): + auto = False + data = run_commands(module, ["show inventory | json"])[0] + pid = data["TABLE_inv"]["ROW_inv"][0]["productid"] + if re.search(r"N7K", pid): + auto = True + elif re.search(r"N9K", pid): + data = run_commands(module, ["show hardware | json"])[0] + ver = data["kickstart_ver_str"] + if re.search(r"7.0\(3\)F", ver): + auto = True + + return auto + + +def get_vpc(module): + body = run_commands(module, ["show vpc | json"])[0] + if body: + domain = str(body["vpc-domain-id"]) + else: + body = run_commands(module, ["show run vpc | inc domain"])[0] + if body: + domain = body.split()[2] + else: + domain = "not configured" + + vpc = {} + if domain != "not configured": + run = get_config(module, flags=["vpc all"]) + if run: + vpc["domain"] = domain + for key in PARAM_TO_DEFAULT_KEYMAP.keys(): + vpc[key] = PARAM_TO_DEFAULT_KEYMAP.get(key) + vpc["auto_recovery"] = get_auto_recovery_default(module) + vpc_list = run.split("\n") + for each in vpc_list: + if "role priority" in each: + line = each.split() + vpc["role_priority"] = line[-1] + if "system-priority" in each: + line = each.split() + vpc["system_priority"] = line[-1] + if re.search(r"delay restore \d+", each): + line = each.split() + vpc["delay_restore"] = line[-1] + if "delay restore interface-vlan" in each: + line = each.split() + vpc["delay_restore_interface_vlan"] = line[-1] + if "delay restore orphan-port" in each: + line = each.split() + vpc["delay_restore_orphan_port"] = line[-1] + if "auto-recovery" in each: + vpc["auto_recovery"] = False if "no " in each else True + line = each.split() + vpc["auto_recovery_reload_delay"] = line[-1] + if "peer-gateway" in each: + vpc["peer_gw"] = False if "no " in each else True + if "peer-keepalive destination" in each: + # destination is reqd; src & vrf are optional + m = re.search( + r"destination (?P[\d.]+)" + r"(?:.* source (?P[\d.]+))*" + r"(?:.* vrf (?P\S+))*", + each, + ) + if m: + for pkl in m.groupdict().keys(): + if m.group(pkl): + vpc[pkl] = m.group(pkl) + return vpc + + +def pkl_dependencies(module, delta, existing): + """peer-keepalive dependency checking. + 1. 'destination' is required with all pkl configs. + 2. If delta has optional pkl keywords present, then all optional pkl + keywords in existing must be added to delta, otherwise the device cli + will remove those values when the new config string is issued. + 3. The desired behavior for this set of properties is to merge changes; + therefore if an optional pkl property exists on the device but not + in the playbook, then that existing property should be retained. + Example: + CLI: peer-keepalive dest 10.1.1.1 source 10.1.1.2 vrf orange + Playbook: {pkl_dest: 10.1.1.1, pkl_vrf: blue} + Result: peer-keepalive dest 10.1.1.1 source 10.1.1.2 vrf blue + """ + pkl_existing = [i for i in existing.keys() if i.startswith("pkl")] + for pkl in pkl_existing: + param = module.params.get(pkl) + if not delta.get(pkl): + if param and param == existing[pkl]: + # delta is missing this param because it's idempotent; + # however another pkl command has changed; therefore + # explicitly add it to delta so that the cli retains it. + delta[pkl] = existing[pkl] + elif param is None and existing[pkl]: + # retain existing pkl commands even if not in playbook + delta[pkl] = existing[pkl] + + +def get_commands_to_config_vpc(module, vpc, domain, existing): + vpc = dict(vpc) + + domain_only = vpc.get("domain") + + commands = [] + if "pkl_dest" in vpc: + pkl_command = "peer-keepalive destination {pkl_dest}".format(**vpc) + if "pkl_src" in vpc: + pkl_command += " source {pkl_src}".format(**vpc) + if "pkl_vrf" in vpc: + pkl_command += " vrf {pkl_vrf}".format(**vpc) + commands.append(pkl_command) + + if "auto_recovery" in vpc: + if not vpc.get("auto_recovery"): + vpc["auto_recovery"] = "no" + else: + vpc["auto_recovery"] = "" + + if "peer_gw" in vpc: + if not vpc.get("peer_gw"): + vpc["peer_gw"] = "no" + else: + vpc["peer_gw"] = "" + + for param in vpc: + command = CONFIG_ARGS.get(param) + if command is not None: + command = command.format(**vpc).strip() + if "peer-gateway" in command: + commands.append("terminal dont-ask") + commands.append(command) + + if commands or domain_only: + commands.insert(0, "vpc domain {0}".format(domain)) + return commands + + +def main(): + argument_spec = dict( + domain=dict(required=True, type="str"), + role_priority=dict(required=False, type="str"), + system_priority=dict(required=False, type="str"), + pkl_src=dict(required=False), + pkl_dest=dict(required=False), + pkl_vrf=dict(required=False), + peer_gw=dict(required=False, type="bool"), + auto_recovery=dict(required=False, type="bool"), + auto_recovery_reload_delay=dict(required=False, type="str"), + delay_restore=dict(required=False, type="str"), + delay_restore_interface_vlan=dict(required=False, type="str"), + delay_restore_orphan_port=dict(required=False, type="str"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + mutually_exclusive = [("auto_recovery", "auto_recovery_reload_delay")] + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + results = {"changed": False, "warnings": warnings} + + domain = module.params["domain"] + role_priority = module.params["role_priority"] + system_priority = module.params["system_priority"] + pkl_src = module.params["pkl_src"] + pkl_dest = module.params["pkl_dest"] + pkl_vrf = module.params["pkl_vrf"] + peer_gw = module.params["peer_gw"] + auto_recovery = module.params["auto_recovery"] + auto_recovery_reload_delay = module.params["auto_recovery_reload_delay"] + delay_restore = module.params["delay_restore"] + delay_restore_interface_vlan = module.params[ + "delay_restore_interface_vlan" + ] + delay_restore_orphan_port = module.params["delay_restore_orphan_port"] + state = module.params["state"] + + args = dict( + domain=domain, + role_priority=role_priority, + system_priority=system_priority, + pkl_src=pkl_src, + pkl_dest=pkl_dest, + pkl_vrf=pkl_vrf, + peer_gw=peer_gw, + auto_recovery=auto_recovery, + auto_recovery_reload_delay=auto_recovery_reload_delay, + delay_restore=delay_restore, + delay_restore_interface_vlan=delay_restore_interface_vlan, + delay_restore_orphan_port=delay_restore_orphan_port, + ) + + if not pkl_dest: + if pkl_src: + module.fail_json( + msg="dest IP for peer-keepalive is required" + " when src IP is present" + ) + elif pkl_vrf: + if pkl_vrf != "management": + module.fail_json( + msg="dest and src IP for peer-keepalive are required" + " when vrf is present" + ) + else: + module.fail_json( + msg="dest IP for peer-keepalive is required" + " when vrf is present" + ) + if pkl_vrf: + if pkl_vrf.lower() not in get_vrf_list(module): + module.fail_json( + msg="The VRF you are trying to use for the peer " + "keepalive link is not on device yet. Add it" + " first, please." + ) + proposed = dict((k, v) for k, v in args.items() if v is not None) + existing = get_vpc(module) + + commands = [] + if state == "present": + delta = {} + for key, value in proposed.items(): + if str(value).lower() == "default" and key != "pkl_vrf": + # 'default' is a reserved word for vrf + value = PARAM_TO_DEFAULT_KEYMAP.get(key) + if existing.get(key) != value: + delta[key] = value + + if delta: + pkl_dependencies(module, delta, existing) + command = get_commands_to_config_vpc( + module, delta, domain, existing + ) + commands.append(command) + elif state == "absent": + if existing: + if domain != existing["domain"]: + module.fail_json( + msg="You are trying to remove a domain that " + "does not exist on the device" + ) + else: + commands.append("terminal dont-ask") + commands.append("no vpc domain {0}".format(domain)) + + cmds = flatten_list(commands) + results["commands"] = cmds + + if cmds: + results["changed"] = True + if not module.check_mode: + load_config(module, cmds) + if "configure" in cmds: + cmds.pop(0) + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc_interface.py new file mode 100644 index 00000000..034582ea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vpc_interface.py @@ -0,0 +1,353 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vpc_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages interface VPC configuration +description: +- Manages interface VPC configuration +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Either vpc or peer_link param is required, but not both. +- C(state=absent) removes whatever VPC config is on a port-channel if one exists. +- Re-assigning a vpc or peerlink from one portchannel to another is not supported. The + module will force the user to unconfigure an existing vpc/pl before configuring + the same value on a new portchannel +options: + portchannel: + description: + - Group number of the portchannel that will be configured. + required: true + type: str + vpc: + description: + - VPC group/id that will be configured on associated portchannel. + type: str + peer_link: + description: + - Set to true/false for peer link config on associated portchannel. + type: bool + state: + description: + - Manages desired state of the resource. + choices: + - present + - absent + default: present + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_vpc_interface: + portchannel: 10 + vpc: 100 +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface port-channel100", "vpc 10"] +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_portchannel_list(module): + portchannels = [] + pc_list = [] + + try: + body = run_commands(module, ["show port-channel summary | json"])[0] + pc_list = body["TABLE_channel"]["ROW_channel"] + except (KeyError, AttributeError, TypeError): + return portchannels + + if pc_list: + if isinstance(pc_list, dict): + pc_list = [pc_list] + + for pc in pc_list: + portchannels.append(pc["group"]) + + return portchannels + + +def get_existing_portchannel_to_vpc_mappings(module): + pc_vpc_mapping = {} + + try: + body = run_commands(module, ["show vpc brief | json"])[0] + vpc_table = body["TABLE_vpc"]["ROW_vpc"] + except (KeyError, AttributeError, TypeError): + vpc_table = None + + if vpc_table: + if isinstance(vpc_table, dict): + vpc_table = [vpc_table] + + for vpc in vpc_table: + pc_vpc_mapping[str(vpc["vpc-id"])] = str(vpc["vpc-ifindex"]) + + return pc_vpc_mapping + + +def peer_link_exists(module): + found = False + run = get_config(module, flags=["vpc"]) + + vpc_list = run.split("\n") + for each in vpc_list: + if "peer-link" in each: + found = True + return found + + +def get_active_vpc_peer_link(module): + peer_link = None + + try: + body = run_commands(module, ["show vpc brief | json"])[0] + peer_link = body["TABLE_peerlink"]["ROW_peerlink"]["peerlink-ifindex"] + except (KeyError, AttributeError, TypeError): + return peer_link + + return peer_link + + +def get_portchannel_vpc_config(module, portchannel): + peer_link_pc = None + peer_link = False + vpc = "" + pc = "" + config = {} + + try: + body = run_commands(module, ["show vpc brief | json"])[0] + table = body["TABLE_peerlink"]["ROW_peerlink"] + except (KeyError, AttributeError, TypeError): + table = {} + + if table: + peer_link_pc = table.get("peerlink-ifindex", None) + + if peer_link_pc: + plpc = str(peer_link_pc[2:]) + if portchannel == plpc: + config["portchannel"] = portchannel + config["peer-link"] = True + config["vpc"] = vpc + + mapping = get_existing_portchannel_to_vpc_mappings(module) + + for existing_vpc, port_channel in mapping.items(): + port_ch = str(port_channel[2:]) + if port_ch == portchannel: + pc = port_ch + vpc = str(existing_vpc) + + config["portchannel"] = pc + config["peer-link"] = peer_link + config["vpc"] = vpc + + return config + + +def get_commands_to_config_vpc_interface( + portchannel, delta, config_value, existing +): + commands = [] + + if not delta.get("peer-link") and existing.get("peer-link"): + commands.append("no vpc peer-link") + commands.insert(0, "interface port-channel{0}".format(portchannel)) + + elif delta.get("peer-link") and not existing.get("peer-link"): + commands.append("vpc peer-link") + commands.insert(0, "interface port-channel{0}".format(portchannel)) + + elif delta.get("vpc") and not existing.get("vpc"): + command = "vpc {0}".format(config_value) + commands.append(command) + commands.insert(0, "interface port-channel{0}".format(portchannel)) + + return commands + + +def state_present(portchannel, delta, config_value, existing): + commands = [] + + command = get_commands_to_config_vpc_interface( + portchannel, delta, config_value, existing + ) + commands.append(command) + + return commands + + +def state_absent(portchannel, existing): + commands = [] + if existing.get("vpc"): + command = "no vpc" + commands.append(command) + elif existing.get("peer-link"): + command = "no vpc peer-link" + commands.append(command) + if commands: + commands.insert(0, "interface port-channel{0}".format(portchannel)) + + return commands + + +def main(): + argument_spec = dict( + portchannel=dict(required=True, type="str"), + vpc=dict(required=False, type="str"), + peer_link=dict(required=False, type="bool"), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[["vpc", "peer_link"]], + supports_check_mode=True, + ) + + warnings = list() + commands = [] + results = {"changed": False, "warnings": warnings} + + portchannel = module.params["portchannel"] + vpc = module.params["vpc"] + peer_link = module.params["peer_link"] + state = module.params["state"] + + args = {"portchannel": portchannel, "vpc": vpc, "peer-link": peer_link} + active_peer_link = None + + if portchannel not in get_portchannel_list(module): + if not portchannel.isdigit() or int( + portchannel + ) not in get_portchannel_list(module): + module.fail_json( + msg="The portchannel you are trying to make a" + " VPC or PL is not created yet. " + "Create it first!" + ) + if vpc: + mapping = get_existing_portchannel_to_vpc_mappings(module) + + if vpc in mapping and portchannel != mapping[vpc].strip("Po"): + module.fail_json( + msg="This vpc is already configured on " + "another portchannel. Remove it first " + "before trying to assign it here. ", + existing_portchannel=mapping[vpc], + ) + + for vpcid, existing_pc in mapping.items(): + if portchannel == existing_pc.strip("Po") and vpcid != vpc: + module.fail_json( + msg="This portchannel already has another" + " VPC configured. Remove it first " + "before assigning this one", + existing_vpc=vpcid, + ) + + if peer_link_exists(module): + active_peer_link = get_active_vpc_peer_link(module) + if active_peer_link[-2:] == portchannel: + module.fail_json( + msg="That port channel is the current " + "PEER LINK. Remove it if you want it" + " to be a VPC" + ) + config_value = vpc + + elif peer_link is not None: + if peer_link_exists(module): + active_peer_link = get_active_vpc_peer_link(module)[2::] + if active_peer_link != portchannel: + if peer_link: + module.fail_json( + msg="A peer link already exists on" + " the device. Remove it first", + current_peer_link="Po{0}".format(active_peer_link), + ) + config_value = "peer-link" + + proposed = dict((k, v) for k, v in args.items() if v is not None) + existing = get_portchannel_vpc_config(module, portchannel) + + if state == "present": + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + commands = state_present( + portchannel, delta, config_value, existing + ) + + elif state == "absent" and existing: + commands = state_absent(portchannel, existing) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + load_config(module, cmds) + results["changed"] = True + if "configure" in cmds: + cmds.pop(0) + + results["commands"] = cmds + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf.py new file mode 100644 index 00000000..be6a921c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf.py @@ -0,0 +1,643 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vrf +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages global VRF configuration. +description: +- This module provides declarative management of VRFs on CISCO NXOS network devices. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +- Trishna Guha (@trishnaguha) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Cisco NX-OS creates the default VRF by itself. Therefore, you're not allowed to + use default as I(vrf) name in this module. +- C(vrf) name must be shorter than 32 chars. +- VRF names are not case sensible in NX-OS. Anyway, the name is stored just like it's + inserted by the user and it'll not be changed again unless the VRF is removed and + re-created. i.e. C(vrf=NTC) will create a VRF named NTC, but running it again with + C(vrf=ntc) will not cause a configuration change. +options: + name: + description: + - Name of VRF to be managed. + aliases: + - vrf + type: str + admin_state: + description: + - Administrative state of the VRF. + default: up + choices: + - up + - down + type: str + vni: + description: + - Specify virtual network identifier. Valid values are Integer or keyword 'default'. + type: str + rd: + description: + - VPN Route Distinguisher (RD). Valid values are a string in one of the route-distinguisher + formats (ASN2:NN, ASN4:NN, or IPV4:NN); the keyword 'auto', or the keyword 'default'. + type: str + interfaces: + description: + - List of interfaces to check the VRF has been configured correctly or keyword + 'default'. + type: list + elements: str + associated_interfaces: + description: + - This is a intent option and checks the operational state of the for given vrf + C(name) for associated interfaces. If the value in the C(associated_interfaces) + does not match with the operational state of vrf interfaces on device it will + result in failure. + type: list + elements: str + aggregate: + description: List of VRFs definitions. + type: list + elements: dict + suboptions: + name: + description: + - Name of VRF to be managed. + aliases: + - vrf + type: str + admin_state: + description: + - Administrative state of the VRF. + choices: + - up + - down + type: str + vni: + description: + - Specify virtual network identifier. Valid values are Integer or keyword 'default'. + type: str + rd: + description: + - VPN Route Distinguisher (RD). Valid values are a string in one of the route-distinguisher + formats (ASN2:NN, ASN4:NN, or IPV4:NN); the keyword 'auto', or the keyword 'default'. + type: str + interfaces: + description: + - List of interfaces to check the VRF has been configured correctly or keyword + 'default'. + type: list + elements: str + associated_interfaces: + description: + - This is a intent option and checks the operational state of the for given vrf + C(name) for associated interfaces. If the value in the C(associated_interfaces) + does not match with the operational state of vrf interfaces on device it will + result in failure. + type: list + elements: str + state: + description: + - Manages desired state of the resource. + choices: + - present + - absent + type: str + description: + description: + - Description of the VRF or keyword 'default'. + type: str + delay: + description: + - Time in seconds to wait before checking for the operational state on remote + device. This wait is applicable for operational state arguments. + type: int + purge: + description: + - Purge VRFs not defined in the I(aggregate) parameter. + type: bool + default: no + state: + description: + - Manages desired state of the resource. + default: present + choices: + - present + - absent + type: str + description: + description: + - Description of the VRF or keyword 'default'. + type: str + delay: + description: + - Time in seconds to wait before checking for the operational state on remote + device. This wait is applicable for operational state arguments. + default: 10 + type: int +""" + +EXAMPLES = """ +- name: Ensure ntc VRF exists on switch + cisco.nxos.nxos_vrf: + name: ntc + description: testing + state: present + +- name: Aggregate definition of VRFs + cisco.nxos.nxos_vrf: + aggregate: + - {name: test1, description: Testing, admin_state: down} + - {name: test2, interfaces: Ethernet1/2} + +- name: Aggregate definitions of VRFs with Purge + cisco.nxos.nxos_vrf: + aggregate: + - {name: ntc1, description: purge test1} + - {name: ntc2, description: purge test2} + state: present + purge: yes + +- name: Delete VRFs exist on switch + cisco.nxos.nxos_vrf: + aggregate: + - {name: ntc1} + - {name: ntc2} + state: absent + +- name: Assign interfaces to VRF declaratively + cisco.nxos.nxos_vrf: + name: test1 + interfaces: + - Ethernet2/3 + - Ethernet2/5 + +- name: Check interfaces assigned to VRF + cisco.nxos.nxos_vrf: + name: test1 + associated_interfaces: + - Ethernet2/3 + - Ethernet2/5 + +- name: Ensure VRF is tagged with interface Ethernet2/5 only (Removes from Ethernet2/3) + cisco.nxos.nxos_vrf: + name: test1 + interfaces: + - Ethernet2/5 + +- name: Delete VRF + cisco.nxos.nxos_vrf: + name: ntc + state: absent +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - vrf context ntc + - no shutdown + - interface Ethernet1/2 + - no switchport + - vrf member test2 +""" + +import re +import time + +from copy import deepcopy + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, + get_interface_type, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_default_spec, +) + + +def search_obj_in_list(name, lst): + for o in lst: + if o["name"] == name: + return o + + +def execute_show_command(command, module): + if "show run" not in command: + output = "json" + else: + output = "text" + cmds = [{"command": command, "output": output}] + body = run_commands(module, cmds) + return body + + +def get_existing_vrfs(module): + objs = list() + command = "show vrf all" + try: + body = execute_show_command(command, module)[0] + except IndexError: + return list() + try: + vrf_table = body["TABLE_vrf"]["ROW_vrf"] + except (TypeError, IndexError, KeyError): + return list() + + if isinstance(vrf_table, list): + for vrf in vrf_table: + obj = {} + obj["name"] = vrf["vrf_name"] + objs.append(obj) + + elif isinstance(vrf_table, dict): + obj = {} + obj["name"] = vrf_table["vrf_name"] + objs.append(obj) + + return objs + + +def map_obj_to_commands(updates, module): + commands = list() + want, have = updates + state = module.params["state"] + purge = module.params["purge"] + + args = ("rd", "description", "vni") + + for w in want: + name = w["name"] + admin_state = w["admin_state"] + vni = w["vni"] + interfaces = w.get("interfaces") or [] + if purge: + state = "absent" + else: + state = w["state"] + del w["state"] + + obj_in_have = search_obj_in_list(name, have) + if state == "absent" and obj_in_have: + commands.append("no vrf context {0}".format(name)) + + elif state == "present": + if not obj_in_have: + commands.append("vrf context {0}".format(name)) + for item in args: + candidate = w.get(item) + if candidate and candidate != "default": + cmd = item + " " + str(candidate) + commands.append(cmd) + if admin_state == "up": + commands.append("no shutdown") + elif admin_state == "down": + commands.append("shutdown") + commands.append("exit") + + if interfaces and interfaces[0] != "default": + for i in interfaces: + commands.append("interface {0}".format(i)) + if get_interface_type(i) in ( + "ethernet", + "portchannel", + ): + commands.append("no switchport") + commands.append("vrf member {0}".format(name)) + + else: + # If vni is already configured on vrf, unconfigure it first. + if vni: + if obj_in_have.get("vni") and vni != obj_in_have.get( + "vni" + ): + commands.append( + "no vni {0}".format(obj_in_have.get("vni")) + ) + + for item in args: + candidate = w.get(item) + if candidate == "default": + if obj_in_have.get(item): + cmd = "no " + item + " " + obj_in_have.get(item) + commands.append(cmd) + elif candidate and candidate != obj_in_have.get(item): + cmd = item + " " + str(candidate) + commands.append(cmd) + if admin_state and admin_state != obj_in_have.get( + "admin_state" + ): + if admin_state == "up": + commands.append("no shutdown") + elif admin_state == "down": + commands.append("shutdown") + + if commands: + commands.insert(0, "vrf context {0}".format(name)) + commands.append("exit") + + if interfaces and interfaces[0] != "default": + if not obj_in_have["interfaces"]: + for i in interfaces: + commands.append("vrf context {0}".format(name)) + commands.append("exit") + commands.append("interface {0}".format(i)) + if get_interface_type(i) in ( + "ethernet", + "portchannel", + ): + commands.append("no switchport") + commands.append("vrf member {0}".format(name)) + + elif set(interfaces) != set(obj_in_have["interfaces"]): + missing_interfaces = list( + set(interfaces) - set(obj_in_have["interfaces"]) + ) + for i in missing_interfaces: + commands.append("vrf context {0}".format(name)) + commands.append("exit") + commands.append("interface {0}".format(i)) + if get_interface_type(i) in ( + "ethernet", + "portchannel", + ): + commands.append("no switchport") + commands.append("vrf member {0}".format(name)) + + superfluous_interfaces = list( + set(obj_in_have["interfaces"]) - set(interfaces) + ) + for i in superfluous_interfaces: + commands.append("vrf context {0}".format(name)) + commands.append("exit") + commands.append("interface {0}".format(i)) + if get_interface_type(i) in ( + "ethernet", + "portchannel", + ): + commands.append("no switchport") + commands.append("no vrf member {0}".format(name)) + elif interfaces and interfaces[0] == "default": + if obj_in_have["interfaces"]: + for i in obj_in_have["interfaces"]: + commands.append("vrf context {0}".format(name)) + commands.append("exit") + commands.append("interface {0}".format(i)) + if get_interface_type(i) in ( + "ethernet", + "portchannel", + ): + commands.append("no switchport") + commands.append("no vrf member {0}".format(name)) + + if purge: + existing = get_existing_vrfs(module) + if existing: + for h in existing: + if h["name"] in ("default", "management"): + pass + else: + obj_in_want = search_obj_in_list(h["name"], want) + if not obj_in_want: + commands.append("no vrf context {0}".format(h["name"])) + + return commands + + +def validate_vrf(name, module): + if name: + name = name.strip() + if name == "default": + module.fail_json(msg="cannot use default as name of a VRF") + elif len(name) > 32: + module.fail_json( + msg="VRF name exceeded max length of 32", name=name + ) + else: + return name + + +def map_params_to_obj(module): + obj = [] + aggregate = module.params.get("aggregate") + if aggregate: + for item in aggregate: + for key in item: + if item.get(key) is None: + item[key] = module.params[key] + + d = item.copy() + d["name"] = validate_vrf(d["name"], module) + obj.append(d) + else: + obj.append( + { + "name": validate_vrf(module.params["name"], module), + "description": module.params["description"], + "vni": module.params["vni"], + "rd": module.params["rd"], + "admin_state": module.params["admin_state"], + "state": module.params["state"], + "interfaces": module.params["interfaces"], + "associated_interfaces": module.params[ + "associated_interfaces" + ], + } + ) + return obj + + +def get_value(arg, config, module): + extra_arg_regex = re.compile(r"(?:{0}\s)(?P.*)$".format(arg), re.M) + value = "" + if arg in config: + value = extra_arg_regex.search(config).group("value") + return value + + +def map_config_to_obj(want, element_spec, module): + objs = list() + + for w in want: + obj = deepcopy(element_spec) + del obj["delay"] + del obj["state"] + + command = "show vrf {0}".format(w["name"]) + try: + body = execute_show_command(command, module)[0] + vrf_table = body["TABLE_vrf"]["ROW_vrf"] + except (TypeError, IndexError): + return list() + + name = vrf_table["vrf_name"] + obj["name"] = name + obj["admin_state"] = vrf_table["vrf_state"].lower() + + command = "show run all | section vrf.context.{0}".format(name) + body = execute_show_command(command, module)[0] + extra_params = ["vni", "rd", "description"] + for param in extra_params: + obj[param] = get_value(param, body, module) + + obj["interfaces"] = [] + command = "show vrf {0} interface".format(name) + try: + body = execute_show_command(command, module)[0] + vrf_int = body["TABLE_if"]["ROW_if"] + except (TypeError, IndexError): + vrf_int = None + + if vrf_int: + if isinstance(vrf_int, list): + for i in vrf_int: + intf = i["if_name"] + obj["interfaces"].append(intf) + elif isinstance(vrf_int, dict): + intf = vrf_int["if_name"] + obj["interfaces"].append(intf) + + objs.append(obj) + return objs + + +def check_declarative_intent_params(want, module, element_spec, result): + + have = None + is_delay = False + + for w in want: + if w.get("associated_interfaces") is None: + continue + + if result["changed"] and not is_delay: + time.sleep(module.params["delay"]) + is_delay = True + + if have is None: + have = map_config_to_obj(want, element_spec, module) + + for i in w["associated_interfaces"]: + obj_in_have = search_obj_in_list(w["name"], have) + + if obj_in_have: + interfaces = obj_in_have.get("interfaces") + if interfaces is not None and i not in interfaces: + module.fail_json( + msg="Interface %s not configured on vrf %s" + % (i, w["name"]) + ) + + +def vrf_error_check(module, commands, responses): + """Checks for VRF config errors and executes a retry in some circumstances. + """ + pattern = "ERROR: Deletion of VRF .* in progress" + if re.search(pattern, str(responses)): + # Allow delay/retry for VRF changes + time.sleep(15) + responses = load_config( + module, commands, opts={"catch_clierror": True} + ) + if re.search(pattern, str(responses)): + module.fail_json( + msg="VRF config (and retry) failure: %s " % responses + ) + module.warn("VRF config delayed by VRF deletion - passed on retry") + + +def main(): + """ main entry point for module execution + """ + element_spec = dict( + name=dict(type="str", aliases=["vrf"]), + description=dict(type="str"), + vni=dict(type="str"), + rd=dict(type="str"), + admin_state=dict(type="str", default="up", choices=["up", "down"]), + interfaces=dict(type="list", elements="str"), + associated_interfaces=dict(type="list", elements="str"), + delay=dict(type="int", default=10), + state=dict( + type="str", default="present", choices=["present", "absent"] + ), + ) + + aggregate_spec = deepcopy(element_spec) + + # remove default in aggregate spec, to handle common arguments + remove_default_spec(aggregate_spec) + + argument_spec = dict( + aggregate=dict(type="list", elements="dict", options=aggregate_spec), + purge=dict(type="bool", default=False), + ) + + argument_spec.update(element_spec) + argument_spec.update(nxos_argument_spec) + + required_one_of = [["name", "aggregate"]] + mutually_exclusive = [["name", "aggregate"]] + module = AnsibleModule( + argument_spec=argument_spec, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False} + if warnings: + result["warnings"] = warnings + + want = map_params_to_obj(module) + have = map_config_to_obj(want, element_spec, module) + + commands = map_obj_to_commands((want, have), module) + result["commands"] = commands + + if commands and not module.check_mode: + responses = load_config( + module, commands, opts={"catch_clierror": True} + ) + vrf_error_check(module, commands, responses) + result["changed"] = True + + check_declarative_intent_params(want, module, element_spec, result) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_af.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_af.py new file mode 100644 index 00000000..9ac10a0e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_af.py @@ -0,0 +1,283 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vrf_af +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages VRF AF. +description: +- Manages VRF AF +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- Default, where supported, restores params default value. +- In case of C(state=absent) the address-family configuration will be absent. Therefore + the options C(route_target_both_auto_evpn) and C(route_targets) are ignored. +options: + vrf: + description: + - Name of the VRF. + required: true + type: str + afi: + description: + - Address-Family Identifier (AFI). + required: true + choices: + - ipv4 + - ipv6 + type: str + route_target_both_auto_evpn: + description: + - Enable/Disable the EVPN route-target 'auto' setting for both import and export + target communities. + type: bool + route_targets: + description: + - Specify the route-targets which should be imported and/or exported under the + AF. This argument accepts a list of dicts that specify the route-target, the + direction (import|export|both) and state of each route-target. Default direction + is C(direction=both). See examples. + suboptions: + rt: + description: + - Defines the route-target itself + required: true + type: str + direction: + description: + - Indicates the direction of the route-target (import|export|both) + choices: + - import + - export + - both + default: both + type: str + state: + description: + - Determines whether the route-target with the given direction should be present + or not on the device. + choices: + - present + - absent + default: present + type: str + elements: dict + type: list + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_target_both_auto_evpn: true + state: present + +- cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: import + - rt: 65001:1000 + direction: import + +- cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: import + - rt: 65001:1000 + state: absent + +- cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: export + - rt: 65001:1000 + direction: export + +- cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: export + state: absent + +- cisco.nxos.nxos_vrf_af: + vrf: ntc + afi: ipv4 + route_targets: + - rt: 65000:1000 + direction: both + state: present + - rt: 65001:1000 + direction: import + state: present + - rt: 65002:1000 + direction: both + state: absent +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["vrf context ntc", "address-family ipv4 unicast"] +""" +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + NetworkConfig, +) + +import re + + +def match_current_rt(rt, direction, current, rt_commands): + command = "route-target %s %s" % (direction, rt.get("rt")) + match = re.findall(command, current, re.M) + want = bool(rt.get("state") != "absent") + if not match and want: + rt_commands.append(command) + elif match and not want: + rt_commands.append("no %s" % command) + return rt_commands + + +def main(): + argument_spec = dict( + vrf=dict(required=True), + afi=dict(required=True, choices=["ipv4", "ipv6"]), + route_target_both_auto_evpn=dict(required=False, type="bool"), + state=dict(choices=["present", "absent"], default="present"), + route_targets=dict( + type="list", + elements="dict", + options=dict( + rt=dict(type="str", required=True), + direction=dict( + choices=["import", "export", "both"], default="both" + ), + state=dict(choices=["present", "absent"], default="present"), + ), + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + result = {"changed": False, "warnings": warnings} + + config_text = get_config(module) + config = NetworkConfig(indent=2, contents=config_text) + + path = [ + "vrf context %s" % module.params["vrf"], + "address-family %s unicast" % module.params["afi"], + ] + + try: + current = config.get_block_config(path) + except ValueError: + current = None + + commands = list() + if current and module.params["state"] == "absent": + commands.append("no address-family %s unicast" % module.params["afi"]) + + elif module.params["state"] == "present": + rt_commands = list() + + if not current: + commands.append("address-family %s unicast" % module.params["afi"]) + current = "" + + have_auto_evpn = "route-target both auto evpn" in current + if module.params["route_target_both_auto_evpn"] is not None: + want_auto_evpn = bool(module.params["route_target_both_auto_evpn"]) + if want_auto_evpn and not have_auto_evpn: + commands.append("route-target both auto evpn") + elif have_auto_evpn and not want_auto_evpn: + commands.append("no route-target both auto evpn") + + if module.params["route_targets"] is not None: + for rt in module.params["route_targets"]: + if rt.get("direction") == "both" or not rt.get("direction"): + rt_commands = match_current_rt( + rt, "import", current, rt_commands + ) + rt_commands = match_current_rt( + rt, "export", current, rt_commands + ) + else: + rt_commands = match_current_rt( + rt, rt.get("direction"), current, rt_commands + ) + + if rt_commands: + commands.extend(rt_commands) + + if commands and current: + commands.insert( + 0, "address-family %s unicast" % module.params["afi"] + ) + + if commands: + commands.insert(0, "vrf context %s" % module.params["vrf"]) + if not module.check_mode: + load_config(module, commands) + result["changed"] = True + + result["commands"] = commands + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_interface.py new file mode 100644 index 00000000..37826176 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrf_interface.py @@ -0,0 +1,278 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vrf_interface +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages interface specific VRF configuration. +description: +- Manages interface specific VRF configuration. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- VRF needs to be added globally with M(cisco.nxos.nxos_vrf) before adding a VRF to an interface. +- Remove a VRF from an interface will still remove all L3 attributes just as it does + from CLI. +- VRF is not read from an interface until IP address is configured on that interface. +options: + vrf: + description: + - Name of VRF to be managed. + required: true + type: str + interface: + description: + - Full name of interface to be managed, i.e. Ethernet1/1. + required: true + type: str + state: + description: + - Manages desired state of the resource. + required: false + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- name: Ensure vrf ntc exists on Eth1/1 + cisco.nxos.nxos_vrf_interface: + vrf: ntc + interface: Ethernet1/1 + state: present + +- name: Ensure ntc VRF does not exist on Eth1/1 + cisco.nxos.nxos_vrf_interface: + vrf: ntc + interface: Ethernet1/1 + state: absent +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface loopback16", "vrf member ntc"] +""" +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, + nxos_argument_spec, + normalize_interface, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_interface_type, +) +from ansible.module_utils.basic import AnsibleModule + + +def execute_show_command(command, module): + if "show run" not in command: + output = "json" + else: + output = "text" + cmds = [{"command": command, "output": output}] + return run_commands(module, cmds)[0] + + +def get_interface_mode(interface, intf_type, module): + command = "show interface {0}".format(interface) + interface = {} + mode = "unknown" + + if intf_type in ["ethernet", "portchannel"]: + body = execute_show_command(command, module) + try: + interface_table = body["TABLE_interface"]["ROW_interface"] + except KeyError: + return mode + + if interface_table and isinstance(interface_table, dict): + mode = str(interface_table.get("eth_mode", "layer3")) + if mode == "access" or mode == "trunk": + mode = "layer2" + else: + return mode + + elif intf_type == "loopback" or intf_type == "svi": + mode = "layer3" + return mode + + +def get_vrf_list(module): + command = "show vrf all" + vrf_list = [] + body = execute_show_command(command, module) + + try: + vrf_table = body["TABLE_vrf"]["ROW_vrf"] + except (KeyError, AttributeError): + return vrf_list + + for each in vrf_table: + vrf_list.append(str(each["vrf_name"])) + + return vrf_list + + +def get_interface_info(interface, module): + if not interface.startswith("loopback"): + interface = interface.capitalize() + + command = "show run interface {0}".format(interface) + vrf_regex = r".*vrf\s+member\s+(?P\S+).*" + + try: + body = execute_show_command(command, module) + match_vrf = re.match(vrf_regex, body, re.DOTALL) + group_vrf = match_vrf.groupdict() + vrf = group_vrf["vrf"] + except (AttributeError, TypeError): + return "" + + return vrf + + +def is_default(interface, module): + command = "show run interface {0}".format(interface) + + try: + body = execute_show_command(command, module) + raw_list = body.split("\n") + if raw_list[-1].startswith("interface"): + return True + else: + return False + + except (KeyError, IndexError): + return "DNE" + + +def main(): + argument_spec = dict( + vrf=dict(required=True), + interface=dict(type="str", required=True), + state=dict( + default="present", choices=["present", "absent"], required=False + ), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + vrf = module.params["vrf"] + interface = normalize_interface(module.params["interface"]) + state = module.params["state"] + + device_info = get_capabilities(module) + network_api = device_info.get("network_api", "nxapi") + + current_vrfs = get_vrf_list(module) + if vrf not in current_vrfs: + warnings.append( + "The VRF is not present/active on the device. " + "Use nxos_vrf to fix this." + ) + + intf_type = get_interface_type(interface) + if intf_type != "ethernet" and network_api == "cliconf": + if is_default(interface, module) == "DNE": + module.fail_json( + msg="interface does not exist on switch. Verify " + "switch platform or create it first with " + "nxos_interface if it's a logical interface" + ) + + mode = get_interface_mode(interface, intf_type, module) + if mode == "layer2": + module.fail_json( + msg="Ensure interface is a Layer 3 port before " + "configuring a VRF on an interface. You can " + "use nxos_interface" + ) + + current_vrf = get_interface_info(interface, module) + existing = dict(interface=interface, vrf=current_vrf) + changed = False + + if not existing["vrf"]: + pass + elif vrf != existing["vrf"] and state == "absent": + module.fail_json( + msg="The VRF you are trying to remove " + "from the interface does not exist " + "on that interface.", + interface=interface, + proposed_vrf=vrf, + existing_vrf=existing["vrf"], + ) + + commands = [] + if existing: + if state == "absent": + if existing and vrf == existing["vrf"]: + command = "no vrf member {0}".format(vrf) + commands.append(command) + + elif state == "present": + if existing["vrf"] != vrf: + command = "vrf member {0}".format(vrf) + commands.append(command) + + if commands: + commands.insert(0, "interface {0}".format(interface)) + + if commands: + if module.check_mode: + module.exit_json(changed=True, commands=commands) + else: + load_config(module, commands) + changed = True + if "configure" in commands: + commands.pop(0) + + results["commands"] = commands + results["changed"] = changed + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrrp.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrrp.py new file mode 100644 index 00000000..976c6df9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vrrp.py @@ -0,0 +1,442 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vrrp +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages VRRP configuration on NX-OS switches. +description: +- Manages VRRP configuration on NX-OS switches. +version_added: 1.0.0 +author: +- Jason Edelman (@jedelman8) +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- VRRP feature needs to be enabled first on the system. +- SVIs must exist before using this module. +- Interface must be a L3 port before using this module. +- C(state=absent) removes the VRRP group if it exists on the device. +- VRRP cannot be configured on loopback interfaces. +options: + group: + description: + - VRRP group number. + required: true + type: str + interface: + description: + - Full name of interface that is being managed for VRRP. + required: true + type: str + interval: + description: + - Time interval between advertisement or 'default' keyword + required: false + type: str + priority: + description: + - VRRP priority or 'default' keyword + type: str + preempt: + description: + - Enable/Disable preempt. + type: bool + vip: + description: + - VRRP virtual IP address or 'default' keyword + type: str + authentication: + description: + - Clear text authentication string or 'default' keyword + type: str + admin_state: + description: + - Used to enable or disable the VRRP process. + choices: + - shutdown + - no shutdown + - default + default: shutdown + type: str + state: + description: + - Specify desired state of the resource. + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +- name: Ensure vrrp group 100 and vip 10.1.100.1 is on vlan10 + cisco.nxos.nxos_vrrp: + interface: vlan10 + group: 100 + vip: 10.1.100.1 + +- name: Ensure removal of the vrrp group config + cisco.nxos.nxos_vrrp: + interface: vlan10 + group: 100 + vip: 10.1.100.1 + state: absent + +- name: Re-config with more params + cisco.nxos.nxos_vrrp: + interface: vlan10 + group: 100 + vip: 10.1.100.1 + preempt: false + priority: 130 + authentication: AUTHKEY +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface vlan10", "vrrp 150", "address 10.1.15.1", + "authentication text testing", "no shutdown"] +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_interface_type, +) +from ansible.module_utils.basic import AnsibleModule + + +PARAM_TO_DEFAULT_KEYMAP = { + "priority": "100", + "interval": "1", + "vip": "0.0.0.0", + "admin_state": "shutdown", +} + + +def execute_show_command(command, module): + if "show run" not in command: + output = "json" + else: + output = "text" + + commands = [{"command": command, "output": output}] + return run_commands(module, commands)[0] + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + if value: + new_dict[new_key] = str(value) + else: + new_dict[new_key] = value + return new_dict + + +def is_default(interface, module): + command = "show run interface {0}".format(interface) + + try: + body = execute_show_command(command, module) + if "invalid" in body.lower(): + return "DNE" + else: + raw_list = body.split("\n") + if raw_list[-1].startswith("interface"): + return True + else: + return False + except (KeyError): + return "DNE" + + +def get_interface_mode(interface, intf_type, module): + command = "show interface {0}".format(interface) + interface = {} + mode = "unknown" + body = execute_show_command(command, module) + interface_table = body["TABLE_interface"]["ROW_interface"] + name = interface_table.get("interface") + + if intf_type in ["ethernet", "portchannel"]: + mode = str(interface_table.get("eth_mode", "layer3")) + + if mode == "access" or mode == "trunk": + mode = "layer2" + elif intf_type == "svi": + mode = "layer3" + + return mode, name + + +def get_vrr_status(group, module, interface): + command = "show run all | section interface.{0}$".format(interface) + body = execute_show_command(command, module) + vrf_index = None + admin_state = "shutdown" + + if body: + splitted_body = body.splitlines() + for index in range(0, len(splitted_body) - 1): + if splitted_body[index].strip() == "vrrp {0}".format(group): + vrf_index = index + vrf_section = splitted_body[vrf_index::] + + for line in vrf_section: + if line.strip() == "no shutdown": + admin_state = "no shutdown" + break + + return admin_state + + +def get_existing_vrrp(interface, group, module, name): + command = "show vrrp detail interface {0}".format(interface) + body = execute_show_command(command, module) + vrrp = {} + + vrrp_key = { + "sh_group_id": "group", + "sh_vip_addr": "vip", + "sh_priority": "priority", + "sh_group_preempt": "preempt", + "sh_auth_text": "authentication", + "sh_adv_interval": "interval", + } + + try: + vrrp_table = body["TABLE_vrrp_group"] + except (AttributeError, IndexError, TypeError): + return {} + + if isinstance(vrrp_table, dict): + vrrp_table = [vrrp_table] + + for each_vrrp in vrrp_table: + vrrp_row = each_vrrp["ROW_vrrp_group"] + parsed_vrrp = apply_key_map(vrrp_key, vrrp_row) + + if parsed_vrrp["preempt"] == "Disable": + parsed_vrrp["preempt"] = False + elif parsed_vrrp["preempt"] == "Enable": + parsed_vrrp["preempt"] = True + + if parsed_vrrp["group"] == group: + parsed_vrrp["admin_state"] = get_vrr_status(group, module, name) + return parsed_vrrp + + return vrrp + + +def get_commands_config_vrrp(delta, existing, group): + commands = [] + + CMDS = { + "priority": "priority {0}", + "preempt": "preempt", + "vip": "address {0}", + "interval": "advertisement-interval {0}", + "auth": "authentication text {0}", + "admin_state": "{0}", + } + + for arg in ["vip", "priority", "interval", "admin_state"]: + val = delta.get(arg) + if val == "default": + val = PARAM_TO_DEFAULT_KEYMAP.get(arg) + if val != existing.get(arg): + commands.append((CMDS.get(arg)).format(val)) + elif val: + commands.append((CMDS.get(arg)).format(val)) + + preempt = delta.get("preempt") + auth = delta.get("authentication") + + if preempt: + commands.append(CMDS.get("preempt")) + elif preempt is False: + commands.append("no " + CMDS.get("preempt")) + if auth: + if auth != "default": + commands.append((CMDS.get("auth")).format(auth)) + elif existing.get("authentication"): + commands.append("no authentication") + + if commands: + commands.insert(0, "vrrp {0}".format(group)) + + return commands + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def validate_params(param, module): + value = module.params[param] + + if param == "group": + try: + if int(value) < 1 or int(value) > 255: + raise ValueError + except ValueError: + module.fail_json( + msg="Warning! 'group' must be an integer between" " 1 and 255", + group=value, + ) + elif param == "priority": + try: + if int(value) < 1 or int(value) > 254: + raise ValueError + except ValueError: + module.fail_json( + msg="Warning! 'priority' must be an integer " + "between 1 and 254", + priority=value, + ) + + +def main(): + argument_spec = dict( + group=dict(required=True, type="str"), + interface=dict(required=True), + interval=dict(required=False, type="str"), + priority=dict(required=False, type="str"), + preempt=dict(required=False, type="bool"), + vip=dict(required=False, type="str"), + admin_state=dict( + required=False, + type="str", + choices=["shutdown", "no shutdown", "default"], + default="shutdown", + ), + authentication=dict(required=False, type="str", no_log=True), + state=dict( + choices=["absent", "present"], required=False, default="present" + ), + ) + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + results = {"changed": False, "commands": [], "warnings": warnings} + + state = module.params["state"] + interface = module.params["interface"].lower() + group = module.params["group"] + priority = module.params["priority"] + interval = module.params["interval"] + preempt = module.params["preempt"] + vip = module.params["vip"] + authentication = module.params["authentication"] + admin_state = module.params["admin_state"] + + device_info = get_capabilities(module) + network_api = device_info.get("network_api", "nxapi") + + if state == "present" and not vip: + module.fail_json(msg='the "vip" param is required when state=present') + + intf_type = get_interface_type(interface) + if intf_type != "ethernet" and network_api == "cliconf": + if is_default(interface, module) == "DNE": + module.fail_json( + msg="That interface does not exist yet. Create " "it first.", + interface=interface, + ) + if intf_type == "loopback": + module.fail_json( + msg="Loopback interfaces don't support VRRP.", + interface=interface, + ) + + mode, name = get_interface_mode(interface, intf_type, module) + if mode == "layer2": + module.fail_json( + msg="That interface is a layer2 port.\nMake it " + "a layer 3 port first.", + interface=interface, + ) + + args = dict( + group=group, + priority=priority, + preempt=preempt, + vip=vip, + authentication=authentication, + interval=interval, + admin_state=admin_state, + ) + + proposed = dict((k, v) for k, v in args.items() if v is not None) + existing = get_existing_vrrp(interface, group, module, name) + + commands = [] + + if state == "present": + delta = dict(set(proposed.items()).difference(existing.items())) + if delta: + command = get_commands_config_vrrp(delta, existing, group) + if command: + commands.append(command) + elif state == "absent": + if existing: + commands.append(["no vrrp {0}".format(group)]) + + if commands: + commands.insert(0, ["interface {0}".format(interface)]) + commands = flatten_list(commands) + results["commands"] = commands + results["changed"] = True + if not module.check_mode: + load_config(module, commands) + if "configure" in commands: + commands.pop(0) + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vsan.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vsan.py new file mode 100644 index 00000000..c68dd0ca --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vsan.py @@ -0,0 +1,385 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 + + +DOCUMENTATION = """ +module: nxos_vsan +short_description: Configuration of vsan for Cisco NXOS MDS Switches. +description: +- Configuration of vsan for Cisco MDS NXOS. +version_added: 1.0.0 +author: +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) +notes: +- Tested against NX-OS 8.4(1) +options: + vsan: + description: + - List of vsan details to be added or removed + type: list + elements: dict + suboptions: + id: + description: + - Vsan id + required: true + type: int + name: + description: + - Name of the vsan + type: str + suspend: + description: + - suspend the vsan if True + type: bool + remove: + description: + - Removes the vsan if True + type: bool + interface: + description: + - List of vsan's interfaces to be added + type: list + elements: str +""" + +EXAMPLES = """ +- name: Test that vsan module works + cisco.nxos.nxos_vsan: + vsan: + - id: 922 + interface: + - fc1/1 + - fc1/2 + - port-channel 1 + name: vsan-SAN-A + remove: false + suspend: false + - id: 923 + interface: + - fc1/11 + - fc1/21 + - port-channel 2 + name: vsan-SAN-B + remove: false + suspend: true + - id: 1923 + name: vsan-SAN-Old + remove: true +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - terminal dont-ask + - vsan database + - vsan 922 interface fc1/40 + - vsan 922 interface port-channel 155 + - no terminal dont-ask +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +import re + +__metaclass__ = type + + +class Vsan(object): + def __init__(self, vsanid): + self.vsanid = vsanid + self.vsanname = None + self.vsanstate = None + self.vsanoperstate = None + self.vsaninterfaces = [] + + +class GetVsanInfoFromSwitch(object): + """docstring for GetVsanInfoFromSwitch""" + + def __init__(self, module): + self.module = module + self.vsaninfo = {} + self.processShowVsan() + self.processShowVsanMembership() + + def execute_show_vsan_cmd(self): + output = execute_show_command("show vsan", self.module)[0] + return output + + def execute_show_vsan_mem_cmd(self): + output = execute_show_command("show vsan membership", self.module)[0] + return output + + def processShowVsan(self): + patv = r"^vsan\s+(\d+)\s+information" + patnamestate = "name:(.*)state:(.*)" + patoperstate = "operational state:(.*)" + + output = self.execute_show_vsan_cmd().split("\n") + for o in output: + z = re.match(patv, o.strip()) + if z: + v = z.group(1).strip() + self.vsaninfo[v] = Vsan(v) + + z1 = re.match(patnamestate, o.strip()) + if z1: + n = z1.group(1).strip() + s = z1.group(2).strip() + self.vsaninfo[v].vsanname = n + self.vsaninfo[v].vsanstate = s + + z2 = re.match(patoperstate, o.strip()) + if z2: + oper = z2.group(1).strip() + self.vsaninfo[v].vsanoperstate = oper + + # 4094/4079 vsan is always present + self.vsaninfo["4079"] = Vsan("4079") + self.vsaninfo["4094"] = Vsan("4094") + + def processShowVsanMembership(self): + patv = r"^vsan\s+(\d+).*" + output = self.execute_show_vsan_mem_cmd().split("\n") + memlist = [] + v = None + for o in output: + z = re.match(patv, o.strip()) + if z: + if v is not None: + self.vsaninfo[v].vsaninterfaces = memlist + memlist = [] + v = z.group(1) + if "interfaces" not in o: + llist = o.strip().split() + memlist = memlist + llist + self.vsaninfo[v].vsaninterfaces = memlist + + def getVsanInfoObjects(self): + return self.vsaninfo + + +def execute_show_command(command, module, command_type="cli_show"): + output = "text" + commands = [{"command": command, "output": output}] + return run_commands(module, commands) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def main(): + vsan_element_spec = dict( + id=dict(required=True, type="int"), + name=dict(type="str"), + remove=dict(type="bool"), + suspend=dict(type="bool"), + interface=dict(type="list", elements="str"), + ) + + argument_spec = dict( + vsan=dict(type="list", elements="dict", options=vsan_element_spec) + ) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + warnings = list() + messages = list() + commands_executed = list() + result = {"changed": False} + + obj = GetVsanInfoFromSwitch(module) + dictSwVsanObjs = obj.getVsanInfoObjects() + + commands = [] + vsan_list = module.params["vsan"] + + for eachvsan in vsan_list: + vsanid = str(eachvsan["id"]) + vsanname = eachvsan["name"] + vsanremove = eachvsan["remove"] + vsansuspend = eachvsan["suspend"] + vsaninterface_list = eachvsan["interface"] + + if int(vsanid) < 1 or int(vsanid) >= 4095: + module.fail_json( + msg=vsanid + + " - This is an invalid vsan. Supported vsan range is 1-4094" + ) + + if vsanid in dictSwVsanObjs.keys(): + sw_vsanid = vsanid + sw_vsanname = dictSwVsanObjs[vsanid].vsanname + sw_vsanstate = dictSwVsanObjs[vsanid].vsanstate + sw_vsaninterfaces = dictSwVsanObjs[vsanid].vsaninterfaces + else: + sw_vsanid = None + sw_vsanname = None + sw_vsanstate = None + sw_vsaninterfaces = [] + + if vsanremove: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + + " is a reserved vsan, hence cannot be removed" + ) + continue + if vsanid == sw_vsanid: + commands.append("no vsan " + str(vsanid)) + messages.append("deleting the vsan " + str(vsanid)) + else: + messages.append( + "There is no vsan " + + str(vsanid) + + " present in the switch. Hence there is nothing to delete" + ) + continue + else: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + + " is a reserved vsan, and always present on the switch" + ) + else: + if vsanid == sw_vsanid: + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch. Hence there is nothing to configure" + ) + else: + commands.append("vsan " + str(vsanid)) + messages.append("creating vsan " + str(vsanid)) + + if vsanname is not None: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + " is a reserved vsan, and cannot be renamed" + ) + else: + if vsanname == sw_vsanname: + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch, which has the name " + + vsanname + + " Hence there is nothing to configure" + ) + else: + commands.append( + "vsan " + str(vsanid) + " name " + vsanname + ) + messages.append( + "setting vsan name to " + + vsanname + + " for vsan " + + str(vsanid) + ) + + if vsansuspend: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + + " is a reserved vsan, and cannot be suspended" + ) + else: + if sw_vsanstate == "suspended": + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch, which is in suspended state " + ) + else: + commands.append("vsan " + str(vsanid) + " suspend") + messages.append("suspending the vsan " + str(vsanid)) + else: + if sw_vsanstate == "active": + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch, which is in active state " + ) + else: + commands.append("no vsan " + str(vsanid) + " suspend") + messages.append("no suspending the vsan " + str(vsanid)) + + if vsaninterface_list is not None: + for each_interface_name in vsaninterface_list: + # For fcip,port-channel,vfc-port-channel need to remove the + # extra space to compare + temp = re.sub(" +", "", each_interface_name) + if temp in sw_vsaninterfaces: + messages.append( + each_interface_name + + " is already present in the vsan " + + str(vsanid) + + " interface list" + ) + else: + commands.append( + "vsan " + + str(vsanid) + + " interface " + + each_interface_name + ) + messages.append( + "adding interface " + + each_interface_name + + " to vsan " + + str(vsanid) + ) + + if len(commands) != 0: + commands = ( + ["terminal dont-ask"] + + ["vsan database"] + + commands + + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands) + commands_executed = cmds + + if commands_executed: + if module.check_mode: + module.exit_json( + changed=False, + commands=commands_executed, + msg="Check Mode: No cmds issued to the hosts", + ) + else: + result["changed"] = True + load_config(module, commands_executed) + + result["messages"] = messages + result["commands"] = commands_executed + result["warnings"] = warnings + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_domain.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_domain.py new file mode 100644 index 00000000..1d44b2ce --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_domain.py @@ -0,0 +1,220 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vtp_domain +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages VTP domain configuration. +description: +- Manages VTP domain configuration. +version_added: 1.0.0 +author: +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- VTP feature must be active on the device to use this module. +- This module is used to manage only VTP domain names. +- VTP domain names are case-sensible. +- If it's never been configured before, VTP version is set to 1 by default. Otherwise, + it leaves the previous configured version untouched. Use M(cisco.nxos.nxos_vtp_version) + to change it. +- Use this in combination with M(cisco.nxos.nxos_vtp_password) and M(cisco.nxos.nxos_vtp_version) + to fully manage VTP operations. +options: + domain: + description: + - VTP domain name. + required: true + type: str +""" + +EXAMPLES = """ +# ENSURE VTP DOMAIN IS CONFIGURED +- cisco.nxos.nxos_vtp_domain: + domain: ntc + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"domain": "ntc"} +existing: + description: + - k/v pairs of existing vtp domain + returned: always + type: dict + sample: {"domain": "testing", "version": "2", "vtp_password": "\"} +end_state: + description: k/v pairs of vtp domain after module execution + returned: always + type: dict + sample: {"domain": "ntc", "version": "2", "vtp_password": "\"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["vtp domain ntc"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, +) +from ansible.module_utils.basic import AnsibleModule +import re + + +def execute_show_command(command, module, output="json"): + cmds = [{"command": command, "output": output}] + body = run_commands(module, cmds) + return body + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_vtp_config(module): + command = "show vtp status" + body = execute_show_command(command, module, "text")[0] + vtp_parsed = {} + + if body: + version_regex = r".*VTP version running\s+:\s+(?P\d).*" + domain_regex = r".*VTP Domain Name\s+:\s+(?P\S+).*" + + try: + match_version = re.match(version_regex, body, re.DOTALL) + version = match_version.groupdict()["version"] + except AttributeError: + version = "" + + try: + match_domain = re.match(domain_regex, body, re.DOTALL) + domain = match_domain.groupdict()["domain"] + except AttributeError: + domain = "" + + if domain and version: + vtp_parsed["domain"] = domain + vtp_parsed["version"] = version + vtp_parsed["vtp_password"] = get_vtp_password(module) + + return vtp_parsed + + +def get_vtp_password(module): + command = "show vtp password" + output = "json" + cap = get_capabilities(module)["device_info"]["network_os_model"] + if re.search(r"Nexus 6", cap): + output = "text" + + body = execute_show_command(command, module, output)[0] + + if output == "json": + password = body.get("passwd", "") + else: + password = "" + rp = r"VTP Password: (\S+)" + mo = re.search(rp, body) + if mo: + password = mo.group(1) + + return str(password) + + +def main(): + argument_spec = dict(domain=dict(type="str", required=True)) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + domain = module.params["domain"] + + existing = get_vtp_config(module) + end_state = existing + + args = dict(domain=domain) + + changed = False + proposed = dict((k, v) for k, v in args.items() if v is not None) + delta = dict(set(proposed.items()).difference(existing.items())) + + commands = [] + if delta: + commands.append(["vtp domain {0}".format(domain)]) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + end_state = get_vtp_config(module) + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["end_state"] = end_state + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_password.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_password.py new file mode 100644 index 00000000..138f7969 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_password.py @@ -0,0 +1,287 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vtp_password +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages VTP password configuration. +description: +- Manages VTP password configuration. +version_added: 1.0.0 +author: +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- VTP feature must be active on the device to use this module. +- This module is used to manage only VTP passwords. +- Use this in combination with M(cisco.nxos.nxos_vtp_domain) and M(cisco.nxos.nxos_vtp_version) to fully + manage VTP operations. +- You can set/remove password only if a VTP domain already exist. +- If C(state=absent) and no C(vtp_password) is provided, it remove the current VTP + password. +- If C(state=absent) and C(vtp_password) is provided, the proposed C(vtp_password) + has to match the existing one in order to remove it. +options: + vtp_password: + description: + - VTP password + type: str + state: + description: + - Manage the state of the resource + default: present + choices: + - present + - absent + type: str +""" + +EXAMPLES = """ +# ENSURE VTP PASSWORD IS SET +- cisco.nxos.nxos_vtp_password: + state: present + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' + +# ENSURE VTP PASSWORD IS REMOVED +- cisco.nxos.nxos_vtp_password: + state: absent + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"vtp_password": "new_ntc"} +existing: + description: + - k/v pairs of existing vtp + returned: always + type: dict + sample: {"domain": "ntc", "version": "1", "vtp_password": "ntc"} +end_state: + description: k/v pairs of vtp after module execution + returned: always + type: dict + sample: {"domain": "ntc", "version": "1", "vtp_password": "new_ntc"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["vtp password new_ntc"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, +) +from ansible.module_utils.basic import AnsibleModule +import re + + +def execute_show_command(command, module, output="json"): + cmds = [{"command": command, "output": output}] + body = run_commands(module, cmds) + return body + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + value = table.get(key) + if value: + new_dict[new_key] = str(value) + else: + new_dict[new_key] = value + return new_dict + + +def get_vtp_config(module): + command = "show vtp status" + + body = execute_show_command(command, module, "text")[0] + vtp_parsed = {} + + if body: + version_regex = r".*VTP version running\s+:\s+(?P\d).*" + domain_regex = r".*VTP Domain Name\s+:\s+(?P\S+).*" + + try: + match_version = re.match(version_regex, body, re.DOTALL) + version = match_version.groupdict()["version"] + except AttributeError: + version = "" + + try: + match_domain = re.match(domain_regex, body, re.DOTALL) + domain = match_domain.groupdict()["domain"] + except AttributeError: + domain = "" + + if domain and version: + vtp_parsed["domain"] = domain + vtp_parsed["version"] = version + vtp_parsed["vtp_password"] = get_vtp_password(module) + + return vtp_parsed + + +def get_vtp_password(module): + command = "show vtp password" + output = "json" + cap = get_capabilities(module)["device_info"]["network_os_model"] + if re.search(r"Nexus 6", cap): + output = "text" + + body = execute_show_command(command, module, output)[0] + + if output == "json": + password = body.get("passwd", "") + else: + password = "" + rp = r"VTP Password: (\S+)" + mo = re.search(rp, body) + if mo: + password = mo.group(1) + + return str(password) + + +def main(): + argument_spec = dict( + vtp_password=dict(type="str", no_log=True), + state=dict(choices=["absent", "present"], default="present"), + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + vtp_password = module.params["vtp_password"] or None + state = module.params["state"] + + existing = get_vtp_config(module) + end_state = existing + + args = dict(vtp_password=vtp_password) + + changed = False + proposed = dict((k, v) for k, v in args.items() if v is not None) + delta = dict(set(proposed.items()).difference(existing.items())) + + commands = [] + if state == "absent": + # if vtp_password is not set, some devices returns '\\' or the string 'None' + if ( + not existing["vtp_password"] + or existing["vtp_password"] == "\\" + or existing["vtp_password"] == "None" + ): + pass + elif vtp_password is not None: + if existing["vtp_password"] == proposed["vtp_password"]: + commands.append(["no vtp password"]) + else: + module.fail_json( + msg="Proposed vtp password doesn't match " + "current vtp password. It cannot be " + "removed when state=absent. If you are " + "trying to change the vtp password, use " + "state=present." + ) + else: + if not existing.get("domain"): + module.fail_json( + msg="Cannot remove a vtp password " + "before vtp domain is set." + ) + + elif existing["vtp_password"] != ("\\"): + commands.append(["no vtp password"]) + + elif state == "present": + if delta: + if not existing.get("domain"): + module.fail_json( + msg="Cannot set vtp password " "before vtp domain is set." + ) + + else: + commands.append(["vtp password {0}".format(vtp_password)]) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + end_state = get_vtp_config(module) + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["end_state"] = end_state + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_version.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_version.py new file mode 100644 index 00000000..b9561d5d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vtp_version.py @@ -0,0 +1,217 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vtp_version +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages VTP version configuration. +description: +- Manages VTP version configuration. +version_added: 1.0.0 +author: +- Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- VTP feature must be active on the device to use this module. +- This module is used to manage only VTP version. +- Use this in combination with M(cisco.nxos.nxos_vtp_password) and M(cisco.nxos.nxos_vtp_version) + to fully manage VTP operations. +options: + version: + description: + - VTP version number. + required: true + choices: + - '1' + - '2' + type: str +""" +EXAMPLES = """ +# ENSURE VTP VERSION IS 2 +- cisco.nxos.nxos_vtp_version: + version: 2 + host: '{{ inventory_hostname }}' + username: '{{ un }}' + password: '{{ pwd }}' +""" + +RETURN = """ +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"version": "2"} +existing: + description: + - k/v pairs of existing vtp + returned: always + type: dict + sample: {"domain": "testing", "version": "1", "vtp_password": "\"} +end_state: + description: k/v pairs of vtp after module execution + returned: always + type: dict + sample: {"domain": "testing", "version": "2", "vtp_password": "\"} +updates: + description: command sent to the device + returned: always + type: list + sample: ["vtp version 2"] +changed: + description: check to see if a change was made on the device + returned: always + type: bool + sample: true +""" +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_capabilities, +) +from ansible.module_utils.basic import AnsibleModule +import re + + +def execute_show_command(command, module, output="json"): + cmds = [{"command": command, "output": output}] + body = run_commands(module, cmds) + return body + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def get_vtp_config(module): + command = "show vtp status" + body = execute_show_command(command, module, "text")[0] + vtp_parsed = {} + + if body: + version_regex = r".*VTP version running\s+:\s+(?P\d).*" + domain_regex = r".*VTP Domain Name\s+:\s+(?P\S+).*" + + try: + match_version = re.match(version_regex, body, re.DOTALL) + version = match_version.groupdict()["version"] + except AttributeError: + version = "" + + try: + match_domain = re.match(domain_regex, body, re.DOTALL) + domain = match_domain.groupdict()["domain"] + except AttributeError: + domain = "" + + if domain and version: + vtp_parsed["domain"] = domain + vtp_parsed["version"] = version + vtp_parsed["vtp_password"] = get_vtp_password(module) + + return vtp_parsed + + +def get_vtp_password(module): + command = "show vtp password" + output = "json" + cap = get_capabilities(module)["device_info"]["network_os_model"] + if re.search(r"Nexus 6", cap): + output = "text" + + body = execute_show_command(command, module, output)[0] + + if output == "json": + password = body.get("passwd", "") + else: + password = "" + rp = r"VTP Password: (\S+)" + mo = re.search(rp, body) + if mo: + password = mo.group(1) + + return str(password) + + +def main(): + argument_spec = dict( + version=dict(type="str", choices=["1", "2"], required=True) + ) + + argument_spec.update(nxos_argument_spec) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + + version = module.params["version"] + + existing = get_vtp_config(module) + end_state = existing + + args = dict(version=version) + + changed = False + proposed = dict((k, v) for k, v in args.items() if v is not None) + delta = dict(set(proposed.items()).difference(existing.items())) + + commands = [] + if delta: + commands.append(["vtp version {0}".format(version)]) + + cmds = flatten_list(commands) + if cmds: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True + load_config(module, cmds) + end_state = get_vtp_config(module) + if "configure" in cmds: + cmds.pop(0) + + results = {} + results["proposed"] = proposed + results["existing"] = existing + results["end_state"] = end_state + results["updates"] = cmds + results["changed"] = changed + results["warnings"] = warnings + + module.exit_json(**results) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep.py new file mode 100644 index 00000000..86f0d3e3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep.py @@ -0,0 +1,488 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vxlan_vtep +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Manages VXLAN Network Virtualization Endpoint (NVE). +description: +- Manages VXLAN Network Virtualization Endpoint (NVE) overlay interface that terminates + VXLAN tunnels. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- The module is used to manage NVE properties, not to create NVE interfaces. Use M(cisco.nxos.nxos_interface) + if you wish to do so. +- C(state=absent) removes the interface. +- Default, where supported, restores params default value. +options: + interface: + description: + - Interface name for the VXLAN Network Virtualization Endpoint. + required: true + type: str + description: + description: + - Description of the NVE interface. + type: str + host_reachability: + description: + - Specify mechanism for host reachability advertisement. A Boolean value of 'true' + indicates that BGP will be used for host reachability advertisement. A Boolean + value of 'false' indicates that no protocol is used for host reachability advertisement. + Other host reachability advertisement protocols (e.g. OpenFlow, controller, etc.) are not + supported. + type: bool + shutdown: + description: + - Administratively shutdown the NVE interface. + type: bool + source_interface: + description: + - Specify the loopback interface whose IP address should be used for the NVE interface. + type: str + source_interface_hold_down_time: + description: + - Suppresses advertisement of the NVE loopback address until the overlay has converged. + type: str + global_mcast_group_L3: + description: + - Global multicast IP prefix for L3 VNIs or the keyword 'default'. This is available on + Nexus 9000 series switches running NX-OS software release 9.2(x) or higher. + type: str + global_mcast_group_L2: + description: + - Global multicast IP prefix for L2 VNIs or the keyword 'default'. This is available on + Nexus 9000 series switches running NX-OS software release 9.2(x) or higher. + type: str + global_suppress_arp: + description: + - Enables ARP suppression for all VNIs. This is available on NX-OS 9K series running + 9.2.x or higher. + type: bool + global_ingress_replication_bgp: + description: + - Configures ingress replication protocol as bgp for all VNIs. This is available on Nexus + 9000 series switches running NX-OS software release 9.2(x) or higher. + type: bool + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str + multisite_border_gateway_interface: + description: + - Specify the loopback interface whose IP address should be used for the NVE + Multisite Border-gateway Interface. This is available on specific Nexus 9000 + series switches running NX-OS 7.0(3)I7(x) or higher. Specify "default" to remove + an existing gateway config. + type: str + version_added: 1.1.0 +""" +EXAMPLES = """ +- cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + description: default + host_reachability: true + source_interface: Loopback0 + source_interface_hold_down_time: 30 + shutdown: default + multisite_border_gateway_interface: Loopback0 +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface nve1", "source-interface loopback0", + "source-interface hold-down-time 30", "description simple description", + "shutdown", "host-reachability protocol bgp", + "multisite border-gateway interface loopback0"] +""" + +import re + +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + run_commands, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + +BOOL_PARAMS = [ + "shutdown", + "host_reachability", + "global_ingress_replication_bgp", + "global_suppress_arp", +] +PARAM_TO_COMMAND_KEYMAP = { + "description": "description", + "global_suppress_arp": "global suppress-arp", + "global_ingress_replication_bgp": "global ingress-replication protocol bgp", + "global_mcast_group_L3": "global mcast-group L3", + "global_mcast_group_L2": "global mcast-group L2", + "host_reachability": "host-reachability protocol bgp", + "interface": "interface", + "shutdown": "shutdown", + "source_interface": "source-interface", + "source_interface_hold_down_time": "source-interface hold-down-time", + "multisite_border_gateway_interface": "multisite border-gateway interface", +} +PARAM_TO_DEFAULT_KEYMAP = { + "description": False, + "shutdown": True, + "source_interface_hold_down_time": "180", +} + + +def get_value(arg, config, module): + if arg in BOOL_PARAMS: + REGEX = re.compile( + r"\s+{0}\s*$".format(PARAM_TO_COMMAND_KEYMAP[arg]), re.M + ) + NO_SHUT_REGEX = re.compile(r"\s+no shutdown\s*$", re.M) + value = False + if arg == "shutdown": + try: + if NO_SHUT_REGEX.search(config): + value = False + elif REGEX.search(config): + value = True + except TypeError: + value = False + else: + try: + if REGEX.search(config): + value = True + except TypeError: + value = False + else: + REGEX = re.compile( + r"(?:{0}\s)(?P.*)$".format(PARAM_TO_COMMAND_KEYMAP[arg]), + re.M, + ) + NO_DESC_REGEX = re.compile( + r"\s+{0}\s*$".format("no description"), re.M + ) + SOURCE_INTF_REGEX = re.compile( + r"(?:{0}\s)(?P\S+)$".format(PARAM_TO_COMMAND_KEYMAP[arg]), + re.M, + ) + value = "" + if arg == "description": + if NO_DESC_REGEX.search(config): + value = False + elif PARAM_TO_COMMAND_KEYMAP[arg] in config: + value = REGEX.search(config).group("value").strip() + elif arg == "source_interface": + for line in config.splitlines(): + try: + if PARAM_TO_COMMAND_KEYMAP[arg] in config: + value = ( + SOURCE_INTF_REGEX.search(config) + .group("value") + .strip() + ) + break + except AttributeError: + value = "" + elif arg == "global_mcast_group_L2": + for line in config.splitlines(): + try: + if "global mcast-group" in line and "L2" in line: + value = line.split()[2].strip() + break + except AttributeError: + value = "" + elif arg == "global_mcast_group_L3": + for line in config.splitlines(): + try: + if "global mcast-group" in line and "L3" in line: + value = line.split()[2].strip() + break + except AttributeError: + value = "" + elif arg == "multisite_border_gateway_interface": + for line in config.splitlines(): + try: + if PARAM_TO_COMMAND_KEYMAP[arg] in config: + value = ( + SOURCE_INTF_REGEX.search(config) + .group("value") + .strip() + ) + break + except AttributeError: + value = "" + else: + if PARAM_TO_COMMAND_KEYMAP[arg] in config: + value = REGEX.search(config).group("value").strip() + return value + + +def get_existing(module, args): + existing = {} + netcfg = CustomNetworkConfig( + indent=2, contents=get_config(module, flags=["all"]) + ) + + interface_string = "interface {0}".format( + module.params["interface"].lower() + ) + parents = [interface_string] + config = netcfg.get_section(parents) + + if config: + for arg in args: + existing[arg] = get_value(arg, config, module) + + existing["interface"] = module.params["interface"].lower() + else: + if interface_string in str(netcfg): + existing["interface"] = module.params["interface"].lower() + for arg in args: + existing[arg] = "" + return existing + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + value = table.get(key) + if value: + new_dict[new_key] = value + else: + new_dict[new_key] = value + return new_dict + + +def fix_commands(commands, module): + source_interface_command = "" + no_source_interface_command = "" + no_host_reachability_command = "" + host_reachability_command = "" + + for command in commands: + if "no source-interface hold-down-time" in command: + pass + elif "source-interface hold-down-time" in command: + pass + elif "no source-interface" in command: + no_source_interface_command = command + elif "source-interface" in command: + source_interface_command = command + elif "no host-reachability" in command: + no_host_reachability_command = command + elif "host-reachability" in command: + host_reachability_command = command + + if host_reachability_command: + commands.pop(commands.index(host_reachability_command)) + commands.insert(0, host_reachability_command) + + if source_interface_command: + commands.pop(commands.index(source_interface_command)) + commands.insert(0, source_interface_command) + + if no_host_reachability_command: + commands.pop(commands.index(no_host_reachability_command)) + commands.append(no_host_reachability_command) + + if no_source_interface_command: + commands.pop(commands.index(no_source_interface_command)) + commands.append(no_source_interface_command) + + commands.insert(0, "terminal dont-ask") + return commands + + +def gsa_tcam_check(module): + """ + global_suppress_arp is an N9k-only command that requires TCAM resources. + This method checks the current TCAM allocation. + Note that changing tcam_size requires a switch reboot to take effect. + """ + cmds = [ + {"command": "show hardware access-list tcam region", "output": "json"} + ] + body = run_commands(module, cmds) + if body: + tcam_region = body[0]["TCAM_Region"]["TABLE_Sizes"]["ROW_Sizes"] + if bool( + [ + i + for i in tcam_region + if i["type"].startswith("Ingress ARP-Ether ACL") + and i["tcam_size"] == "0" + ] + ): + msg = ( + "'show hardware access-list tcam region' indicates 'ARP-Ether' tcam size is 0 (no allocated resources). " + + "'global_suppress_arp' will be rejected by device." + ) + module.fail_json(msg=msg) + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + for key, value in proposed_commands.items(): + if value is True: + commands.append(key) + + elif value is False: + commands.append("no {0}".format(key)) + + elif value == "default": + if existing_commands.get(key): + existing_value = existing_commands.get(key) + if "global mcast-group" in key: + commands.append("no {0}".format(key)) + else: + commands.append("no {0} {1}".format(key, existing_value)) + else: + if key.replace(" ", "_").replace("-", "_") in BOOL_PARAMS: + commands.append("no {0}".format(key.lower())) + module.exit_json(commands=commands) + else: + if "L2" in key: + commands.append("global mcast-group " + value + " L2") + elif "L3" in key: + commands.append("global mcast-group " + value + " L3") + else: + command = "{0} {1}".format(key, value.lower()) + commands.append(command) + + if commands: + commands = fix_commands(commands, module) + parents = ["interface {0}".format(module.params["interface"].lower())] + candidate.add(commands, parents=parents) + else: + if not existing and module.params["interface"]: + commands = [ + "interface {0}".format(module.params["interface"].lower()) + ] + candidate.add(commands, parents=[]) + + +def state_absent(module, existing, proposed, candidate): + commands = ["no interface {0}".format(module.params["interface"].lower())] + candidate.add(commands, parents=[]) + + +def main(): + argument_spec = dict( + interface=dict(required=True, type="str"), + description=dict(required=False, type="str"), + host_reachability=dict(required=False, type="bool"), + global_ingress_replication_bgp=dict(required=False, type="bool"), + global_suppress_arp=dict(required=False, type="bool"), + global_mcast_group_L2=dict(required=False, type="str"), + global_mcast_group_L3=dict(required=False, type="str"), + shutdown=dict(required=False, type="bool"), + source_interface=dict(required=False, type="str"), + source_interface_hold_down_time=dict(required=False, type="str"), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + multisite_border_gateway_interface=dict(required=False, type="str"), + ) + + argument_spec.update(nxos_argument_spec) + + mutually_exclusive = [ + ("global_ingress_replication_bgp", "global_mcast_group_L2") + ] + + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False, "commands": [], "warnings": warnings} + + state = module.params["state"] + + args = PARAM_TO_COMMAND_KEYMAP.keys() + + existing = get_existing(module, args) + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + proposed = {} + for key, value in proposed_args.items(): + if key != "interface": + if str(value).lower() == "default": + value = PARAM_TO_DEFAULT_KEYMAP.get(key) + if value is None: + if key in BOOL_PARAMS: + value = False + else: + value = "default" + if str(existing.get(key)).lower() != str(value).lower(): + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + + if proposed.get("global_suppress_arp"): + gsa_tcam_check(module) + if state == "present": + if not existing: + warnings.append( + "The proposed NVE interface did not exist. " + "It's recommended to use nxos_interface to create " + "all logical interfaces." + ) + state_present(module, existing, proposed, candidate) + elif state == "absent" and existing: + state_absent(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + result["commands"] = candidate + result["changed"] = True + load_config(module, candidate) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep_vni.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep_vni.py new file mode 100644 index 00000000..96cabb71 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_vxlan_vtep_vni.py @@ -0,0 +1,482 @@ +#!/usr/bin/python +# +# 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 = """ +module: nxos_vxlan_vtep_vni +extends_documentation_fragment: +- cisco.nxos.nxos +short_description: Creates a Virtual Network Identifier member (VNI) +description: +- Creates a Virtual Network Identifier member (VNI) for an NVE overlay interface. +version_added: 1.0.0 +author: Gabriele Gerbino (@GGabriele) +notes: +- Tested against NXOSv 7.3.(0)D1(1) on VIRL +- default, where supported, restores params default value. +options: + interface: + description: + - Interface name for the VXLAN Network Virtualization Endpoint. + required: true + type: str + vni: + description: + - ID of the Virtual Network Identifier. + required: true + type: str + assoc_vrf: + description: + - This attribute is used to identify and separate processing VNIs that are associated + with a VRF and used for routing. The VRF and VNI specified with this command + must match the configuration of the VNI under the VRF. + type: bool + ingress_replication: + description: + - Specifies mechanism for host reachability advertisement. + choices: + - bgp + - static + - default + type: str + multicast_group: + description: + - The multicast group (range) of the VNI. Valid values are string and keyword + 'default'. + type: str + peer_list: + description: + - Set the ingress-replication static peer list. Valid values are an array, a space-separated + string of ip addresses, or the keyword 'default'. + type: list + elements: str + suppress_arp: + description: + - Suppress arp under layer 2 VNI. + type: bool + suppress_arp_disable: + description: + - Overrides the global ARP suppression config. This is available on NX-OS 9K series + running 9.2.x or higher. + type: bool + state: + description: + - Determines whether the config should be present or not on the device. + default: present + choices: + - present + - absent + type: str + multisite_ingress_replication: + description: + - Enables multisite ingress replication. + choices: + - disable + - enable + - optimized + type: str + version_added: 1.1.0 +""" +EXAMPLES = """ +- cisco.nxos.nxos_vxlan_vtep_vni: + interface: nve1 + vni: 6000 + ingress_replication: default + multisite_ingress_replication: enable +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: ["interface nve1", "member vni 6000", "multisite ingress-replication"] +""" + +import re +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + get_config, + load_config, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxos_argument_spec, +) +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + CustomNetworkConfig, +) + +BOOL_PARAMS = ["assoc_vrf", "suppress_arp", "suppress_arp_disable"] +PARAM_TO_DEFAULT_KEYMAP = { + "multicast_group": "", + "peer_list": [], + "ingress_replication": "", +} +PARAM_TO_COMMAND_KEYMAP = { + "assoc_vrf": "associate-vrf", + "interface": "interface", + "vni": "member vni", + "ingress_replication": "ingress-replication protocol", + "multicast_group": "mcast-group", + "peer_list": "peer-ip", + "suppress_arp": "suppress-arp", + "suppress_arp_disable": "suppress-arp disable", + "multisite_ingress_replication": "multisite ingress-replication", +} + + +def get_value(arg, config, module): + command = PARAM_TO_COMMAND_KEYMAP[arg] + command_val_re = re.compile( + r"(?:{0}\s)(?P.*)$".format(command), re.M + ) + + if arg in BOOL_PARAMS: + command_re = re.compile(r"\s+{0}\s*$".format(command), re.M) + value = False + if command_re.search(config): + value = True + elif arg == "peer_list": + has_command_val = command_val_re.findall(config, re.M) + value = [] + if has_command_val: + value = has_command_val + elif arg == "multisite_ingress_replication": + has_command = re.search(r"^\s+{0}$".format(command), config, re.M) + has_command_val = command_val_re.search(config, re.M) + value = "disable" + if has_command: + value = "enable" + elif has_command_val: + value = "optimized" + else: + value = "" + has_command_val = command_val_re.search(config, re.M) + if has_command_val: + value = has_command_val.group("value") + return value + + +def check_interface(module, netcfg): + config = str(netcfg) + + has_interface = re.search(r"(?:interface nve)(?P.*)$", config, re.M) + value = "" + if has_interface: + value = "nve{0}".format(has_interface.group("value")) + + return value + + +def get_existing(module, args): + existing = {} + netcfg = CustomNetworkConfig(indent=2, contents=get_config(module)) + + interface_exist = check_interface(module, netcfg) + if interface_exist: + parents = ["interface {0}".format(interface_exist)] + temp_config = netcfg.get_section(parents) + + if ( + "member vni {0} associate-vrf".format(module.params["vni"]) + in temp_config + ): + parents.append( + "member vni {0} associate-vrf".format(module.params["vni"]) + ) + config = netcfg.get_section(parents) + elif "member vni {0}".format(module.params["vni"]) in temp_config: + parents.append("member vni {0}".format(module.params["vni"])) + config = netcfg.get_section(parents) + else: + config = {} + + if config: + for arg in args: + if arg not in ["interface", "vni"]: + existing[arg] = get_value(arg, config, module) + existing["interface"] = interface_exist + existing["vni"] = module.params["vni"] + + return existing, interface_exist + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + new_dict[new_key] = value + return new_dict + + +def state_present(module, existing, proposed, candidate): + commands = list() + proposed_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, proposed) + existing_commands = apply_key_map(PARAM_TO_COMMAND_KEYMAP, existing) + + for key, value in proposed_commands.items(): + if key == "associate-vrf": + command = "member vni {0} {1}".format(module.params["vni"], key) + if not value: + command = "no {0}".format(command) + commands.append(command) + + elif key == "peer-ip" and value != []: + for peer in value: + commands.append("{0} {1}".format(key, peer)) + + elif key == "mcast-group" and value != existing_commands.get(key): + commands.append("no {0}".format(key)) + vni_command = "member vni {0}".format(module.params["vni"]) + if vni_command not in commands: + commands.append("member vni {0}".format(module.params["vni"])) + if value != PARAM_TO_DEFAULT_KEYMAP.get( + "multicast_group", "default" + ): + commands.append("{0} {1}".format(key, value)) + + elif ( + key == "ingress-replication protocol" + and value != existing_commands.get(key) + ): + evalue = existing_commands.get(key) + dvalue = PARAM_TO_DEFAULT_KEYMAP.get( + "ingress_replication", "default" + ) + if value != dvalue: + if evalue and evalue != dvalue: + commands.append("no {0} {1}".format(key, evalue)) + commands.append("{0} {1}".format(key, value)) + else: + if evalue: + commands.append("no {0} {1}".format(key, evalue)) + + elif value is True: + commands.append(key) + elif value is False: + commands.append("no {0}".format(key)) + elif value == "default" or value == []: + if existing_commands.get(key): + existing_value = existing_commands.get(key) + if key == "peer-ip": + for peer in existing_value: + commands.append("no {0} {1}".format(key, peer)) + else: + commands.append("no {0} {1}".format(key, existing_value)) + else: + if key.replace(" ", "_").replace("-", "_") in BOOL_PARAMS: + commands.append("no {0}".format(key.lower())) + elif ( + key == "multisite ingress-replication" + and value != existing_commands.get(key) + ): + vni_command = "member vni {0}".format(module.params["vni"]) + if vni_command not in commands: + commands.append("member vni {0}".format(module.params["vni"])) + if value == "disable": + command = "no {0}".format(key) + commands.append(command) + elif value == "enable": + command = "{0}".format(key) + commands.append(command) + elif value == "optimized": + command = "{0} {1}".format(key, value) + commands.append(command) + else: + command = "{0} {1}".format(key, value.lower()) + commands.append(command) + + if commands: + vni_command = "member vni {0}".format(module.params["vni"]) + ingress_replications_command = "ingress-replication protocol static" + ingress_replicationb_command = "ingress-replication protocol bgp" + ingress_replicationns_command = ( + "no ingress-replication protocol static" + ) + ingress_replicationnb_command = "no ingress-replication protocol bgp" + interface_command = "interface {0}".format(module.params["interface"]) + + if any( + c in commands + for c in ( + ingress_replications_command, + ingress_replicationb_command, + ingress_replicationnb_command, + ingress_replicationns_command, + ) + ): + static_level_cmds = [cmd for cmd in commands if "peer" in cmd] + parents = [interface_command, vni_command] + commands = [cmd for cmd in commands if "peer" not in cmd] + for cmd in commands: + parents.append(cmd) + candidate.add(static_level_cmds, parents=parents) + + elif "peer-ip" in commands[0]: + static_level_cmds = [cmd for cmd in commands] + parents = [ + interface_command, + vni_command, + ingress_replications_command, + ] + candidate.add(static_level_cmds, parents=parents) + + if vni_command in commands: + parents = [interface_command] + commands.remove(vni_command) + if module.params["assoc_vrf"] is None: + parents.append(vni_command) + candidate.add(commands, parents=parents) + + +def state_absent(module, existing, proposed, candidate): + if existing["assoc_vrf"]: + commands = [ + "no member vni {0} associate-vrf".format(module.params["vni"]) + ] + else: + commands = ["no member vni {0}".format(module.params["vni"])] + parents = ["interface {0}".format(module.params["interface"])] + candidate.add(commands, parents=parents) + + +def main(): + argument_spec = dict( + interface=dict(required=True, type="str"), + vni=dict(required=True, type="str"), + assoc_vrf=dict(required=False, type="bool"), + multicast_group=dict(required=False, type="str"), + peer_list=dict(required=False, type="list", elements="str"), + suppress_arp=dict(required=False, type="bool"), + suppress_arp_disable=dict(required=False, type="bool"), + ingress_replication=dict( + required=False, type="str", choices=["bgp", "static", "default"] + ), + state=dict( + choices=["present", "absent"], default="present", required=False + ), + multisite_ingress_replication=dict( + required=False, + type="str", + choices=["enable", "optimized", "disable"], + ), + ) + + argument_spec.update(nxos_argument_spec) + + mutually_exclusive = [ + ("suppress_arp", "suppress_arp_disable"), + ("assoc_vrf", "multicast_group"), + ("assoc_vrf", "suppress_arp"), + ("assoc_vrf", "suppress_arp_disable"), + ("assoc_vrf", "ingress_replication"), + ] + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) + + warnings = list() + result = {"changed": False, "commands": [], "warnings": warnings} + + if module.params["peer_list"]: + if ( + module.params["peer_list"][0] != "default" + and module.params["ingress_replication"] != "static" + ): + module.fail_json( + msg="ingress_replication=static is required " + "when using peer_list param" + ) + else: + peer_list = module.params["peer_list"] + if peer_list[0] == "default": + module.params["peer_list"] = "default" + else: + stripped_peer_list = list(map(str.strip, peer_list)) + module.params["peer_list"] = stripped_peer_list + + if ( + module.params["multisite_ingress_replication"] == "enable" + or module.params["multisite_ingress_replication"] == "optimized" + ): + if module.params["ingress_replication"] == "static": + module.fail_json( + msg="ingress_replication=static is not allowed " + "when using multisite_ingress_replication" + ) + + state = module.params["state"] + args = PARAM_TO_COMMAND_KEYMAP.keys() + existing, interface_exist = get_existing(module, args) + + if state == "present": + if not interface_exist: + module.fail_json( + msg="The proposed NVE interface does not exist. Use nxos_interface to create it first." + ) + elif interface_exist != module.params["interface"]: + module.fail_json( + msg="Only 1 NVE interface is allowed on the switch." + ) + elif state == "absent": + if interface_exist != module.params["interface"]: + module.exit_json(**result) + elif existing and existing["vni"] != module.params["vni"]: + module.fail_json( + msg="ERROR: VNI delete failed: Could not find vni node for {0}".format( + module.params["vni"] + ), + existing_vni=existing["vni"], + ) + + proposed_args = dict( + (k, v) for k, v in module.params.items() if v is not None and k in args + ) + + proposed = {} + for key, value in proposed_args.items(): + if key in ["multicast_group", "peer_list", "ingress_replication"]: + if str(value).lower() == "default": + value = PARAM_TO_DEFAULT_KEYMAP.get(key, "default") + if key != "interface" and existing.get(key) != value: + proposed[key] = value + + candidate = CustomNetworkConfig(indent=3) + if state == "present": + state_present(module, existing, proposed, candidate) + elif existing and state == "absent": + state_absent(module, existing, proposed, candidate) + + if candidate: + candidate = candidate.items_text() + result["changed"] = True + result["commands"] = candidate + if not module.check_mode: + load_config(module, candidate) + + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_zone_zoneset.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_zone_zoneset.py new file mode 100644 index 00000000..299b5898 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/nxos_zone_zoneset.py @@ -0,0 +1,990 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 + + +DOCUMENTATION = """ +module: nxos_zone_zoneset +short_description: Configuration of zone/zoneset for Cisco NXOS MDS Switches. +description: +- Configuration of zone/zoneset for Cisco MDS NXOS. +version_added: 1.0.0 +author: +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) +notes: +- Tested against NX-OS 8.4(1) +options: + zone_zoneset_details: + description: + - List of zone/zoneset details to be added or removed + type: list + elements: dict + suboptions: + vsan: + description: + - vsan id + required: true + type: int + mode: + description: + - mode of the zone for the vsan + choices: + - enhanced + - basic + type: str + default_zone: + description: + - default zone behaviour for the vsan + choices: + - permit + - deny + type: str + smart_zoning: + description: + - Removes the vsan if True + type: bool + zone: + description: + - List of zone options for that vsan + type: list + elements: dict + suboptions: + name: + description: + - name of the zone + required: true + type: str + remove: + description: + - Deletes the zone if True + type: bool + default: false + members: + description: + - Members of the zone that needs to be removed or added + type: list + elements: dict + suboptions: + pwwn: + description: + - pwwn member of the zone, use alias 'device_alias' as option for + device_alias member + aliases: + - device_alias + required: true + type: str + remove: + description: + - Removes member from the zone if True + type: bool + default: false + devtype: + description: + - devtype of the zone member used along with Smart zoning config + choices: + - initiator + - target + - both + type: str + zoneset: + description: + - List of zoneset options for the vsan + type: list + elements: dict + suboptions: + name: + description: + - name of the zoneset + required: true + type: str + remove: + description: + - Removes zoneset if True + type: bool + default: false + action: + description: + - activates/de-activates the zoneset + choices: + - activate + - deactivate + type: str + members: + description: + - Members of the zoneset that needs to be removed or added + type: list + elements: dict + suboptions: + name: + description: + - name of the zone that needs to be added to the zoneset or removed + from the zoneset + required: true + type: str + remove: + description: + - Removes zone member from the zoneset + type: bool + default: false +""" + +EXAMPLES = """ +- name: Test that zone/zoneset module works + cisco.nxos.nxos_zone_zoneset: + zone_zoneset_details: + - mode: enhanced + vsan: 22 + zone: + - members: + - pwwn: 11:11:11:11:11:11:11:11 + - device_alias: test123 + - pwwn: 61:61:62:62:12:12:12:12 + remove: true + name: zoneA + - members: + - pwwn: 10:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:21:21:21:21 + name: zoneB + - name: zoneC + remove: true + zoneset: + - action: activate + members: + - name: zoneA + - name: zoneB + - name: zoneC + remove: true + name: zsetname1 + - action: deactivate + name: zsetTestExtra + remove: true + - mode: basic + smart_zoning: true + vsan: 21 + zone: + - members: + - devtype: both + pwwn: 11:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:12:12:12:12 + - devtype: both + pwwn: 92:62:62:62:12:12:1a:1a + remove: true + name: zone21A + - members: + - pwwn: 10:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:21:21:21:21 + name: zone21B + zoneset: + - action: activate + members: + - name: zone21A + - name: zone21B + name: zsetname212 + +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - terminal dont-ask + - zone name zoneA vsan 923 + - member pwwn 11:11:11:11:11:11:11:11 + - no member device-alias test123 + - zone commit vsan 923 + - no terminal dont-ask +messages: + description: debug messages + returned: always + type: list + sample: + - "zone mode is already enhanced ,no change in zone mode configuration for vsan 922" + - "zone member '11:11:11:11:11:11:11:11' is already present in zone 'zoneA' in vsan 922 hence nothing to add" + - "zone member 'test123' is already present in zone 'zoneA' in vsan 922 hence nothing to add" + - "zone member '61:61:62:62:12:12:12:12' is not present in zone 'zoneA' in vsan 922 hence nothing to remove" + - "zone member '10:11:11:11:11:11:11:11' is already present in zone 'zoneB' in vsan 922 hence nothing to add" + - "zone member '62:62:62:62:21:21:21:21' is already present in zone 'zoneB' in vsan 922 hence nothing to add" + - "zone 'zoneC' is not present in vsan 922 , so nothing to remove" +""" + + +import re +import json +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) + + +__metaclass__ = type + + +class ShowZonesetActive(object): + """docstring for ShowZonesetActive""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.module = module + self.activeZSName = None + self.parseCmdOutput() + + def execute_show_zoneset_active_cmd(self): + command = ( + "show zoneset active vsan " + str(self.vsan) + " | grep zoneset" + ) + output = execute_show_command(command, self.module)[0] + return output + + def parseCmdOutput(self): + patZoneset = r"zoneset name (\S+) vsan " + str(self.vsan) + output = self.execute_show_zoneset_active_cmd().split("\n") + if len(output) == 0: + return + else: + for line in output: + line = line.strip() + mzs = re.match(patZoneset, line.strip()) + if mzs: + self.activeZSName = mzs.group(1).strip() + return + + def isZonesetActive(self, zsname): + if zsname == self.activeZSName: + return True + return False + + +class ShowZoneset(object): + """docstring for ShowZoneset""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.module = module + self.zsDetails = {} + self.parseCmdOutput() + + def execute_show_zoneset_cmd(self): + command = "show zoneset vsan " + str(self.vsan) + output = execute_show_command(command, self.module)[0] + return output + + def parseCmdOutput(self): + patZoneset = r"zoneset name (\S+) vsan " + str(self.vsan) + patZone = r"zone name (\S+) vsan " + str(self.vsan) + output = self.execute_show_zoneset_cmd().split("\n") + for line in output: + line = line.strip() + mzs = re.match(patZoneset, line.strip()) + mz = re.match(patZone, line.strip()) + if mzs: + zonesetname = mzs.group(1).strip() + self.zsDetails[zonesetname] = [] + continue + elif mz: + zonename = mz.group(1).strip() + v = self.zsDetails[zonesetname] + v.append(zonename) + self.zsDetails[zonesetname] = v + + def isZonesetPresent(self, zsname): + return zsname in self.zsDetails.keys() + + def isZonePresentInZoneset(self, zsname, zname): + if zsname in self.zsDetails.keys(): + return zname in self.zsDetails[zsname] + return False + + +class ShowZone(object): + """docstring for ShowZone""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.module = module + self.zDetails = {} + self.parseCmdOutput() + + def execute_show_zone_vsan_cmd(self): + command = "show zone vsan " + str(self.vsan) + output = execute_show_command(command, self.module)[0] + return output + + def parseCmdOutput(self): + patZone = r"zone name (\S+) vsan " + str(self.vsan) + output = self.execute_show_zone_vsan_cmd().split("\n") + for line in output: + line = " ".join(line.strip().split()) + if "init" in line: + line = line.replace("init", "initiator") + m = re.match(patZone, line) + if m: + zonename = m.group(1).strip() + self.zDetails[zonename] = [] + continue + else: + # For now we support only pwwn and device-alias under zone + # Ideally should use 'supported_choices'....but maybe next + # time. + if "pwwn" in line or "device-alias" in line: + v = self.zDetails[zonename] + v.append(line) + self.zDetails[zonename] = v + + def isZonePresent(self, zname): + return zname in self.zDetails.keys() + + def isZoneMemberPresent(self, zname, cmd): + if zname in self.zDetails.keys(): + zonememlist = self.zDetails[zname] + for eachline in zonememlist: + if cmd in eachline: + return True + return False + + def get_zDetails(self): + return self.zDetails + + +class ShowZoneStatus(object): + """docstring for ShowZoneStatus""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.vsanAbsent = False + self.module = module + self.default_zone = "" + self.mode = "" + self.session = "" + self.sz = "" + self.locked = False + self.update() + + def execute_show_zone_status_cmd(self): + command = "show zone status vsan " + str(self.vsan) + output = execute_show_command(command, self.module)[0] + return output + + def update(self): + + output = self.execute_show_zone_status_cmd().split("\n") + + patfordefzone = "VSAN: " + str(self.vsan) + r" default-zone:\s+(\S+).*" + patformode = r".*mode:\s+(\S+).*" + patforsession = r"^session:\s+(\S+).*" + patforsz = r".*smart-zoning:\s+(\S+).*" + for line in output: + if "is not configured" in line: + self.vsanAbsent = True + break + mdefz = re.match(patfordefzone, line.strip()) + mmode = re.match(patformode, line.strip()) + msession = re.match(patforsession, line.strip()) + msz = re.match(patforsz, line.strip()) + + if mdefz: + self.default_zone = mdefz.group(1) + if mmode: + self.mode = mmode.group(1) + if msession: + self.session = msession.group(1) + if self.session != "none": + self.locked = True + if msz: + self.sz = msz.group(1) + + def isLocked(self): + return self.locked + + def getDefaultZone(self): + return self.default_zone + + def getMode(self): + return self.mode + + def getSmartZoningStatus(self): + return self.sz + + def isVsanAbsent(self): + return self.vsanAbsent + + +def execute_show_command(command, module, command_type="cli_show"): + output = "text" + commands = [{"command": command, "output": output}] + return run_commands(module, commands) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def getMemType(supported_choices, allmemkeys, default="pwwn"): + for eachchoice in supported_choices: + if eachchoice in allmemkeys: + return eachchoice + return default + + +def main(): + + supported_choices = ["device_alias"] + zone_member_spec = dict( + pwwn=dict(required=True, type="str", aliases=["device_alias"]), + devtype=dict(type="str", choices=["initiator", "target", "both"]), + remove=dict(type="bool", default=False), + ) + + zone_spec = dict( + name=dict(required=True, type="str"), + members=dict(type="list", elements="dict", options=zone_member_spec), + remove=dict(type="bool", default=False), + ) + + zoneset_member_spec = dict( + name=dict(required=True, type="str"), + remove=dict(type="bool", default=False), + ) + + zoneset_spec = dict( + name=dict(type="str", required=True), + members=dict( + type="list", elements="dict", options=zoneset_member_spec + ), + remove=dict(type="bool", default=False), + action=dict(type="str", choices=["activate", "deactivate"]), + ) + + zonedetails_spec = dict( + vsan=dict(required=True, type="int"), + mode=dict(type="str", choices=["enhanced", "basic"]), + default_zone=dict(type="str", choices=["permit", "deny"]), + smart_zoning=dict(type="bool"), + zone=dict(type="list", elements="dict", options=zone_spec), + zoneset=dict(type="list", elements="dict", options=zoneset_spec), + ) + + argument_spec = dict( + zone_zoneset_details=dict( + type="list", elements="dict", options=zonedetails_spec + ) + ) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + messages = list() + commands = list() + result = {"changed": False} + + commands_executed = [] + listOfZoneDetails = module.params["zone_zoneset_details"] + for eachZoneZonesetDetail in listOfZoneDetails: + vsan = eachZoneZonesetDetail["vsan"] + op_mode = eachZoneZonesetDetail["mode"] + op_default_zone = eachZoneZonesetDetail["default_zone"] + op_smart_zoning = eachZoneZonesetDetail["smart_zoning"] + op_zone = eachZoneZonesetDetail["zone"] + op_zoneset = eachZoneZonesetDetail["zoneset"] + + # Step1: execute show zone status and get + shZoneStatusObj = ShowZoneStatus(module, vsan) + sw_default_zone = shZoneStatusObj.getDefaultZone() + sw_mode = shZoneStatusObj.getMode() + sw_smart_zoning = shZoneStatusObj.getSmartZoningStatus() + + if sw_smart_zoning.lower() == "Enabled".lower(): + sw_smart_zoning_bool = True + else: + sw_smart_zoning_bool = False + + if shZoneStatusObj.isVsanAbsent(): + module.fail_json( + msg="Vsan " + + str(vsan) + + " is not present in the switch. Hence cannot procced." + ) + + if shZoneStatusObj.isLocked(): + module.fail_json( + msg="zone has acquired lock on the switch for vsan " + + str(vsan) + + ". Hence cannot procced." + ) + + # Process zone default zone options + if op_default_zone is not None: + if op_default_zone != sw_default_zone: + if op_default_zone == "permit": + commands_executed.append( + "zone default-zone permit vsan " + str(vsan) + ) + messages.append( + "default zone configuration changed from deny to permit for vsan " + + str(vsan) + ) + else: + commands_executed.append( + "no zone default-zone permit vsan " + str(vsan) + ) + messages.append( + "default zone configuration changed from permit to deny for vsan " + + str(vsan) + ) + else: + messages.append( + "default zone is already " + + op_default_zone + + " ,no change in default zone configuration for vsan " + + str(vsan) + ) + + # Process zone mode options + if op_mode is not None: + if op_mode != sw_mode: + if op_mode == "enhanced": + commands_executed.append( + "zone mode enhanced vsan " + str(vsan) + ) + messages.append( + "zone mode configuration changed from basic to enhanced for vsan " + + str(vsan) + ) + else: + commands_executed.append( + "no zone mode enhanced vsan " + str(vsan) + ) + messages.append( + "zone mode configuration changed from enhanced to basic for vsan " + + str(vsan) + ) + else: + messages.append( + "zone mode is already " + + op_mode + + " ,no change in zone mode configuration for vsan " + + str(vsan) + ) + + # Process zone smart-zone options + if op_smart_zoning is not None: + if op_smart_zoning != sw_smart_zoning_bool: + if op_smart_zoning: + commands_executed.append( + "zone smart-zoning enable vsan " + str(vsan) + ) + messages.append( + "smart-zoning enabled for vsan " + str(vsan) + ) + else: + commands_executed.append( + "no zone smart-zoning enable vsan " + str(vsan) + ) + messages.append( + "smart-zoning disabled for vsan " + str(vsan) + ) + else: + messages.append( + "smart-zoning is already set to " + + sw_smart_zoning + + " , no change in smart-zoning configuration for vsan " + + str(vsan) + ) + + # Process zone member options + # TODO: Obviously this needs to be cleaned up properly, as there are a lot of ifelse statements which is bad + # Will take it up later becoz of time constraints + if op_zone is not None: + shZoneObj = ShowZone(module, vsan) + for eachzone in op_zone: + zname = eachzone["name"] + zmembers = eachzone["members"] + removeflag = eachzone["remove"] + if removeflag: + if shZoneObj.isZonePresent(zname): + messages.append( + "zone '" + + zname + + "' is removed from vsan " + + str(vsan) + ) + commands_executed.append( + "no zone name " + zname + " vsan " + str(vsan) + ) + else: + messages.append( + "zone '" + + zname + + "' is not present in vsan " + + str(vsan) + + " , so nothing to remove" + ) + else: + if zmembers is None: + if shZoneObj.isZonePresent(zname): + messages.append( + "zone '" + + zname + + "' is already present in vsan " + + str(vsan) + ) + else: + commands_executed.append( + "zone name " + zname + " vsan " + str(vsan) + ) + messages.append( + "zone '" + + zname + + "' is created in vsan " + + str(vsan) + ) + else: + cmdmemlist = [] + for eachmem in zmembers: + memtype = getMemType( + supported_choices, eachmem.keys() + ) + cmd = ( + memtype.replace("_", "-") + + " " + + eachmem[memtype] + ) + if op_smart_zoning or sw_smart_zoning_bool: + if eachmem["devtype"] is not None: + cmd = cmd + " " + eachmem["devtype"] + if eachmem["remove"]: + if shZoneObj.isZonePresent(zname): + if shZoneObj.isZoneMemberPresent( + zname, cmd + ): + cmd = "no member " + cmd + cmdmemlist.append(cmd) + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "removing zone member '" + + eachmem[memtype] + + " of device type '" + + eachmem["devtype"] + + "' from zone '" + + zname + + "' in vsan " + + str(vsan) + ) + else: + messages.append( + "removing zone member '" + + eachmem[memtype] + + "' from zone '" + + zname + + "' in vsan " + + str(vsan) + ) + else: + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "zone member '" + + eachmem[memtype] + + "' of device type '" + + eachmem["devtype"] + + "' is not present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to remove" + ) + else: + messages.append( + "zone member '" + + eachmem[memtype] + + "' is not present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to remove" + ) + else: + messages.append( + "zone '" + + zname + + "' is not present in vsan " + + str(vsan) + + " , hence cannot remove the members" + ) + + else: + if shZoneObj.isZoneMemberPresent(zname, cmd): + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "zone member '" + + eachmem[memtype] + + "' of device type '" + + eachmem["devtype"] + + "' is already present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to add" + ) + else: + messages.append( + "zone member '" + + eachmem[memtype] + + "' is already present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to add" + ) + else: + cmd = "member " + cmd + cmdmemlist.append(cmd) + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "adding zone member '" + + eachmem[memtype] + + "' of device type '" + + eachmem["devtype"] + + "' to zone '" + + zname + + "' in vsan " + + str(vsan) + ) + else: + messages.append( + "adding zone member '" + + eachmem[memtype] + + "' to zone '" + + zname + + "' in vsan " + + str(vsan) + ) + if len(cmdmemlist) != 0: + commands_executed.append( + "zone name " + zname + " vsan " + str(vsan) + ) + commands_executed = commands_executed + cmdmemlist + + # Process zoneset member options + if op_zoneset is not None: + dactcmd = [] + actcmd = [] + shZonesetObj = ShowZoneset(module, vsan) + shZonesetActiveObj = ShowZonesetActive(module, vsan) + for eachzoneset in op_zoneset: + zsetname = eachzoneset["name"] + zsetmembers = eachzoneset["members"] + removeflag = eachzoneset["remove"] + actionflag = eachzoneset["action"] + if removeflag: + if shZonesetObj.isZonesetPresent(zsetname): + messages.append( + "zoneset '" + + zsetname + + "' is removed from vsan " + + str(vsan) + ) + commands_executed.append( + "no zoneset name " + + zsetname + + " vsan " + + str(vsan) + ) + else: + messages.append( + "zoneset '" + + zsetname + + "' is not present in vsan " + + str(vsan) + + " ,hence there is nothing to remove" + ) + else: + if zsetmembers is not None: + cmdmemlist = [] + for eachzsmem in zsetmembers: + zsetmem_name = eachzsmem["name"] + zsetmem_removeflag = eachzsmem["remove"] + if zsetmem_removeflag: + if shZonesetObj.isZonePresentInZoneset( + zsetname, zsetmem_name + ): + cmd = "no member " + zsetmem_name + cmdmemlist.append(cmd) + messages.append( + "removing zoneset member '" + + zsetmem_name + + "' from zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + else: + messages.append( + "zoneset member '" + + zsetmem_name + + "' is not present in zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " ,hence there is nothing to remove" + ) + else: + if shZonesetObj.isZonePresentInZoneset( + zsetname, zsetmem_name + ): + messages.append( + "zoneset member '" + + zsetmem_name + + "' is already present in zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " ,hence there is nothing to add" + ) + else: + cmd = "member " + zsetmem_name + cmdmemlist.append(cmd) + messages.append( + "adding zoneset member '" + + zsetmem_name + + "' to zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + if len(cmdmemlist) != 0: + commands_executed.append( + "zoneset name " + + zsetname + + " vsan " + + str(vsan) + ) + commands_executed = commands_executed + cmdmemlist + else: + if shZonesetObj.isZonesetPresent(zsetname): + messages.append( + "zoneset '" + + zsetname + + "' is already present in vsan " + + str(vsan) + ) + else: + commands_executed.append( + "zoneset name " + + zsetname + + " vsan " + + str(vsan) + ) + messages.append( + "zoneset '" + + zsetname + + "' is created in vsan " + + str(vsan) + ) + + # Process zoneset activate options + if actionflag == "deactivate": + if shZonesetActiveObj.isZonesetActive(zsetname): + messages.append( + "deactivating zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + dactcmd.append( + "no zoneset activate name " + + zsetname + + " vsan " + + str(vsan) + ) + else: + messages.append( + "zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " is not activated, hence cannot deactivate" + ) + elif actionflag == "activate": + if commands_executed: + messages.append( + "activating zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + actcmd.append( + "zoneset activate name " + + zsetname + + " vsan " + + str(vsan) + ) + else: + messages.append( + "no changes to existing zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " hence activate action is ignored" + ) + commands_executed = commands_executed + dactcmd + actcmd + + if commands_executed: + if op_mode == "enhanced": + commands_executed.append("zone commit vsan " + str(vsan)) + elif op_mode is None: + if sw_mode == "enhanced": + commands_executed.append("zone commit vsan " + str(vsan)) + + if commands_executed: + commands_executed = ( + ["terminal dont-ask"] + + commands_executed + + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands_executed) + if cmds: + if module.check_mode: + module.exit_json( + changed=False, + commands=cmds, + msg="Check Mode: No cmds issued to the hosts", + ) + else: + result["changed"] = True + commands = commands + cmds + load_config(module, cmds) + + result["messages"] = messages + result["commands"] = commands_executed + result["warnings"] = warnings + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_devicealias.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_devicealias.py new file mode 100644 index 00000000..30edfc75 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_devicealias.py @@ -0,0 +1,593 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 + + +DOCUMENTATION = """ +module: nxos_devicealias +short_description: Configuration of device alias for Cisco NXOS MDS Switches. +description: +- Configuration of device alias for Cisco MDS NXOS. +version_added: 1.0.0 +author: +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) +notes: +- Tested against NX-OS 8.4(1) +options: + distribute: + description: + - Enable/Disable device-alias distribution + type: bool + mode: + description: + - Mode of devices-alias, basic or enhanced + choices: + - basic + - enhanced + type: str + da: + description: + - List of device-alias to be added or removed + type: list + elements: dict + suboptions: + name: + description: + - Name of the device-alias to be added or removed + required: true + type: str + pwwn: + description: + - pwwn to which the name needs to be associated with + type: str + remove: + description: + - Removes the device-alias if set to True + type: bool + default: false + rename: + description: + - List of device-alias to be renamed + type: list + elements: dict + suboptions: + old_name: + description: + - Old name of the device-alias that needs to be renamed + required: true + type: str + new_name: + description: + - New name of the device-alias + required: true + type: str +""" + +EXAMPLES = """ +- name: Test that device alias module works + cisco.nxos.nxos_devicealias: + da: + - name: test1_add + pwwn: 56:2:22:11:22:88:11:67 + - name: test2_add + pwwn: 65:22:22:11:22:22:11:d + - name: dev1 + remove: true + - name: dev2 + remove: true + distribute: true + mode: enhanced + rename: + - new_name: bcd + old_name: abc + - new_name: bcd1 + old_name: abc1 + + +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - terminal dont-ask + - device-alias database + - device-alias name somename pwwn 10:00:00:00:89:a1:01:03 + - device-alias name somename1 pwwn 10:00:00:00:89:a1:02:03 + - device-alias commit + - no terminal dont-ask +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +import string + +__metaclass__ = type + +VALID_DA_CHARS = ("-", "_", "$", "^") + + +class showDeviceAliasStatus(object): + """docstring for showDeviceAliasStatus""" + + def __init__(self, module): + self.module = module + self.distribute = "" + self.mode = "" + self.locked = False + self.update() + + def execute_show_cmd(self, cmd): + output = execute_show_command(cmd, self.module)[0] + return output + + def update(self): + command = "show device-alias status" + output = self.execute_show_cmd(command).split("\n") + for o in output: + if "Fabric Distribution" in o: + self.distribute = o.split(":")[1].strip().lower() + if "Mode" in o: + self.mode = o.split("Mode:")[1].strip().lower() + if "Locked" in o: + self.locked = True + + def isLocked(self): + return self.locked + + def getDistribute(self): + return self.distribute + + def getMode(self): + return self.mode + + +class showDeviceAliasDatabase(object): + """docstring for showDeviceAliasDatabase""" + + def __init__(self, module): + self.module = module + self.da_dict = {} + self.update() + + def execute_show_cmd(self, cmd): + output = execute_show_command(cmd, self.module)[0] + return output + + def update(self): + command = "show device-alias database" + # output = execute_show_command(command, self.module)[0].split("\n") + output = self.execute_show_cmd(command) + self.da_list = output.split("\n") + for eachline in self.da_list: + if "device-alias" in eachline: + sv = eachline.strip().split() + self.da_dict[sv[2]] = sv[4] + + def isNameInDaDatabase(self, name): + return name in self.da_dict.keys() + + def isPwwnInDaDatabase(self, pwwn): + newpwwn = ":".join( + ["0" + str(ep) if len(ep) == 1 else ep for ep in pwwn.split(":")] + ) + return newpwwn in self.da_dict.values() + + def isNamePwwnPresentInDatabase(self, name, pwwn): + newpwwn = ":".join( + ["0" + str(ep) if len(ep) == 1 else ep for ep in pwwn.split(":")] + ) + if name in self.da_dict.keys(): + if newpwwn == self.da_dict[name]: + return True + return False + + def getPwwnByName(self, name): + if name in self.da_dict.keys(): + return self.da_dict[name] + else: + return None + + def getNameByPwwn(self, pwwn): + newpwwn = ":".join( + ["0" + str(ep) if len(ep) == 1 else ep for ep in pwwn.split(":")] + ) + for n, p in self.da_dict.items(): + if p == newpwwn: + return n + return None + + +def isPwwnValid(pwwn): + pwwnsplit = pwwn.split(":") + if len(pwwnsplit) != 8: + return False + for eachpwwnsplit in pwwnsplit: + if len(eachpwwnsplit) > 2 or len(eachpwwnsplit) < 1: + return False + if not all(c in string.hexdigits for c in eachpwwnsplit): + return False + return True + + +def isNameValid(name): + if not name[0].isalpha(): + # Illegal first character. Name must start with a letter + return False + if len(name) > 64: + return False + for character in name: + if not character.isalnum() and character not in VALID_DA_CHARS: + return False + return True + + +def execute_show_command(command, module, command_type="cli_show"): + output = "text" + commands = [{"command": command, "output": output}] + out = run_commands(module, commands) + return out + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def main(): + element_spec = dict( + name=dict(required=True, type="str"), + pwwn=dict(type="str"), + remove=dict(type="bool", default=False), + ) + + element_spec_rename = dict( + old_name=dict(required=True, type="str"), + new_name=dict(required=True, type="str"), + ) + + argument_spec = dict( + distribute=dict(type="bool"), + mode=dict(type="str", choices=["enhanced", "basic"]), + da=dict(type="list", elements="dict", options=element_spec), + rename=dict(type="list", elements="dict", options=element_spec_rename), + ) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + messages = list() + commands_to_execute = list() + result = {"changed": False} + + distribute = module.params["distribute"] + mode = module.params["mode"] + da = module.params["da"] + rename = module.params["rename"] + + # Step 0.0: Validate syntax of name and pwwn + # Also validate syntax of rename arguments + if da is not None: + for eachdict in da: + name = eachdict["name"] + pwwn = eachdict["pwwn"] + remove = eachdict["remove"] + if pwwn is not None: + pwwn = pwwn.lower() + if not remove: + if pwwn is None: + module.fail_json( + msg="This device alias name " + + str(name) + + " which needs to be added, does not have pwwn specified. Please specify a valid pwwn" + ) + if not isNameValid(name): + module.fail_json( + msg="This pwwn name is invalid : " + + str(name) + + ". Note that name cannot be more than 64 alphanumeric chars, " + + "it must start with a letter, and can only contain these characters: " + + ", ".join( + ["'{0}'".format(c) for c in VALID_DA_CHARS] + ) + ) + if not isPwwnValid(pwwn): + module.fail_json( + msg="This pwwn is invalid : " + + str(pwwn) + + ". Please check that its a valid pwwn" + ) + if rename is not None: + for eachdict in rename: + oldname = eachdict["old_name"] + newname = eachdict["new_name"] + if not isNameValid(oldname): + module.fail_json( + msg="This pwwn name is invalid : " + + str(oldname) + + ". Note that name cannot be more than 64 alphanumeric chars, " + + "it must start with a letter, and can only contain these characters: " + + ", ".join(["'{0}'".format(c) for c in VALID_DA_CHARS]) + ) + if not isNameValid(newname): + module.fail_json( + msg="This pwwn name is invalid : " + + str(newname) + + ". Note that name cannot be more than 64 alphanumeric chars, " + + "it must start with a letter, and can only contain these characters: " + + ", ".join(["'{0}'".format(c) for c in VALID_DA_CHARS]) + ) + + # Step 0.1: Check DA status + shDAStausObj = showDeviceAliasStatus(module) + d = shDAStausObj.getDistribute() + m = shDAStausObj.getMode() + if shDAStausObj.isLocked(): + module.fail_json( + msg="device-alias has acquired lock on the switch. Hence cannot procced." + ) + + # Step 1: Process distribute + commands = [] + if distribute is not None: + if distribute: + # playbook has distribute as True(enabled) + if d == "disabled": + # but switch distribute is disabled(false), so set it to + # true(enabled) + commands.append("device-alias distribute") + messages.append( + "device-alias distribute changed from disabled to enabled" + ) + else: + messages.append( + "device-alias distribute remains unchanged. current distribution mode is enabled" + ) + else: + # playbook has distribute as False(disabled) + if d == "enabled": + # but switch distribute is enabled(true), so set it to + # false(disabled) + commands.append("no device-alias distribute") + messages.append( + "device-alias distribute changed from enabled to disabled" + ) + else: + messages.append( + "device-alias distribute remains unchanged. current distribution mode is disabled" + ) + + cmds = flatten_list(commands) + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the da_add/da_remove stage + pass + else: + result["changed"] = True + load_config(module, cmds) + + # Step 2: Process mode + commands = [] + if mode is not None: + if mode == "basic": + # playbook has mode as basic + if m == "enhanced": + # but switch mode is enhanced, so set it to basic + commands.append("no device-alias mode enhanced") + messages.append( + "device-alias mode changed from enhanced to basic" + ) + else: + messages.append( + "device-alias mode remains unchanged. current mode is basic" + ) + + else: + # playbook has mode as enhanced + if m == "basic": + # but switch mode is basic, so set it to enhanced + commands.append("device-alias mode enhanced") + messages.append( + "device-alias mode changed from basic to enhanced" + ) + else: + messages.append( + "device-alias mode remains unchanged. current mode is enhanced" + ) + + if commands: + if distribute: + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + else: + if distribute is None and d == "enabled": + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands) + + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the end + pass + else: + result["changed"] = True + load_config(module, cmds) + + # Step 3: Process da + commands = [] + shDADatabaseObj = showDeviceAliasDatabase(module) + if da is not None: + da_remove_list = [] + da_add_list = [] + for eachdict in da: + name = eachdict["name"] + pwwn = eachdict["pwwn"] + remove = eachdict["remove"] + if pwwn is not None: + pwwn = pwwn.lower() + if remove: + if shDADatabaseObj.isNameInDaDatabase(name): + commands.append("no device-alias name " + name) + da_remove_list.append(name) + else: + messages.append( + name + + " - This device alias name is not in switch device-alias database, hence cannot be removed." + ) + else: + if shDADatabaseObj.isNamePwwnPresentInDatabase(name, pwwn): + messages.append( + name + + " : " + + pwwn + + " - This device alias name,pwwn is already in switch device-alias database, hence nothing to configure" + ) + else: + if shDADatabaseObj.isNameInDaDatabase(name): + module.fail_json( + msg=name + + " - This device alias name is already present in switch device-alias database but assigned to another pwwn (" + + shDADatabaseObj.getPwwnByName(name) + + ") hence cannot be added" + ) + + elif shDADatabaseObj.isPwwnInDaDatabase(pwwn): + module.fail_json( + msg=pwwn + + " - This device alias pwwn is already present in switch device-alias database but assigned to another name (" + + shDADatabaseObj.getNameByPwwn(pwwn) + + ") hence cannot be added" + ) + + else: + commands.append( + "device-alias name " + name + " pwwn " + pwwn + ) + da_add_list.append(name) + + if len(da_add_list) != 0 or len(da_remove_list) != 0: + commands = ["device-alias database"] + commands + if distribute: + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + else: + if distribute is None and d == "enabled": + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + + commands + + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands) + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the end + pass + else: + result["changed"] = True + load_config(module, cmds) + if len(da_remove_list) != 0: + messages.append( + "the required device-alias were removed. " + + ",".join(da_remove_list) + ) + if len(da_add_list) != 0: + messages.append( + "the required device-alias were added. " + + ",".join(da_add_list) + ) + + # Step 5: Process rename + commands = [] + if rename is not None: + for eachdict in rename: + oldname = eachdict["old_name"] + newname = eachdict["new_name"] + if shDADatabaseObj.isNameInDaDatabase(newname): + module.fail_json( + changed=False, + commands=cmds, + msg=newname + + " - this name is already present in the device-alias database, hence we cannot rename " + + oldname + + " with this one", + ) + if shDADatabaseObj.isNameInDaDatabase(oldname): + commands.append( + "device-alias rename " + oldname + " " + newname + ) + else: + module.fail_json( + changed=False, + commands=cmds, + msg=oldname + + " - this name is not present in the device-alias database, hence we cannot rename.", + ) + + if len(commands) != 0: + commands = ["device-alias database"] + commands + if distribute: + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + commands + ["no terminal dont-ask"] + ) + else: + if distribute is None and d == "enabled": + commands.append("device-alias commit") + commands = ( + ["terminal dont-ask"] + + commands + + ["no terminal dont-ask"] + ) + cmds = flatten_list(commands) + if cmds: + commands_to_execute = commands_to_execute + cmds + if module.check_mode: + # Check mode implemented at the end + pass + else: + result["changed"] = True + load_config(module, cmds) + + # Step END: check for 'check' mode + if module.check_mode: + module.exit_json( + changed=False, + commands=commands_to_execute, + msg="Check Mode: No cmds issued to the hosts", + ) + + result["messages"] = messages + result["commands"] = commands_to_execute + result["warnings"] = warnings + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_vsan.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_vsan.py new file mode 100644 index 00000000..c68dd0ca --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_vsan.py @@ -0,0 +1,385 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 + + +DOCUMENTATION = """ +module: nxos_vsan +short_description: Configuration of vsan for Cisco NXOS MDS Switches. +description: +- Configuration of vsan for Cisco MDS NXOS. +version_added: 1.0.0 +author: +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) +notes: +- Tested against NX-OS 8.4(1) +options: + vsan: + description: + - List of vsan details to be added or removed + type: list + elements: dict + suboptions: + id: + description: + - Vsan id + required: true + type: int + name: + description: + - Name of the vsan + type: str + suspend: + description: + - suspend the vsan if True + type: bool + remove: + description: + - Removes the vsan if True + type: bool + interface: + description: + - List of vsan's interfaces to be added + type: list + elements: str +""" + +EXAMPLES = """ +- name: Test that vsan module works + cisco.nxos.nxos_vsan: + vsan: + - id: 922 + interface: + - fc1/1 + - fc1/2 + - port-channel 1 + name: vsan-SAN-A + remove: false + suspend: false + - id: 923 + interface: + - fc1/11 + - fc1/21 + - port-channel 2 + name: vsan-SAN-B + remove: false + suspend: true + - id: 1923 + name: vsan-SAN-Old + remove: true +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - terminal dont-ask + - vsan database + - vsan 922 interface fc1/40 + - vsan 922 interface port-channel 155 + - no terminal dont-ask +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) +import re + +__metaclass__ = type + + +class Vsan(object): + def __init__(self, vsanid): + self.vsanid = vsanid + self.vsanname = None + self.vsanstate = None + self.vsanoperstate = None + self.vsaninterfaces = [] + + +class GetVsanInfoFromSwitch(object): + """docstring for GetVsanInfoFromSwitch""" + + def __init__(self, module): + self.module = module + self.vsaninfo = {} + self.processShowVsan() + self.processShowVsanMembership() + + def execute_show_vsan_cmd(self): + output = execute_show_command("show vsan", self.module)[0] + return output + + def execute_show_vsan_mem_cmd(self): + output = execute_show_command("show vsan membership", self.module)[0] + return output + + def processShowVsan(self): + patv = r"^vsan\s+(\d+)\s+information" + patnamestate = "name:(.*)state:(.*)" + patoperstate = "operational state:(.*)" + + output = self.execute_show_vsan_cmd().split("\n") + for o in output: + z = re.match(patv, o.strip()) + if z: + v = z.group(1).strip() + self.vsaninfo[v] = Vsan(v) + + z1 = re.match(patnamestate, o.strip()) + if z1: + n = z1.group(1).strip() + s = z1.group(2).strip() + self.vsaninfo[v].vsanname = n + self.vsaninfo[v].vsanstate = s + + z2 = re.match(patoperstate, o.strip()) + if z2: + oper = z2.group(1).strip() + self.vsaninfo[v].vsanoperstate = oper + + # 4094/4079 vsan is always present + self.vsaninfo["4079"] = Vsan("4079") + self.vsaninfo["4094"] = Vsan("4094") + + def processShowVsanMembership(self): + patv = r"^vsan\s+(\d+).*" + output = self.execute_show_vsan_mem_cmd().split("\n") + memlist = [] + v = None + for o in output: + z = re.match(patv, o.strip()) + if z: + if v is not None: + self.vsaninfo[v].vsaninterfaces = memlist + memlist = [] + v = z.group(1) + if "interfaces" not in o: + llist = o.strip().split() + memlist = memlist + llist + self.vsaninfo[v].vsaninterfaces = memlist + + def getVsanInfoObjects(self): + return self.vsaninfo + + +def execute_show_command(command, module, command_type="cli_show"): + output = "text" + commands = [{"command": command, "output": output}] + return run_commands(module, commands) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def main(): + vsan_element_spec = dict( + id=dict(required=True, type="int"), + name=dict(type="str"), + remove=dict(type="bool"), + suspend=dict(type="bool"), + interface=dict(type="list", elements="str"), + ) + + argument_spec = dict( + vsan=dict(type="list", elements="dict", options=vsan_element_spec) + ) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + warnings = list() + messages = list() + commands_executed = list() + result = {"changed": False} + + obj = GetVsanInfoFromSwitch(module) + dictSwVsanObjs = obj.getVsanInfoObjects() + + commands = [] + vsan_list = module.params["vsan"] + + for eachvsan in vsan_list: + vsanid = str(eachvsan["id"]) + vsanname = eachvsan["name"] + vsanremove = eachvsan["remove"] + vsansuspend = eachvsan["suspend"] + vsaninterface_list = eachvsan["interface"] + + if int(vsanid) < 1 or int(vsanid) >= 4095: + module.fail_json( + msg=vsanid + + " - This is an invalid vsan. Supported vsan range is 1-4094" + ) + + if vsanid in dictSwVsanObjs.keys(): + sw_vsanid = vsanid + sw_vsanname = dictSwVsanObjs[vsanid].vsanname + sw_vsanstate = dictSwVsanObjs[vsanid].vsanstate + sw_vsaninterfaces = dictSwVsanObjs[vsanid].vsaninterfaces + else: + sw_vsanid = None + sw_vsanname = None + sw_vsanstate = None + sw_vsaninterfaces = [] + + if vsanremove: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + + " is a reserved vsan, hence cannot be removed" + ) + continue + if vsanid == sw_vsanid: + commands.append("no vsan " + str(vsanid)) + messages.append("deleting the vsan " + str(vsanid)) + else: + messages.append( + "There is no vsan " + + str(vsanid) + + " present in the switch. Hence there is nothing to delete" + ) + continue + else: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + + " is a reserved vsan, and always present on the switch" + ) + else: + if vsanid == sw_vsanid: + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch. Hence there is nothing to configure" + ) + else: + commands.append("vsan " + str(vsanid)) + messages.append("creating vsan " + str(vsanid)) + + if vsanname is not None: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + " is a reserved vsan, and cannot be renamed" + ) + else: + if vsanname == sw_vsanname: + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch, which has the name " + + vsanname + + " Hence there is nothing to configure" + ) + else: + commands.append( + "vsan " + str(vsanid) + " name " + vsanname + ) + messages.append( + "setting vsan name to " + + vsanname + + " for vsan " + + str(vsanid) + ) + + if vsansuspend: + # Negative case: + if vsanid == "4079" or vsanid == "4094": + messages.append( + str(vsanid) + + " is a reserved vsan, and cannot be suspended" + ) + else: + if sw_vsanstate == "suspended": + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch, which is in suspended state " + ) + else: + commands.append("vsan " + str(vsanid) + " suspend") + messages.append("suspending the vsan " + str(vsanid)) + else: + if sw_vsanstate == "active": + messages.append( + "There is already a vsan " + + str(vsanid) + + " present in the switch, which is in active state " + ) + else: + commands.append("no vsan " + str(vsanid) + " suspend") + messages.append("no suspending the vsan " + str(vsanid)) + + if vsaninterface_list is not None: + for each_interface_name in vsaninterface_list: + # For fcip,port-channel,vfc-port-channel need to remove the + # extra space to compare + temp = re.sub(" +", "", each_interface_name) + if temp in sw_vsaninterfaces: + messages.append( + each_interface_name + + " is already present in the vsan " + + str(vsanid) + + " interface list" + ) + else: + commands.append( + "vsan " + + str(vsanid) + + " interface " + + each_interface_name + ) + messages.append( + "adding interface " + + each_interface_name + + " to vsan " + + str(vsanid) + ) + + if len(commands) != 0: + commands = ( + ["terminal dont-ask"] + + ["vsan database"] + + commands + + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands) + commands_executed = cmds + + if commands_executed: + if module.check_mode: + module.exit_json( + changed=False, + commands=commands_executed, + msg="Check Mode: No cmds issued to the hosts", + ) + else: + result["changed"] = True + load_config(module, commands_executed) + + result["messages"] = messages + result["commands"] = commands_executed + result["warnings"] = warnings + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_zone_zoneset.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_zone_zoneset.py new file mode 100644 index 00000000..299b5898 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/modules/storage/nxos_zone_zoneset.py @@ -0,0 +1,990 @@ +#!/usr/bin/python +# Copyright: Ansible Project +# 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 + + +DOCUMENTATION = """ +module: nxos_zone_zoneset +short_description: Configuration of zone/zoneset for Cisco NXOS MDS Switches. +description: +- Configuration of zone/zoneset for Cisco MDS NXOS. +version_added: 1.0.0 +author: +- Suhas Bharadwaj (@srbharadwaj) (subharad@cisco.com) +notes: +- Tested against NX-OS 8.4(1) +options: + zone_zoneset_details: + description: + - List of zone/zoneset details to be added or removed + type: list + elements: dict + suboptions: + vsan: + description: + - vsan id + required: true + type: int + mode: + description: + - mode of the zone for the vsan + choices: + - enhanced + - basic + type: str + default_zone: + description: + - default zone behaviour for the vsan + choices: + - permit + - deny + type: str + smart_zoning: + description: + - Removes the vsan if True + type: bool + zone: + description: + - List of zone options for that vsan + type: list + elements: dict + suboptions: + name: + description: + - name of the zone + required: true + type: str + remove: + description: + - Deletes the zone if True + type: bool + default: false + members: + description: + - Members of the zone that needs to be removed or added + type: list + elements: dict + suboptions: + pwwn: + description: + - pwwn member of the zone, use alias 'device_alias' as option for + device_alias member + aliases: + - device_alias + required: true + type: str + remove: + description: + - Removes member from the zone if True + type: bool + default: false + devtype: + description: + - devtype of the zone member used along with Smart zoning config + choices: + - initiator + - target + - both + type: str + zoneset: + description: + - List of zoneset options for the vsan + type: list + elements: dict + suboptions: + name: + description: + - name of the zoneset + required: true + type: str + remove: + description: + - Removes zoneset if True + type: bool + default: false + action: + description: + - activates/de-activates the zoneset + choices: + - activate + - deactivate + type: str + members: + description: + - Members of the zoneset that needs to be removed or added + type: list + elements: dict + suboptions: + name: + description: + - name of the zone that needs to be added to the zoneset or removed + from the zoneset + required: true + type: str + remove: + description: + - Removes zone member from the zoneset + type: bool + default: false +""" + +EXAMPLES = """ +- name: Test that zone/zoneset module works + cisco.nxos.nxos_zone_zoneset: + zone_zoneset_details: + - mode: enhanced + vsan: 22 + zone: + - members: + - pwwn: 11:11:11:11:11:11:11:11 + - device_alias: test123 + - pwwn: 61:61:62:62:12:12:12:12 + remove: true + name: zoneA + - members: + - pwwn: 10:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:21:21:21:21 + name: zoneB + - name: zoneC + remove: true + zoneset: + - action: activate + members: + - name: zoneA + - name: zoneB + - name: zoneC + remove: true + name: zsetname1 + - action: deactivate + name: zsetTestExtra + remove: true + - mode: basic + smart_zoning: true + vsan: 21 + zone: + - members: + - devtype: both + pwwn: 11:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:12:12:12:12 + - devtype: both + pwwn: 92:62:62:62:12:12:1a:1a + remove: true + name: zone21A + - members: + - pwwn: 10:11:11:11:11:11:11:11 + - pwwn: 62:62:62:62:21:21:21:21 + name: zone21B + zoneset: + - action: activate + members: + - name: zone21A + - name: zone21B + name: zsetname212 + +""" + +RETURN = """ +commands: + description: commands sent to the device + returned: always + type: list + sample: + - terminal dont-ask + - zone name zoneA vsan 923 + - member pwwn 11:11:11:11:11:11:11:11 + - no member device-alias test123 + - zone commit vsan 923 + - no terminal dont-ask +messages: + description: debug messages + returned: always + type: list + sample: + - "zone mode is already enhanced ,no change in zone mode configuration for vsan 922" + - "zone member '11:11:11:11:11:11:11:11' is already present in zone 'zoneA' in vsan 922 hence nothing to add" + - "zone member 'test123' is already present in zone 'zoneA' in vsan 922 hence nothing to add" + - "zone member '61:61:62:62:12:12:12:12' is not present in zone 'zoneA' in vsan 922 hence nothing to remove" + - "zone member '10:11:11:11:11:11:11:11' is already present in zone 'zoneB' in vsan 922 hence nothing to add" + - "zone member '62:62:62:62:21:21:21:21' is already present in zone 'zoneB' in vsan 922 hence nothing to add" + - "zone 'zoneC' is not present in vsan 922 , so nothing to remove" +""" + + +import re +import json +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + load_config, + run_commands, +) + + +__metaclass__ = type + + +class ShowZonesetActive(object): + """docstring for ShowZonesetActive""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.module = module + self.activeZSName = None + self.parseCmdOutput() + + def execute_show_zoneset_active_cmd(self): + command = ( + "show zoneset active vsan " + str(self.vsan) + " | grep zoneset" + ) + output = execute_show_command(command, self.module)[0] + return output + + def parseCmdOutput(self): + patZoneset = r"zoneset name (\S+) vsan " + str(self.vsan) + output = self.execute_show_zoneset_active_cmd().split("\n") + if len(output) == 0: + return + else: + for line in output: + line = line.strip() + mzs = re.match(patZoneset, line.strip()) + if mzs: + self.activeZSName = mzs.group(1).strip() + return + + def isZonesetActive(self, zsname): + if zsname == self.activeZSName: + return True + return False + + +class ShowZoneset(object): + """docstring for ShowZoneset""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.module = module + self.zsDetails = {} + self.parseCmdOutput() + + def execute_show_zoneset_cmd(self): + command = "show zoneset vsan " + str(self.vsan) + output = execute_show_command(command, self.module)[0] + return output + + def parseCmdOutput(self): + patZoneset = r"zoneset name (\S+) vsan " + str(self.vsan) + patZone = r"zone name (\S+) vsan " + str(self.vsan) + output = self.execute_show_zoneset_cmd().split("\n") + for line in output: + line = line.strip() + mzs = re.match(patZoneset, line.strip()) + mz = re.match(patZone, line.strip()) + if mzs: + zonesetname = mzs.group(1).strip() + self.zsDetails[zonesetname] = [] + continue + elif mz: + zonename = mz.group(1).strip() + v = self.zsDetails[zonesetname] + v.append(zonename) + self.zsDetails[zonesetname] = v + + def isZonesetPresent(self, zsname): + return zsname in self.zsDetails.keys() + + def isZonePresentInZoneset(self, zsname, zname): + if zsname in self.zsDetails.keys(): + return zname in self.zsDetails[zsname] + return False + + +class ShowZone(object): + """docstring for ShowZone""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.module = module + self.zDetails = {} + self.parseCmdOutput() + + def execute_show_zone_vsan_cmd(self): + command = "show zone vsan " + str(self.vsan) + output = execute_show_command(command, self.module)[0] + return output + + def parseCmdOutput(self): + patZone = r"zone name (\S+) vsan " + str(self.vsan) + output = self.execute_show_zone_vsan_cmd().split("\n") + for line in output: + line = " ".join(line.strip().split()) + if "init" in line: + line = line.replace("init", "initiator") + m = re.match(patZone, line) + if m: + zonename = m.group(1).strip() + self.zDetails[zonename] = [] + continue + else: + # For now we support only pwwn and device-alias under zone + # Ideally should use 'supported_choices'....but maybe next + # time. + if "pwwn" in line or "device-alias" in line: + v = self.zDetails[zonename] + v.append(line) + self.zDetails[zonename] = v + + def isZonePresent(self, zname): + return zname in self.zDetails.keys() + + def isZoneMemberPresent(self, zname, cmd): + if zname in self.zDetails.keys(): + zonememlist = self.zDetails[zname] + for eachline in zonememlist: + if cmd in eachline: + return True + return False + + def get_zDetails(self): + return self.zDetails + + +class ShowZoneStatus(object): + """docstring for ShowZoneStatus""" + + def __init__(self, module, vsan): + self.vsan = vsan + self.vsanAbsent = False + self.module = module + self.default_zone = "" + self.mode = "" + self.session = "" + self.sz = "" + self.locked = False + self.update() + + def execute_show_zone_status_cmd(self): + command = "show zone status vsan " + str(self.vsan) + output = execute_show_command(command, self.module)[0] + return output + + def update(self): + + output = self.execute_show_zone_status_cmd().split("\n") + + patfordefzone = "VSAN: " + str(self.vsan) + r" default-zone:\s+(\S+).*" + patformode = r".*mode:\s+(\S+).*" + patforsession = r"^session:\s+(\S+).*" + patforsz = r".*smart-zoning:\s+(\S+).*" + for line in output: + if "is not configured" in line: + self.vsanAbsent = True + break + mdefz = re.match(patfordefzone, line.strip()) + mmode = re.match(patformode, line.strip()) + msession = re.match(patforsession, line.strip()) + msz = re.match(patforsz, line.strip()) + + if mdefz: + self.default_zone = mdefz.group(1) + if mmode: + self.mode = mmode.group(1) + if msession: + self.session = msession.group(1) + if self.session != "none": + self.locked = True + if msz: + self.sz = msz.group(1) + + def isLocked(self): + return self.locked + + def getDefaultZone(self): + return self.default_zone + + def getMode(self): + return self.mode + + def getSmartZoningStatus(self): + return self.sz + + def isVsanAbsent(self): + return self.vsanAbsent + + +def execute_show_command(command, module, command_type="cli_show"): + output = "text" + commands = [{"command": command, "output": output}] + return run_commands(module, commands) + + +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + +def getMemType(supported_choices, allmemkeys, default="pwwn"): + for eachchoice in supported_choices: + if eachchoice in allmemkeys: + return eachchoice + return default + + +def main(): + + supported_choices = ["device_alias"] + zone_member_spec = dict( + pwwn=dict(required=True, type="str", aliases=["device_alias"]), + devtype=dict(type="str", choices=["initiator", "target", "both"]), + remove=dict(type="bool", default=False), + ) + + zone_spec = dict( + name=dict(required=True, type="str"), + members=dict(type="list", elements="dict", options=zone_member_spec), + remove=dict(type="bool", default=False), + ) + + zoneset_member_spec = dict( + name=dict(required=True, type="str"), + remove=dict(type="bool", default=False), + ) + + zoneset_spec = dict( + name=dict(type="str", required=True), + members=dict( + type="list", elements="dict", options=zoneset_member_spec + ), + remove=dict(type="bool", default=False), + action=dict(type="str", choices=["activate", "deactivate"]), + ) + + zonedetails_spec = dict( + vsan=dict(required=True, type="int"), + mode=dict(type="str", choices=["enhanced", "basic"]), + default_zone=dict(type="str", choices=["permit", "deny"]), + smart_zoning=dict(type="bool"), + zone=dict(type="list", elements="dict", options=zone_spec), + zoneset=dict(type="list", elements="dict", options=zoneset_spec), + ) + + argument_spec = dict( + zone_zoneset_details=dict( + type="list", elements="dict", options=zonedetails_spec + ) + ) + + module = AnsibleModule( + argument_spec=argument_spec, supports_check_mode=True + ) + + warnings = list() + messages = list() + commands = list() + result = {"changed": False} + + commands_executed = [] + listOfZoneDetails = module.params["zone_zoneset_details"] + for eachZoneZonesetDetail in listOfZoneDetails: + vsan = eachZoneZonesetDetail["vsan"] + op_mode = eachZoneZonesetDetail["mode"] + op_default_zone = eachZoneZonesetDetail["default_zone"] + op_smart_zoning = eachZoneZonesetDetail["smart_zoning"] + op_zone = eachZoneZonesetDetail["zone"] + op_zoneset = eachZoneZonesetDetail["zoneset"] + + # Step1: execute show zone status and get + shZoneStatusObj = ShowZoneStatus(module, vsan) + sw_default_zone = shZoneStatusObj.getDefaultZone() + sw_mode = shZoneStatusObj.getMode() + sw_smart_zoning = shZoneStatusObj.getSmartZoningStatus() + + if sw_smart_zoning.lower() == "Enabled".lower(): + sw_smart_zoning_bool = True + else: + sw_smart_zoning_bool = False + + if shZoneStatusObj.isVsanAbsent(): + module.fail_json( + msg="Vsan " + + str(vsan) + + " is not present in the switch. Hence cannot procced." + ) + + if shZoneStatusObj.isLocked(): + module.fail_json( + msg="zone has acquired lock on the switch for vsan " + + str(vsan) + + ". Hence cannot procced." + ) + + # Process zone default zone options + if op_default_zone is not None: + if op_default_zone != sw_default_zone: + if op_default_zone == "permit": + commands_executed.append( + "zone default-zone permit vsan " + str(vsan) + ) + messages.append( + "default zone configuration changed from deny to permit for vsan " + + str(vsan) + ) + else: + commands_executed.append( + "no zone default-zone permit vsan " + str(vsan) + ) + messages.append( + "default zone configuration changed from permit to deny for vsan " + + str(vsan) + ) + else: + messages.append( + "default zone is already " + + op_default_zone + + " ,no change in default zone configuration for vsan " + + str(vsan) + ) + + # Process zone mode options + if op_mode is not None: + if op_mode != sw_mode: + if op_mode == "enhanced": + commands_executed.append( + "zone mode enhanced vsan " + str(vsan) + ) + messages.append( + "zone mode configuration changed from basic to enhanced for vsan " + + str(vsan) + ) + else: + commands_executed.append( + "no zone mode enhanced vsan " + str(vsan) + ) + messages.append( + "zone mode configuration changed from enhanced to basic for vsan " + + str(vsan) + ) + else: + messages.append( + "zone mode is already " + + op_mode + + " ,no change in zone mode configuration for vsan " + + str(vsan) + ) + + # Process zone smart-zone options + if op_smart_zoning is not None: + if op_smart_zoning != sw_smart_zoning_bool: + if op_smart_zoning: + commands_executed.append( + "zone smart-zoning enable vsan " + str(vsan) + ) + messages.append( + "smart-zoning enabled for vsan " + str(vsan) + ) + else: + commands_executed.append( + "no zone smart-zoning enable vsan " + str(vsan) + ) + messages.append( + "smart-zoning disabled for vsan " + str(vsan) + ) + else: + messages.append( + "smart-zoning is already set to " + + sw_smart_zoning + + " , no change in smart-zoning configuration for vsan " + + str(vsan) + ) + + # Process zone member options + # TODO: Obviously this needs to be cleaned up properly, as there are a lot of ifelse statements which is bad + # Will take it up later becoz of time constraints + if op_zone is not None: + shZoneObj = ShowZone(module, vsan) + for eachzone in op_zone: + zname = eachzone["name"] + zmembers = eachzone["members"] + removeflag = eachzone["remove"] + if removeflag: + if shZoneObj.isZonePresent(zname): + messages.append( + "zone '" + + zname + + "' is removed from vsan " + + str(vsan) + ) + commands_executed.append( + "no zone name " + zname + " vsan " + str(vsan) + ) + else: + messages.append( + "zone '" + + zname + + "' is not present in vsan " + + str(vsan) + + " , so nothing to remove" + ) + else: + if zmembers is None: + if shZoneObj.isZonePresent(zname): + messages.append( + "zone '" + + zname + + "' is already present in vsan " + + str(vsan) + ) + else: + commands_executed.append( + "zone name " + zname + " vsan " + str(vsan) + ) + messages.append( + "zone '" + + zname + + "' is created in vsan " + + str(vsan) + ) + else: + cmdmemlist = [] + for eachmem in zmembers: + memtype = getMemType( + supported_choices, eachmem.keys() + ) + cmd = ( + memtype.replace("_", "-") + + " " + + eachmem[memtype] + ) + if op_smart_zoning or sw_smart_zoning_bool: + if eachmem["devtype"] is not None: + cmd = cmd + " " + eachmem["devtype"] + if eachmem["remove"]: + if shZoneObj.isZonePresent(zname): + if shZoneObj.isZoneMemberPresent( + zname, cmd + ): + cmd = "no member " + cmd + cmdmemlist.append(cmd) + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "removing zone member '" + + eachmem[memtype] + + " of device type '" + + eachmem["devtype"] + + "' from zone '" + + zname + + "' in vsan " + + str(vsan) + ) + else: + messages.append( + "removing zone member '" + + eachmem[memtype] + + "' from zone '" + + zname + + "' in vsan " + + str(vsan) + ) + else: + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "zone member '" + + eachmem[memtype] + + "' of device type '" + + eachmem["devtype"] + + "' is not present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to remove" + ) + else: + messages.append( + "zone member '" + + eachmem[memtype] + + "' is not present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to remove" + ) + else: + messages.append( + "zone '" + + zname + + "' is not present in vsan " + + str(vsan) + + " , hence cannot remove the members" + ) + + else: + if shZoneObj.isZoneMemberPresent(zname, cmd): + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "zone member '" + + eachmem[memtype] + + "' of device type '" + + eachmem["devtype"] + + "' is already present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to add" + ) + else: + messages.append( + "zone member '" + + eachmem[memtype] + + "' is already present in zone '" + + zname + + "' in vsan " + + str(vsan) + + " hence nothing to add" + ) + else: + cmd = "member " + cmd + cmdmemlist.append(cmd) + if ( + op_smart_zoning + and eachmem["devtype"] is not None + ): + messages.append( + "adding zone member '" + + eachmem[memtype] + + "' of device type '" + + eachmem["devtype"] + + "' to zone '" + + zname + + "' in vsan " + + str(vsan) + ) + else: + messages.append( + "adding zone member '" + + eachmem[memtype] + + "' to zone '" + + zname + + "' in vsan " + + str(vsan) + ) + if len(cmdmemlist) != 0: + commands_executed.append( + "zone name " + zname + " vsan " + str(vsan) + ) + commands_executed = commands_executed + cmdmemlist + + # Process zoneset member options + if op_zoneset is not None: + dactcmd = [] + actcmd = [] + shZonesetObj = ShowZoneset(module, vsan) + shZonesetActiveObj = ShowZonesetActive(module, vsan) + for eachzoneset in op_zoneset: + zsetname = eachzoneset["name"] + zsetmembers = eachzoneset["members"] + removeflag = eachzoneset["remove"] + actionflag = eachzoneset["action"] + if removeflag: + if shZonesetObj.isZonesetPresent(zsetname): + messages.append( + "zoneset '" + + zsetname + + "' is removed from vsan " + + str(vsan) + ) + commands_executed.append( + "no zoneset name " + + zsetname + + " vsan " + + str(vsan) + ) + else: + messages.append( + "zoneset '" + + zsetname + + "' is not present in vsan " + + str(vsan) + + " ,hence there is nothing to remove" + ) + else: + if zsetmembers is not None: + cmdmemlist = [] + for eachzsmem in zsetmembers: + zsetmem_name = eachzsmem["name"] + zsetmem_removeflag = eachzsmem["remove"] + if zsetmem_removeflag: + if shZonesetObj.isZonePresentInZoneset( + zsetname, zsetmem_name + ): + cmd = "no member " + zsetmem_name + cmdmemlist.append(cmd) + messages.append( + "removing zoneset member '" + + zsetmem_name + + "' from zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + else: + messages.append( + "zoneset member '" + + zsetmem_name + + "' is not present in zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " ,hence there is nothing to remove" + ) + else: + if shZonesetObj.isZonePresentInZoneset( + zsetname, zsetmem_name + ): + messages.append( + "zoneset member '" + + zsetmem_name + + "' is already present in zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " ,hence there is nothing to add" + ) + else: + cmd = "member " + zsetmem_name + cmdmemlist.append(cmd) + messages.append( + "adding zoneset member '" + + zsetmem_name + + "' to zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + if len(cmdmemlist) != 0: + commands_executed.append( + "zoneset name " + + zsetname + + " vsan " + + str(vsan) + ) + commands_executed = commands_executed + cmdmemlist + else: + if shZonesetObj.isZonesetPresent(zsetname): + messages.append( + "zoneset '" + + zsetname + + "' is already present in vsan " + + str(vsan) + ) + else: + commands_executed.append( + "zoneset name " + + zsetname + + " vsan " + + str(vsan) + ) + messages.append( + "zoneset '" + + zsetname + + "' is created in vsan " + + str(vsan) + ) + + # Process zoneset activate options + if actionflag == "deactivate": + if shZonesetActiveObj.isZonesetActive(zsetname): + messages.append( + "deactivating zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + dactcmd.append( + "no zoneset activate name " + + zsetname + + " vsan " + + str(vsan) + ) + else: + messages.append( + "zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " is not activated, hence cannot deactivate" + ) + elif actionflag == "activate": + if commands_executed: + messages.append( + "activating zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + ) + actcmd.append( + "zoneset activate name " + + zsetname + + " vsan " + + str(vsan) + ) + else: + messages.append( + "no changes to existing zoneset '" + + zsetname + + "' in vsan " + + str(vsan) + + " hence activate action is ignored" + ) + commands_executed = commands_executed + dactcmd + actcmd + + if commands_executed: + if op_mode == "enhanced": + commands_executed.append("zone commit vsan " + str(vsan)) + elif op_mode is None: + if sw_mode == "enhanced": + commands_executed.append("zone commit vsan " + str(vsan)) + + if commands_executed: + commands_executed = ( + ["terminal dont-ask"] + + commands_executed + + ["no terminal dont-ask"] + ) + + cmds = flatten_list(commands_executed) + if cmds: + if module.check_mode: + module.exit_json( + changed=False, + commands=cmds, + msg="Check Mode: No cmds issued to the hosts", + ) + else: + result["changed"] = True + commands = commands + cmds + load_config(module, cmds) + + result["messages"] = messages + result["commands"] = commands_executed + result["warnings"] = warnings + module.exit_json(**result) + + +if __name__ == "__main__": + main() diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/nxos.py new file mode 100644 index 00000000..912dfe4e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/plugins/terminal/nxos.py @@ -0,0 +1,142 @@ +# +# (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 + +import re +import json + +from ansible.plugins.terminal import TerminalBase +from ansible.errors import AnsibleConnectionFailure +from ansible.module_utils._text import to_bytes, to_text + + +class TerminalModule(TerminalBase): + + terminal_stdout_re = [ + re.compile( + br"[\r\n](?!\s*<)?(\x1b\S+)*[a-zA-Z_0-9]{1}[a-zA-Z0-9-_.]*[>|#](?:\s*)(\x1b\S+)*$" + ), + re.compile(br"[\r\n]?[a-zA-Z0-9]{1}[a-zA-Z0-9-_.]*\(.+\)#(?:\s*)$"), + ] + + terminal_stderr_re = [ + re.compile(br"% ?Error"), + re.compile(br"\nerror:(.*)", re.I), + re.compile(br"^% \w+", re.M), + re.compile(br"% ?Bad secret"), + re.compile(br"invalid input", re.I), + re.compile(br"(?:incomplete|ambiguous) command", re.I), + re.compile(br"connection timed out", re.I), + re.compile(br"[^\r\n]+ not found", re.I), + re.compile(br"'[^']' +returned error code: ?\d+"), + re.compile(br"syntax error"), + re.compile(br"unknown command"), + re.compile(br"user not present"), + re.compile(br"invalid (.+?)at '\^' marker", re.I), + re.compile(br"configuration not allowed .+ at '\^' marker"), + re.compile( + br"[B|b]aud rate of console should be.* (\d*) to increase [a-z]* level", + re.I, + ), + re.compile( + br"cannot apply non-existing acl policy to interface", re.I + ), + re.compile(br"Duplicate sequence number", re.I), + re.compile( + br"Cannot apply ACL to an interface that is a port-channel member", + re.I, + ), + ] + + def on_become(self, passwd=None): + if self._get_prompt().strip().endswith(b"enable#"): + return + + out = self._exec_cli_command("show privilege") + out = to_text(out, errors="surrogate_then_replace").strip() + + # if already at privilege level 15 return + if "15" in out: + return + + if self.validate_user_role(): + return + + if "Disabled" in out: + raise AnsibleConnectionFailure("Feature privilege is not enabled") + + cmd = {u"command": u"enable"} + if passwd: + cmd[u"prompt"] = to_text( + r"(?i)[\r\n]?Password: $", errors="surrogate_or_strict" + ) + cmd[u"answer"] = passwd + cmd[u"prompt_retry_check"] = True + + try: + self._exec_cli_command( + to_bytes(json.dumps(cmd), errors="surrogate_or_strict") + ) + prompt = self._get_prompt() + if prompt is None or not prompt.strip().endswith(b"enable#"): + raise AnsibleConnectionFailure( + "failed to elevate privilege to enable mode still at prompt [%s]" + % prompt + ) + except AnsibleConnectionFailure as e: + prompt = self._get_prompt() + raise AnsibleConnectionFailure( + "unable to elevate privilege to enable mode, at prompt [%s] with error: %s" + % (prompt, e.message) + ) + + def on_unbecome(self): + prompt = self._get_prompt() + if prompt is None: + # if prompt is None most likely the terminal is hung up at a prompt + return + + if b"(config" in prompt: + self._exec_cli_command("end") + self._exec_cli_command("exit") + + elif prompt.endswith(b"enable#"): + self._exec_cli_command("exit") + + def on_open_shell(self): + try: + for cmd in ("terminal length 0", "terminal width 511"): + self._exec_cli_command(cmd) + except AnsibleConnectionFailure: + raise AnsibleConnectionFailure("unable to set terminal parameters") + + def validate_user_role(self): + user = self._connection._play_context.remote_user + + out = self._exec_cli_command("show user-account %s" % user) + out = to_text(out, errors="surrogate_then_replace").strip() + + match = re.search(r"roles:(.+)$", out, re.M) + if match: + roles = match.group(1).split() + if "network-admin" in roles: + return True + return False diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/requirements.txt b/collections-debian-merged/ansible_collections/cisco/nxos/requirements.txt new file mode 100644 index 00000000..ee91c107 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/requirements.txt @@ -0,0 +1,2 @@ +paramiko +scp diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/test-requirements.txt b/collections-debian-merged/ansible_collections/cisco/nxos/test-requirements.txt new file mode 100644 index 00000000..cef9e921 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/test-requirements.txt @@ -0,0 +1,7 @@ +black==19.3b0 ; python_version > '3.5' +flake8 +pexpect +yamllint +pytest-xdist +coverage==4.5.4 +mock diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/.gitignore b/collections-debian-merged/ansible_collections/cisco/nxos/tests/.gitignore new file mode 100644 index 00000000..9b1960e7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/.gitignore @@ -0,0 +1 @@ +output/ \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/network-integration.requirements.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/network-integration.requirements.txt new file mode 100644 index 00000000..e8c81df1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/network-integration.requirements.txt @@ -0,0 +1,6 @@ +pexpect # for _user test +scp # for Cisco ios +selectors2 # for ncclient +ncclient # for Junos +jxmlease # for Junos +xmltodict # for Junos diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/target-prefixes.network b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/target-prefixes.network new file mode 100644 index 00000000..73cf59df --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/target-prefixes.network @@ -0,0 +1 @@ +nxos \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/radius.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/radius.yaml new file mode 100644 index 00000000..e0cdaec1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/radius.yaml @@ -0,0 +1,98 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_aaa_server radius.yaml + sanity test" + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_aaa_server: &id004 + server_type: radius + deadtime: default + server_timeout: default + directed_request: default + state: default + +- block: + + - name: Configure radius server defaults + register: result + cisco.nxos.nxos_aaa_server: &id001 + server_type: radius + state: present + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: Configure radius server non defaults + register: result + cisco.nxos.nxos_aaa_server: &id002 + server_type: radius + server_timeout: 9 + deadtime: 20 + directed_request: enabled + state: present + + - assert: &id005 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id002 + + - assert: *id003 + + - name: Remove radius server configuration + register: result + cisco.nxos.nxos_aaa_server: *id004 + + - assert: *id005 + + - name: Configure radius server with global key + register: result + cisco.nxos.nxos_aaa_server: &id006 + server_type: radius + encrypt_type: 7 + global_key: test_key + state: present + + - assert: *id005 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id006 + + - assert: *id003 + + - name: Remove radius server configuration + register: result + cisco.nxos.nxos_aaa_server: &id007 + server_type: radius + deadtime: default + server_timeout: default + global_key: default + directed_request: default + state: default + + - assert: *id005 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id007 + + - assert: *id003 + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_aaa_server failure detected" + always: + + - name: Remove radius server configuration + register: result + cisco.nxos.nxos_aaa_server: *id004 + +- debug: msg="END connection={{ ansible_connection }} nxos_aaa_server radius.yaml + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/tacacs.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/tacacs.yaml new file mode 100644 index 00000000..274f7f8d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server/tests/common/tacacs.yaml @@ -0,0 +1,108 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_aaa_server tacacs.yaml + sanity test" + +- name: Enable feature tacacs+ + cisco.nxos.nxos_feature: + feature: tacacs+ + state: enabled + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_aaa_server: &id004 + server_type: tacacs + deadtime: default + server_timeout: default + directed_request: default + state: default + +- block: + + - name: Configure tacacs server defaults + register: result + cisco.nxos.nxos_aaa_server: &id001 + server_type: tacacs + state: present + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: Configure tacacs server non defaults + register: result + cisco.nxos.nxos_aaa_server: &id002 + server_type: tacacs + server_timeout: 9 + deadtime: 20 + directed_request: enabled + state: present + + - assert: &id005 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id002 + + - assert: *id003 + + - name: Remove tacacs server configuration + register: result + cisco.nxos.nxos_aaa_server: *id004 + + - assert: *id005 + + - name: Configure tacacs server with global key + register: result + cisco.nxos.nxos_aaa_server: &id006 + server_type: tacacs + encrypt_type: 7 + global_key: test_key + state: present + + - assert: *id005 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id006 + + - assert: *id003 + + - name: Remove tacacs server configuration + register: result + cisco.nxos.nxos_aaa_server: &id007 + server_type: tacacs + deadtime: default + server_timeout: default + global_key: default + directed_request: default + state: default + + - assert: *id005 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server: *id007 + + - assert: *id003 + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_aaa_server failure detected" + always: + + - name: Remove tacacs server configuration + register: result + cisco.nxos.nxos_aaa_server: *id004 + + - name: Disable feature tacacs+ + cisco.nxos.nxos_feature: + feature: tacacs+ + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_aaa_server tacacs.yaml + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/radius.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/radius.yaml new file mode 100644 index 00000000..70bd89d0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/radius.yaml @@ -0,0 +1,199 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_aaa_server_host radius.yaml + sanity test" + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_aaa_server_host: &id002 + server_type: radius + address: 8.8.8.8 + state: absent + +- block: + + - name: Configure radius server defaults + register: result + cisco.nxos.nxos_aaa_server_host: &id001 + server_type: radius + address: 8.8.8.8 + state: present + + - assert: &id003 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove radius server configuration + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - assert: *id004 + + - name: Configure radius server non defaults + register: result + cisco.nxos.nxos_aaa_server_host: &id005 + server_type: radius + address: 8.8.8.8 + host_timeout: 25 + auth_port: 2083 + acct_port: 2084 + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id005 + + - assert: *id004 + + - name: Configure some defaults on radius server + register: result + cisco.nxos.nxos_aaa_server_host: &id006 + server_type: radius + address: 8.8.8.8 + host_timeout: default + auth_port: 1000 + acct_port: default + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id006 + + - assert: *id004 + + - name: Configure radius server with clear text pwd + register: result + cisco.nxos.nxos_aaa_server_host: &id007 + server_type: radius + address: 8.8.8.8 + host_timeout: 25 + auth_port: default + acct_port: 2084 + encrypt_type: 0 + key: hello + state: present + + - assert: *id003 + + - name: Check NOT Idempotent + register: result + cisco.nxos.nxos_aaa_server_host: *id007 + + - assert: *id003 + + - name: Remove radius server configuration + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - assert: *id003 + + - name: Configure radius server with type 7 encryption + register: result + cisco.nxos.nxos_aaa_server_host: &id008 + server_type: radius + address: 8.8.8.8 + host_timeout: 25 + auth_port: 2083 + acct_port: 2084 + encrypt_type: 7 + key: hello + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id008 + + - assert: *id004 + + - name: Configure radius server with new type 7 encryption key + register: result + cisco.nxos.nxos_aaa_server_host: &id009 + server_type: radius + address: 8.8.8.8 + host_timeout: 25 + auth_port: 2083 + acct_port: 2084 + encrypt_type: 7 + key: helloback + state: present + + - assert: + that: + - result.changed == true + - "'key 7' in result.updates[0]" + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id009 + + - assert: *id004 + + - name: Configure radius server with default key + register: result + cisco.nxos.nxos_aaa_server_host: &id010 + server_type: radius + address: 8.8.8.8 + host_timeout: default + auth_port: 1000 + acct_port: default + encrypt_type: 7 + key: default + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id010 + + - assert: *id004 + + - name: Configure radius server with all def + register: result + cisco.nxos.nxos_aaa_server_host: &id011 + server_type: radius + address: 8.8.8.8 + host_timeout: default + auth_port: default + acct_port: default + key: default + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id011 + + - assert: *id004 + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_aaa_server_host failure + detected" + always: + + - name: Remove radius server configuration + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - debug: msg="END connection={{ ansible_connection }} nxos_aaa_server_host radius.yaml + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/tacacs.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/tacacs.yaml new file mode 100644 index 00000000..37fcd563 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_aaa_server_host/tests/common/tacacs.yaml @@ -0,0 +1,202 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_aaa_server_host tacacs.yaml + sanity test" + +- name: Enable feature tacacs+ + cisco.nxos.nxos_feature: + feature: tacacs+ + state: enabled + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_aaa_server_host: &id002 + server_type: tacacs + address: 8.8.8.8 + state: absent + +- block: + + - name: Configure tacacs server defaults + register: result + cisco.nxos.nxos_aaa_server_host: &id001 + server_type: tacacs + address: 8.8.8.8 + state: present + + - assert: &id003 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove tacacs server configuration + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - assert: *id004 + + - name: Configure tacacs server non defaults + register: result + cisco.nxos.nxos_aaa_server_host: &id005 + server_type: tacacs + address: 8.8.8.8 + host_timeout: 25 + tacacs_port: 89 + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id005 + + - assert: *id004 + + - name: Configure some defaults on tacacs server + register: result + cisco.nxos.nxos_aaa_server_host: &id006 + server_type: tacacs + address: 8.8.8.8 + host_timeout: default + tacacs_port: 100 + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id006 + + - assert: *id004 + + - name: Configure tacacs server with clear text pwd + register: result + cisco.nxos.nxos_aaa_server_host: &id007 + server_type: tacacs + address: 8.8.8.8 + host_timeout: 25 + tacacs_port: default + encrypt_type: 0 + key: hello + state: present + + - assert: *id003 + + - name: Check NOT Idempotent + register: result + cisco.nxos.nxos_aaa_server_host: *id007 + + - assert: *id003 + + - name: Remove tacacs server configuration + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - assert: *id003 + + - name: Configure tacacs server with type 7 encryption + register: result + cisco.nxos.nxos_aaa_server_host: &id008 + server_type: tacacs + address: 8.8.8.8 + host_timeout: 25 + tacacs_port: 89 + encrypt_type: 7 + key: hello + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id008 + + - assert: *id004 + + - name: Configure tacacs server with new type 7 encryption key + register: result + cisco.nxos.nxos_aaa_server_host: &id009 + server_type: tacacs + address: 8.8.8.8 + host_timeout: 25 + tacacs_port: 89 + encrypt_type: 7 + key: helloback + state: present + + - assert: + that: + - result.changed == true + - "'key 7' in result.updates[0]" + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id009 + + - assert: *id004 + + - name: Configure tacacs server with default key + register: result + cisco.nxos.nxos_aaa_server_host: &id010 + server_type: tacacs + address: 8.8.8.8 + host_timeout: default + tacacs_port: 89 + encrypt_type: 7 + key: default + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id010 + + - assert: *id004 + + - name: Configure tacacs server with all def + register: result + cisco.nxos.nxos_aaa_server_host: &id011 + server_type: tacacs + address: 8.8.8.8 + host_timeout: default + tacacs_port: default + key: default + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_aaa_server_host: *id011 + + - assert: *id004 + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_aaa_server_host failure + detected" + always: + + - name: Remove tacacs server configuration + register: result + cisco.nxos.nxos_aaa_server_host: *id002 + + - name: Disable feature tacacs+ + cisco.nxos.nxos_feature: + feature: tacacs+ + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_aaa_server_host tacacs.yaml + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tests/common/sanity.yaml new file mode 100644 index 00000000..5bb1f8e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl/tests/common/sanity.yaml @@ -0,0 +1,230 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_acl sanity test" + +- set_fact: time_range="ans-range" + when: platform is not search('N35|N5K|N6K') + +- name: 'Setup: Cleanup possibly existing acl.' + ignore_errors: true + cisco.nxos.nxos_acl: &id012 + name: TEST_ACL + seq: 10 + state: delete_acl + +- name: Configure ACE10 + register: result + cisco.nxos.nxos_acl: &id001 + name: TEST_ACL + seq: 10 + action: permit + proto: tcp + src: 192.0.2.1/24 + src_port_op: range + src_port1: 1900 + src_port2: 1910 + ack: enable + dscp: af43 + dest: any + dest_port_op: neq + dest_port1: 1899 + urg: enable + psh: enable + established: enable + log: enable + fin: enable + rst: enable + syn: enable + time_range: '{{time_range|default(omit)}}' + state: present + +- assert: &id002 + that: + - result.changed == true + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id001 + +- assert: &id004 + that: + - result.changed == false + +- name: Change ACE10 + register: result + cisco.nxos.nxos_acl: &id003 + name: TEST_ACL + seq: 10 + action: deny + proto: tcp + src: 192.0.2.1/24 + src_port_op: range + src_port1: 1900 + src_port2: 1910 + ack: enable + dscp: af43 + dest: any + dest_port_op: neq + dest_port1: 1899 + urg: enable + psh: enable + established: enable + log: enable + fin: enable + rst: enable + syn: enable + time_range: '{{time_range|default(omit)}}' + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id003 + +- assert: *id004 + +- name: ace remark + register: result + cisco.nxos.nxos_acl: &id005 + name: TEST_ACL + seq: 20 + action: remark + remark: test_remark + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id005 + +- assert: *id004 + +- name: change remark + register: result + cisco.nxos.nxos_acl: &id006 + name: TEST_ACL + seq: 20 + action: remark + remark: changed_remark + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id006 + +- assert: *id004 + +- name: ace 30 + register: result + cisco.nxos.nxos_acl: &id007 + name: TEST_ACL + seq: 30 + action: deny + proto: 24 + src: any + dest: any + fragments: enable + precedence: network + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id007 + +- assert: *id004 + +- name: change ace 30 options + register: result + cisco.nxos.nxos_acl: &id008 + name: TEST_ACL + seq: 30 + action: deny + proto: 24 + src: any + dest: any + precedence: network + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id008 + +- assert: *id004 + +- name: ace 40 + register: result + cisco.nxos.nxos_acl: &id009 + name: TEST_ACL + seq: 40 + action: permit + proto: udp + src: any + src_port_op: neq + src_port1: 1200 + dest: any + precedence: network + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id009 + +- assert: *id004 + +- name: change ace 40 + register: result + cisco.nxos.nxos_acl: &id010 + name: TEST_ACL + seq: 40 + action: permit + proto: udp + src: any + dest: any + precedence: network + state: present + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id010 + +- assert: *id004 + +- name: remove ace 30 + register: result + cisco.nxos.nxos_acl: &id011 + name: TEST_ACL + seq: 30 + state: absent + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id011 + +- assert: *id004 + +- name: Remove ACL + register: result + cisco.nxos.nxos_acl: *id012 + +- assert: *id002 + +- name: Check Idempotence + register: result + cisco.nxos.nxos_acl: *id012 + +- assert: *id004 + +- debug: msg="END connection={{ ansible_connection }} nxos_acl sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..a5c97ab9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interface/tests/common/sanity.yaml @@ -0,0 +1,122 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_acl_interface sanity + test" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: Interface selected for this test + debug: msg="{{ intname }}" + +- name: 'Setup: Put interface into a default state' + ignore_errors: true + cisco.nxos.nxos_config: &id007 + lines: + - default interface {{ intname }} + +- name: 'Setup: Put interface into no switch port mode' + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no switchport + parents: + - interface {{ intname }} + match: none + +- name: 'Setup: Cleanup possibly existing acl' + ignore_errors: true + cisco.nxos.nxos_acl: &id008 + name: ANSIBLE_ACL + seq: 10 + state: delete_acl + +- name: Configure Supporting ACL + cisco.nxos.nxos_acl: + name: ANSIBLE_ACL + seq: 10 + action: permit + proto: tcp + src: 192.0.2.1/24 + dest: any + +- block: + + - name: Configure acl interface egress + register: result + cisco.nxos.nxos_acl_interface: &id001 + name: ANSIBLE_ACL + interface: '{{ intname }}' + direction: egress + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence egress + register: result + cisco.nxos.nxos_acl_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure acl interface ingress + register: result + cisco.nxos.nxos_acl_interface: &id003 + name: ANSIBLE_ACL + interface: '{{ intname }}' + direction: ingress + state: present + + - assert: *id002 + + - name: Check Idempotence ingress + register: result + cisco.nxos.nxos_acl_interface: *id003 + + - assert: *id004 + + - name: Cleanup acl interface egress + register: result + cisco.nxos.nxos_acl_interface: &id005 + name: ANSIBLE_ACL + interface: '{{ intname }}' + direction: egress + state: absent + + - assert: *id002 + + - name: Check Idempotence egress cleanup + register: result + cisco.nxos.nxos_acl_interface: *id005 + + - assert: *id004 + + - name: Cleanup acl interface ingress + register: result + cisco.nxos.nxos_acl_interface: &id006 + name: ANSIBLE_ACL + interface: '{{ intname }}' + direction: ingress + state: absent + + - assert: *id002 + + - name: Check Idempotence ingress cleanup + register: result + cisco.nxos.nxos_acl_interface: *id006 + + - assert: *id004 + rescue: + + - name: Put test interface into default state. + ignore_errors: true + cisco.nxos.nxos_config: *id007 + always: + + - name: Remove possible configured ACL + ignore_errors: true + cisco.nxos.nxos_acl: *id008 + + - debug: msg="END connection={{ ansible_connection }} nxos_acl_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..0f1d5c08 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..dbedf2d6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/templates/populate_config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/templates/populate_config.cfg new file mode 100644 index 00000000..69e9d9a1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/templates/populate_config.cfg @@ -0,0 +1,11 @@ +ip access-list ACL1v4 +ip access-list NewACLv4 +ipv6 access-list ACL1v6 +ipv6 access-list NewACLv6 +ip access-list PortACL +interface Ethernet1/5 + ip port access-group PortACL in + ip access-group ACL1v4 out + ipv6 traffic-filter ACL1v6 in +interface Ethernet1/2 + ipv6 traffic-filter ACL1v6 in diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/deleted.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/deleted.yml new file mode 100644 index 00000000..08a728ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/deleted.yml @@ -0,0 +1,59 @@ +--- +- debug: + msg: Start nxos_acl_interfaces deleted integration tests connection = {{ansible_connection}} + +- include_tasks: remove_config.yaml + +- include_tasks: populate_acl.yaml + +- include_tasks: populate_config.yaml + +- block: + - name: Delete all ACLs configuration from given interface + register: result + cisco.nxos.nxos_acl_interfaces: &id002 + config: + + - name: Ethernet1/2 + state: deleted + + - assert: + that: + - result.changed == True + - "'interface Ethernet1/2' in result.commands" + - "'no ipv6 traffic-filter ACL1v6 in' in result.commands" + - result.commands | length == 2 + + - include_tasks: populate_config.yaml + + - name: Delete all ACLs from all interfaces (from all interfaces) + register: result + cisco.nxos.nxos_acl_interfaces: + config: + state: deleted + + - name: Gather acl interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: acl_interfaces + + - assert: + that: + - result.changed == True + - ansible_facts.network_resources.acl_interfaces == result.after + + - name: Gather acls facts + cisco.nxos.nxos_facts: *id001 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_acl_interfaces: *id002 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/empty_config.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/empty_config.yml new file mode 100644 index 00000000..894e1802 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/empty_config.yml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_acl_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_acl_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_acl_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_acl_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_acl_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_acl_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_acl_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/gathered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/gathered.yml new file mode 100644 index 00000000..00d03091 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/gathered.yml @@ -0,0 +1,35 @@ +--- +- debug: + msg: Start nxos_acl_interfaces gathered integration tests connection={{ansible_connection}}" + +- include_tasks: populate_config.yaml + +- block: + + - name: Gather acl interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acl_interfaces + + - name: Gathered + register: result + cisco.nxos.nxos_acl_interfaces: &id001 + state: gathered + + - assert: + that: + - result.changed == false + - ansible_facts.network_resources.acl_interfaces == result.gathered + + - name: Idempotence - Gathered + register: result + cisco.nxos.nxos_acl_interfaces: *id001 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/merged.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/merged.yml new file mode 100644 index 00000000..dc716ae4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/merged.yml @@ -0,0 +1,72 @@ +--- +- debug: + msg: Start nxos_acl_interfaces merged integration tests connection = {{ansible_connection}} + +- include_tasks: remove_config.yaml + +- include_tasks: populate_acl.yaml + +- block: + + - name: Gather acl interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acl_interfaces + + - name: Merged + register: result + cisco.nxos.nxos_acl_interfaces: &id001 + config: + + - name: Ethernet1/2 + access_groups: + + - afi: ipv6 + acls: + + - name: ACL1v6 + direction: in + + - name: Eth1/5 + access_groups: + + - afi: ipv4 + acls: + + - name: PortACL + direction: in + port: true + + - name: ACL1v4 + direction: out + + - afi: ipv6 + acls: + + - name: ACL1v6 + direction: in + state: merged + + - assert: + that: + - result.changed == True + - "'interface Ethernet1/2' in result.commands" + - "'ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'interface Ethernet1/5' in result.commands" + - "'ip port access-group PortACL in' in result.commands" + - "'ip access-group ACL1v4 out' in result.commands" + - "'ipv6 traffic-filter ACL1v6 in' in result.commands" + - 'result.commands | length == 6 ' + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_acl_interfaces: *id001 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/overridden.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/overridden.yml new file mode 100644 index 00000000..5f2a7572 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/overridden.yml @@ -0,0 +1,77 @@ +--- +- debug: + msg: Start nxos_acl_interfaces overridden integration tests connection = {{ansible_connection}} + +- include_tasks: remove_config.yaml + +- include_tasks: populate_acl.yaml + +- include_tasks: populate_config.yaml + +- block: + + - name: Overridden + register: result + cisco.nxos.nxos_acl_interfaces: &id002 + config: + + - name: Ethernet1/3 + access_groups: + + - afi: ipv4 + acls: + + - name: ACL1v4 + direction: out + + - name: PortACL + port: true + direction: in + + - afi: ipv6 + acls: + + - name: NewACLv6 + direction: in + port: true + state: overridden + + - assert: + that: + - result.changed == True + - "'interface Ethernet1/2' in result.commands" + - "'no ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'interface Ethernet1/5' in result.commands" + - "'no ip access-group ACL1v4 out' in result.commands" + - "'no ip port access-group PortACL in' in result.commands" + - "'no ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'interface Ethernet1/3' in result.commands" + - "'ip access-group ACL1v4 out' in result.commands" + - "'ip port access-group PortACL in' in result.commands" + - "'ipv6 port traffic-filter NewACLv6 in' in result.commands" + - result.commands | length == 10 + + - name: Gather acl_interfaces post facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: acl_interfaces + + - name: Gather acls post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.acl_interfaces == result.after + + - name: Idempotence - overridden + register: result + cisco.nxos.nxos_acl_interfaces: *id002 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/parsed.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/parsed.yml new file mode 100644 index 00000000..04efedea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/parsed.yml @@ -0,0 +1,32 @@ +--- +- debug: + msg: Start nxos_acl_interfaces parsed integration tests connection={{ansible_connection}}" + +- block: + + - name: Gather acl interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acl_interfaces + + - name: Parsed + register: result + cisco.nxos.nxos_acl_interfaces: &id001 + running_config: "interface Ethernet1/2\nipv6 traffic-filter ACL1v6 in\n\ + interface Ethernet1/5\nipv6 traffic-filter ACL1v6 in\nip access-group\ + \ ACL1v4 out\nip port access-group PortACL in\n" + state: parsed + + - assert: + that: + - result.changed == false + - result.parsed == parsed + + - name: Idempotence - Parsed + register: result + cisco.nxos.nxos_acl_interfaces: *id001 + + - assert: + that: result.changed == false diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_acl.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_acl.yaml new file mode 100644 index 00000000..c6251dc6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_acl.yaml @@ -0,0 +1,9 @@ +--- +- name: Adding base configuration + cisco.nxos.nxos_config: + lines: + - "ip access-list ACL1v4" + - "ip access-list NewACLv4" + - "ipv6 access-list ACL1v6" + - "ipv6 access-list NewACLv6" + - "ip access-list PortACL" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_config.yaml new file mode 100644 index 00000000..7265d081 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/populate_config.yaml @@ -0,0 +1,4 @@ +--- +- name: Adding base configuration + cisco.nxos.nxos_config: + src: populate_config.cfg diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/remove_config.yaml new file mode 100644 index 00000000..757a9fb3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/remove_config.yaml @@ -0,0 +1,37 @@ +--- +- name: Remove config - 1 + cisco.nxos.nxos_config: + lines: + - "no ip access-list ACL1v4" + - "no ip access-list NewACLv4" + - "no ip access-list PortACL" + - "no ipv6 access-list ACL1v6" + - "no ipv6 access-list NewACLv6" + - "interface Ethernet1/2" + - " no ipv6 traffic-filter ACL1v6 in" + ignore_errors: True + +- name: Remove config - 2 + cisco.nxos.nxos_config: + lines: + - no ip access-group ACL1v4 out + - no ip port access-group PortACL in + - no ipv6 traffic-filter ACL1v6 in + parents: interface Ethernet1/5 + ignore_errors: True + +- name: Remove config - 3 + cisco.nxos.nxos_config: + lines: + - no ipv6 port traffic-filter NewACLv6 in + - no ip access-group ACL1v4 out + - no ip port access-group PortACL in + parents: interface Ethernet1/3 + ignore_errors: True + +- name: Remove config - 4 + cisco.nxos.nxos_config: + lines: + - no ip access-group NewACLv4 out + parents: interface Ethernet1/4 + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rendered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rendered.yml new file mode 100644 index 00000000..3186a04a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rendered.yml @@ -0,0 +1,57 @@ +--- +- debug: + msg: Start nxos_acl_interfaces rendered tests connection={{ ansible_connection + }} + +- name: Rendered + register: result + cisco.nxos.nxos_acl_interfaces: &id001 + config: + + - name: Ethernet1/2 + access_groups: + + - afi: ipv6 + acls: + + - name: ACL1v6 + direction: in + + - name: Ethernet1/5 + access_groups: + + - afi: ipv4 + acls: + + - name: PortACL + direction: in + port: true + + - name: ACL1v4 + direction: out + + - afi: ipv6 + acls: + + - name: ACL1v6 + direction: in + state: rendered + +- assert: + that: + - result.changed == false + - "'interface Ethernet1/2' in result.rendered" + - "'ipv6 traffic-filter ACL1v6 in' in result.rendered" + - "'interface Ethernet1/5' in result.rendered" + - "'ipv6 traffic-filter ACL1v6 in' in result.rendered" + - "'ip access-group ACL1v4 out' in result.rendered" + - "'ip port access-group PortACL in' in result.rendered" + - result.rendered | length == 6 + +- name: Idempotence - Rendered + register: result + cisco.nxos.nxos_acl_interfaces: *id001 + +- assert: + that: + - result.changed == false diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/replaced.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/replaced.yml new file mode 100644 index 00000000..88ba19be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/replaced.yml @@ -0,0 +1,70 @@ +--- +- debug: + msg: Start nxos_acl_interfaces replaced integration tests connection = {{ansible_connection}} + +- include_tasks: remove_config.yaml + +- include_tasks: populate_acl.yaml + +- include_tasks: populate_config.yaml + +- block: + + - name: Replaced + register: result + cisco.nxos.nxos_acl_interfaces: &id001 + config: + + - name: Eth1/5 + access_groups: + + - afi: ipv4 + acls: + + - name: NewACLv4 + direction: out + + - name: Ethernet1/3 + access_groups: + + - afi: ipv6 + acls: + + - name: NewACLv6 + direction: in + port: true + state: replaced + + - assert: + that: + - result.changed==True + - "'interface Ethernet1/5' in result.commands" + - "'no ip access-group ACL1v4 out' in result.commands" + - "'no ip port access-group PortACL in' in result.commands" + - "'no ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'ip access-group NewACLv4 out' in result.commands" + - "'interface Ethernet1/3' in result.commands" + - "'ipv6 port traffic-filter NewACLv6 in' in result.commands" + - result.commands|length==7 + + - name: Gather acl_interfaces post facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acl_interfaces + + - assert: + that: + - ansible_facts.network_resources.acl_interfaces == result.after + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_acl_interfaces: *id001 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rtt.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rtt.yml new file mode 100644 index 00000000..a0fa737e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/tests/common/rtt.yml @@ -0,0 +1,116 @@ +--- +- debug: + msg: Start nxos_acl_interfaces round trip integration tests connection = {{ansible_connection}} + +- include_tasks: remove_config.yaml + +- include_tasks: populate_acl.yaml + +- include_tasks: populate_config.yaml + +- block: + + - name: RTT- Apply provided configuration + cisco.nxos.nxos_acl_interfaces: + config: + + - name: Ethernet1/2 + access_groups: + + - afi: ipv6 + acls: + + - name: ACL1v6 + direction: in + + - name: Eth1/5 + access_groups: + + - afi: ipv4 + acls: + + - name: PortACL + direction: in + port: true + + - name: ACL1v4 + direction: out + + - afi: ipv6 + acls: + + - name: ACL1v6 + direction: in + state: merged + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - acl_interfaces + + - name: Apply configuration to be reverted + register: result + cisco.nxos.nxos_acl_interfaces: + config: + + - name: Eth1/4 + access_groups: + + - afi: ipv4 + acls: + + - name: NewACLv4 + direction: out + + - name: Ethernet1/3 + access_groups: + + - afi: ipv6 + acls: + + - name: NewACLv6 + direction: in + port: true + state: overridden + + - name: Assert that changes were applied + assert: + that: + - result.changed==True + - "'interface Ethernet1/2' in result.commands" + - "'no ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'interface Ethernet1/5' in result.commands" + - "'no ip access-group ACL1v4 out' in result.commands" + - "'no ip port access-group PortACL in' in result.commands" + - "'no ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'interface Ethernet1/4' in result.commands" + - "'ip access-group NewACLv4 out' in result.commands" + - "'interface Ethernet1/3' in result.commands" + - "'ipv6 port traffic-filter NewACLv6 in' in result.commands" + + - name: Revert back to base configuration using facts round trip + register: result + cisco.nxos.nxos_acl_interfaces: + config: "{{ ansible_facts['network_resources']['acl_interfaces'] }}" + state: overridden + + - name: Assert that config was reverted + assert: + that: + - result.changed==True + - "'interface Ethernet1/2' in result.commands" + - "'ipv6 traffic-filter ACL1v6 in' in result.commands" + - "'interface Ethernet1/3' in result.commands" + - "'no ipv6 port traffic-filter NewACLv6 in' in result.commands" + - "'interface Ethernet1/4' in result.commands" + - "'no ip access-group NewACLv4 out' in result.commands" + - "'interface Ethernet1/5' in result.commands" + - "'ip access-group ACL1v4 out' in result.commands" + - "'ip port access-group PortACL in' in result.commands" + - "'ipv6 traffic-filter ACL1v6 in' in result.commands" + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/vars/main.yml new file mode 100644 index 00000000..ad0b22e5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acl_interfaces/vars/main.yml @@ -0,0 +1,21 @@ +--- +parsed: + - access_groups: + - acls: + - direction: in + name: ACL1v6 + afi: ipv6 + name: Ethernet1/2 + - access_groups: + - acls: + - direction: out + name: ACL1v4 + - direction: in + name: PortACL + port: true + afi: ipv4 + - acls: + - direction: in + name: ACL1v6 + afi: ipv6 + name: Ethernet1/5 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/cli.yaml new file mode 100644 index 00000000..b2117741 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/cli.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/main.yaml new file mode 100644 index 00000000..6bcfed90 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/main.yaml @@ -0,0 +1,15 @@ +--- +- name: Set system defaults for switchports + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "system default switchport shutdown" + connection: ansible.netcommon.network_cli + +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/nxapi.yaml new file mode 100644 index 00000000..b6bd3eaf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/deleted.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/deleted.yml new file mode 100644 index 00000000..936f676f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/deleted.yml @@ -0,0 +1,56 @@ +--- +- debug: + msg: Start nxos_acls deleted integration tests connection={{ansible_connection}}" + +- include_tasks: populate_config.yaml + +- block: + - name: Deleted (All ACLs) + cisco.nxos.nxos_acls: + config: + state: deleted + + - name: Gather acls facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - "!all" + - "!min" + gather_network_resources: acls + + - assert: + that: + - ansible_facts.network_resources == {} + + - include_tasks: populate_config.yaml + + - name: Deleted + register: result + cisco.nxos.nxos_acls: &id002 + config: + - afi: ipv4 + + - afi: ipv6 + + state: deleted + + - assert: + that: + - result.changed==True + - "'no ip access-list ACL1v4' in result.commands" + - "'no ip access-list ACL2v4' in result.commands" + - "'no ipv6 access-list ACL1v6' in result.commands" + - "'no ipv6 access-list ACL2v6' in result.commands" + - result.commands | length == 4 + + - name: Gather acls facts + cisco.nxos.nxos_facts: *id001 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_acls: *id002 + + - assert: + that: + - result.changed == false + always: + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/gathered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/gathered.yml new file mode 100644 index 00000000..6d5c6554 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/gathered.yml @@ -0,0 +1,35 @@ +--- +- debug: + msg: Start nxos_acls gathered integration tests connection={{ansible_connection}}" + +- include_tasks: populate_config.yaml + +- block: + + - name: Gather acls facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acls + + - name: Gathered + register: result + cisco.nxos.nxos_acls: &id001 + state: gathered + + - assert: + that: + - result.changed == false + - ansible_facts.network_resources.acls == result.gathered + + - name: Idempotence - Gathered + register: result + cisco.nxos.nxos_acls: *id001 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/merged.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/merged.yml new file mode 100644 index 00000000..fb445828 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/merged.yml @@ -0,0 +1,118 @@ +--- +- debug: + msg: Start nxos_acls merged integration tests connection={{ansible_connection}}" + +- include_tasks: remove_config.yaml + +- block: + + - name: Merged + register: result + cisco.nxos.nxos_acls: &id001 + config: + + - afi: ipv4 + acls: + + - name: ACL1v4 + aces: + + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + lt: 25 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - grant: permit + protocol: ip + source: + any: true + destination: + any: true + fragments: true + log: true + sequence: 20 + + - afi: ipv6 + acls: + + - name: ACL1v6 + aces: + + - grant: permit + sequence: 10 + source: + any: true + destination: + host: 2001:db8:12::128 + protocol: sctp + state: merged + + - assert: + that: + - result.changed == True + - "'ip access-list ACL1v4' in result.commands" + - "'20 permit ip any any fragments log' in result.commands" + - "'50 deny tcp any lt smtp 192.0.2.64 0.0.0.255 ack fin' in result.commands" + - "'ipv6 access-list ACL1v6' in result.commands" + - "'10 permit sctp any host 2001:db8:12::128' in result.commands" + - 'result.commands | length == 5 ' + + - name: Gather acls facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acls + + - assert: + that: + - ansible_facts.network_resources.acls == result.after + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_acls: *id001 + + - assert: + that: + - result.changed == false + + - name: Update one parameter of an ACE + register: result + cisco.nxos.nxos_acls: + config: + + - afi: ipv4 + acls: + + - name: ACL1v4 + aces: + + - grant: permit + protocol: tcp + source: + any: true + destination: + any: true + sequence: 20 + precedence: 5 + state: merged + + - assert: + that: + - result.changed == True + - "'ip access-list ACL1v4' in result.commands" + - "'no 20' in result.commands" + - "'20 permit tcp any any fragments precedence critical log' in result.commands" + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/overridden.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/overridden.yml new file mode 100644 index 00000000..4c042be5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/overridden.yml @@ -0,0 +1,107 @@ +--- +- debug: + msg: Start nxos_acls overridden integration tests connection={{ansible_connection}}" + +- include_tasks: populate_config.yaml + +- block: + + - name: Overridden (first test) + register: result + cisco.nxos.nxos_acls: + config: + + - afi: ipv4 + acls: + + - name: NewACL + aces: + + - grant: deny + source: + address: 192.0.2.0 + wildcard_bits: 0.0.255.255 + destination: + any: true + protocol: eigrp + + - remark: Example for overridden state + state: overridden + + - assert: + that: + - result.changed==True + - "'no ip access-list ACL1v4' in result.commands" + - "'no ip access-list ACL2v4' in result.commands" + - "'no ipv6 access-list ACL1v6' in result.commands" + - "'no ipv6 access-list ACL2v6' in result.commands" + - "'ip access-list NewACL' in result.commands" + - "'deny eigrp 192.0.2.0 0.0.255.255 any' in result.commands" + - "'remark Example for overridden state' in result.commands" + - result.commands|length==7 + + - name: Gather acls post facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: acls + + - assert: + that: + - ansible_facts.network_resources.acls == result.after + + - include_tasks: populate_config.yaml + + - name: Overridden (second test) + register: result + cisco.nxos.nxos_acls: &id002 + config: + + - afi: ipv6 + acls: + + - name: ACL1v6 + aces: + + - grant: deny + protocol: udp + destination: + any: true + source: + host: 2001:db8:3431::12 + port_protocol: + lt: 35 + sequence: 10 + state: overridden + + - assert: + that: + - result.changed==True + - "'no ip access-list ACL1v4' in result.commands" + - "'no ip access-list ACL2v4' in result.commands" + - "'no ipv6 access-list ACL2v6' in result.commands" + - "'no ip access-list NewACL' in result.commands" + - "'ipv6 access-list ACL1v6' in result.commands" + - "'no 10 permit sctp any any' in result.commands" + - "'no 20 remark IPv6 ACL' in result.commands" + - "'10 deny udp host 2001:db8:3431::12 lt 35 any' in result.commands" + - result.commands|length==8 + + - name: Gather acls post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.acls == result.after + + - name: Idempotence - overridden + register: result + cisco.nxos.nxos_acls: *id002 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/parsed.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/parsed.yml new file mode 100644 index 00000000..d8be5087 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/parsed.yml @@ -0,0 +1,39 @@ +--- +- debug: + msg: Start nxos_acls gathered integration tests connection={{ansible_connection}}" + +- include_tasks: populate_config.yaml + +- block: + + - name: Gather acls facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acls + + - name: Parsed + register: result + cisco.nxos.nxos_acls: &id001 + running_config: "ip access-list ACL1v4\n10 permit ip any any\n20 deny udp\ + \ any any\nip access-list ACL2v4\n10 permit ahp 192.0.2.0 0.0.0.255 any\n\ + ipv6 access-list ACL1v6\n10 permit sctp any any\n20 remark IPv6 ACL\n\ + ipv6 access-list ACL2v6\n10 deny ipv6 any 2001:db8:3000::36/128\n20 permit\ + \ tcp 2001:db8:2000:2::2/128 2001:db8:2000:ab::2/128\n" + state: parsed + + - assert: + that: + - result.changed == false + - ansible_facts.network_resources.acls == result.parsed + + - name: Idempotence - Parsed + register: result + cisco.nxos.nxos_acls: *id001 + + - assert: + that: result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/populate_config.yaml new file mode 100644 index 00000000..0d8644e9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/populate_config.yaml @@ -0,0 +1,15 @@ +--- +- name: Add configuration + cisco.nxos.nxos_config: + lines: + - "ip access-list ACL1v4" + - " 10 permit ip any any" + - " 20 deny udp any any" + - "ip access-list ACL2v4" + - " 10 permit ahp 192.0.2.0 0.0.0.255 any" + - "ipv6 access-list ACL1v6" + - " 10 permit sctp any any" + - " 20 remark IPv6 ACL" + - "ipv6 access-list ACL2v6" + - " 10 deny ipv6 any host 2001:db8:3000::36" + - " 20 permit tcp host 2001:db8:2000:2::2 host 2001:db8:2000:ab::2" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/remove_config.yaml new file mode 100644 index 00000000..24f7b9d0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/remove_config.yaml @@ -0,0 +1,9 @@ +--- +- name: Remove config + cisco.nxos.nxos_config: + lines: + - "no ip access-list ACL1v4" + - "no ip access-list ACL2v4" + - "no ipv6 access-list ACL1v6" + - "no ipv6 access-list ACL2v6" + - "no ip access-list NewACL" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rendered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rendered.yml new file mode 100644 index 00000000..dbd42409 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rendered.yml @@ -0,0 +1,61 @@ +--- +- debug: + msg: Start nxos_acls rendered tests connection={{ ansible_connection }} + +- name: Rendered + register: result + cisco.nxos.nxos_acls: &id001 + config: + + - afi: ipv4 + acls: + + - name: ACL1v4 + aces: + + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + eq: 43 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - afi: ipv6 + acls: + + - name: ACL1v6 + aces: + + - grant: permit + sequence: 10 + source: + any: true + destination: + prefix: 2001:db8:12::/32 + protocol: sctp + state: rendered + +- assert: + that: + - result.changed == false + - "'ip access-list ACL1v4' in result.rendered" + - "'50 deny tcp any eq whois 192.0.2.64 0.0.0.255 ack fin' in result.rendered" + - "'ipv6 access-list ACL1v6' in result.rendered" + - "'10 permit sctp any 2001:db8:12::/32' in result.rendered" + - result.rendered | length == 4 + +- name: Idempotence - Rendered + register: result + cisco.nxos.nxos_acls: *id001 + +- assert: + that: + - result.changed == false diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/replaced.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/replaced.yml new file mode 100644 index 00000000..c155afd5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/replaced.yml @@ -0,0 +1,71 @@ +--- +- debug: + msg: Start nxos_acls replaced integration tests connection={{ansible_connection}}" + +- include_tasks: populate_config.yaml + +- block: + + - name: Replaced + register: result + cisco.nxos.nxos_acls: &id001 + config: + + - afi: ipv4 + + - afi: ipv6 + acls: + + - name: ACL1v6 + aces: + + - sequence: 30 + grant: permit + source: + any: true + destination: + any: true + protocol: pim + + - sequence: 40 + remark: Replaced ACE + + - name: ACL2v6 + state: replaced + + - assert: + that: + - "'no ip access-list ACL1v4' in result.commands" + - "'no ip access-list ACL2v4' in result.commands" + - "'ipv6 access-list ACL1v6' in result.commands" + - "'no 10 permit sctp any any' in result.commands" + - "'no 20 remark IPv6 ACL' in result.commands" + - "'30 permit pim any any' in result.commands" + - "'40 remark Replaced ACE' in result.commands" + - "'ipv6 access-list ACL2v6' in result.commands" + - "'no 10 deny ipv6 any host 2001:db8:3000::36' in result.commands" + - "'no 20 permit tcp host 2001:db8:2000:2::2 host 2001:db8:2000:ab::2'\ + \ in result.commands" + - result.commands|length == 10 + + - name: Gather static_routes post facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: acls + + - assert: + that: + - ansible_facts.network_resources.acls == result.after + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_acls: *id001 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rtt.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rtt.yml new file mode 100644 index 00000000..c1e91d46 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_acls/tests/common/rtt.yml @@ -0,0 +1,95 @@ +--- +- debug: + msg: Start nxos_acls round trip integration tests connection = {{ansible_connection}} + +- block: + + - name: RTT - Apply provided configuration + cisco.nxos.nxos_acls: + config: + + - afi: ipv4 + acls: + + - name: ACL1v4 + aces: + + - grant: deny + destination: + address: 192.0.2.64 + wildcard_bits: 0.0.0.255 + source: + any: true + port_protocol: + lt: 25 + protocol: tcp + protocol_options: + tcp: + ack: true + fin: true + sequence: 50 + + - grant: permit + protocol: ip + source: + any: true + destination: + any: true + fragments: true + log: true + sequence: 20 + state: merged + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - acls + + - name: Apply configuration to be reverted + register: result + cisco.nxos.nxos_acls: + config: + + - afi: ipv6 + acls: + + - name: ACL1v6 + aces: + + - grant: permit + sequence: 10 + source: + any: true + destination: + host: 2001:db8:12::128 + protocol: sctp + state: overridden + + - assert: + that: + - result.changed == True + - "'no ip access-list ACL1v4' in result.commands" + - "'ipv6 access-list ACL1v6' in result.commands" + - "'10 permit sctp any host 2001:db8:12::128' in result.commands" + - 'result.commands | length == 3 ' + + - name: Revert back to base configuration using facts round trip + register: result + cisco.nxos.nxos_acls: + config: "{{ ansible_facts['network_resources']['acls'] }}" + state: overridden + + - assert: + that: + - result.changed == True + - "'ip access-list ACL1v4' in result.commands" + - "'20 permit ip any any fragments log' in result.commands" + - "'50 deny tcp any lt smtp 192.0.2.64 0.0.0.255 fin ack' in result.commands" + - "'no ipv6 access-list ACL1v6' in result.commands" + - 'result.commands | length == 4 ' + always: + + - include_tasks: remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/defaults/main.yaml new file mode 100644 index 00000000..a845c24b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: '*' +test_items: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/meta/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/meta/main.yaml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/meta/main.yaml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/main.yaml new file mode 100644 index 00000000..af71367b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/main.yaml @@ -0,0 +1,12 @@ +--- +- set_fact: + banner_exec_image_ok: False + banner_motd_image_ok: False + +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tests/common/sanity.yaml new file mode 100644 index 00000000..876e7b25 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_banner/tests/common/sanity.yaml @@ -0,0 +1,78 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_banner sanity test" + +- set_fact: + banner_exec_image_ok: True + when: platform is search("N7K|N3K-F") + +- set_fact: + banner_motd_image_ok: True + when: imagetag is not search("I7") and ansible_connection != "ansible.netcommon.httpapi" + +- block: + + - debug: msg="START nxos_banner exec tests" + + - name: setup exec + cisco.nxos.nxos_banner: &id002 + banner: exec + state: absent + + - name: Set exec + register: result + cisco.nxos.nxos_banner: &id001 + banner: exec + text: "this is my exec banner\nthat has a multiline\nstring" + state: present + + - assert: + that: + - result.changed == true + - "'banner exec @\nthis is my exec banner\nthat has a multiline\nstring\n\ + @' in result.commands" + + - name: Set exec again (idempotent) + register: result + cisco.nxos.nxos_banner: *id001 + + - assert: + that: + - result.changed == false + - result.commands | length == 0 + + - name: teardown exec + cisco.nxos.nxos_banner: *id002 + when: banner_exec_image_ok == True + +- block: + + - name: setup motd + cisco.nxos.nxos_banner: &id004 + banner: motd + state: absent + + - name: Set motd + register: result + cisco.nxos.nxos_banner: &id003 + banner: motd + text: "Junk motd banner\nover multiple lines" + state: present + + - assert: + that: + - result.changed == true + - "'banner motd @\nJunk motd banner\nover multiple lines\n@' in result.commands" + + - name: Set motd again (idempotent) + register: result + cisco.nxos.nxos_banner: *id003 + + - assert: + that: + - result.changed == false + + - name: teardown motd + cisco.nxos.nxos_banner: *id004 + when: banner_motd_image_ok == True + +- debug: msg="END connection={{ ansible_connection }} nxos_banner sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tests/common/sanity.yaml new file mode 100644 index 00000000..384952f6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_global/tests/common/sanity.yaml @@ -0,0 +1,167 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bfd_global sanity test" + +- name: set facts common + set_fact: + echo: deleted + nd_echo: loopback1 + interval: &id001 + tx: 50 + min_rx: 50 + multiplier: 3 + nd_interval: + tx: 51 + min_rx: 52 + multiplier: 4 + slow: 2000 + nd_slow: 2001 + +- name: set facts (exclude 5K/6K) + set_fact: + echo_rx: 50 + nd_echo_rx: 51 + ipv4_echo_rx: 50 + nd_ipv4_echo_rx: 54 + ipv4_interval: *id001 + nd_ipv4_interval: &id002 + tx: 54 + min_rx: 56 + multiplier: 8 + ipv4_slow: 2000 + nd_ipv4_slow: 2044 + when: platform is not search('N5K|N6K') + +- name: set facts (exclude 35/5K/6K) + set_fact: + ipv6_echo_rx: 50 + nd_ipv6_echo_rx: 56 + ipv6_interval: *id001 + nd_ipv6_interval: *id002 + ipv6_slow: 2000 + nd_ipv6_slow: 2046 + when: platform is not search('N35|N5K|N6K') + +- name: set facts (exclude 5K/6K/7K) + set_fact: + startup: 5 + nd_startup: 6 + when: platform is not search('N35|N5K|N6K|N7K') + +- name: set facts 3k defaults (resets some values above) + set_fact: + echo_rx: 250 + interval: &id003 + tx: 250 + min_rx: 250 + multiplier: 3 + ipv4_echo_rx: 250 + ipv6_echo_rx: 250 + ipv4_interval: *id003 + ipv6_interval: *id003 + ipv4_slow: 2000 + ipv6_slow: 2000 + when: platform is search('N3K') + +- name: set facts fabricpath + set_fact: + fab_interval: *id001 + nd_fab_interval: + tx: 57 + min_rx: 57 + multiplier: 7 + fab_slow_timer: 2000 + nd_fab_slow_timer: 2007 + fab_vlan: 1 + nd_fab_vlan: 47 + when: platform is not search('N35|N3K|N9K') + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_feature: &id008 + feature: bfd + state: disabled + +- name: Setup supporting loopback interface + cisco.nxos.nxos_config: + lines: interface loopback1 + match: none + +- name: feature bfd init + delay: 3 + retries: 1 + register: result + until: result is not failed + ignore_errors: true + cisco.nxos.nxos_bfd_global: + slow_timer: '{{ nd_slow }}' + +- block: + + - name: BFD non defaults + register: result + cisco.nxos.nxos_bfd_global: &id004 + echo_interface: '{{ nd_echo }}' + echo_rx_interval: '{{ nd_echo_rx | default(omit) }}' + interval: '{{ nd_interval }}' + slow_timer: '{{ nd_slow }}' + startup_timer: '{{ nd_startup | default(omit) }}' + ipv4_echo_rx_interval: '{{ nd_ipv4_echo_rx | default(omit) }}' + ipv6_echo_rx_interval: '{{ nd_ipv6_echo_rx | default(omit) }}' + ipv4_interval: '{{ nd_ipv4_interval | default(omit) }}' + ipv6_interval: '{{ nd_ipv6_interval | default(omit) }}' + ipv4_slow_timer: '{{ nd_ipv4_slow | default(omit) }}' + ipv6_slow_timer: '{{ nd_ipv6_slow | default(omit) }}' + fabricpath_interval: '{{ nd_fab_interval | default(omit) }}' + fabricpath_slow_timer: '{{ nd_fab_slow | default(omit) }}' + fabricpath_vlan: '{{ nd_fab_vlan | default(omit) }}' + + - assert: &id005 + that: + - result.changed == true + + - name: bfd_non_def idempotence + register: result + cisco.nxos.nxos_bfd_global: *id004 + + - assert: &id007 + that: + - result.changed == false + + - name: BFD defaults + register: result + cisco.nxos.nxos_bfd_global: &id006 + echo_interface: '{{ echo }}' + echo_rx_interval: '{{ echo_rx | default(omit) }}' + interval: '{{ interval }}' + slow_timer: '{{ slow }}' + startup_timer: '{{ startup | default(omit) }}' + ipv4_echo_rx_interval: '{{ ipv4_echo_rx | default(omit) }}' + ipv6_echo_rx_interval: '{{ ipv6_echo_rx | default(omit) }}' + ipv4_interval: '{{ ipv4_interval | default(omit) }}' + ipv6_interval: '{{ ipv6_interval | default(omit) }}' + ipv4_slow_timer: '{{ ipv4_slow | default(omit) }}' + ipv6_slow_timer: '{{ ipv6_slow | default(omit) }}' + fabricpath_interval: '{{ fab_interval | default(omit) }}' + fabricpath_slow_timer: '{{ fab_slow | default(omit) }}' + fabricpath_vlan: '{{ fab_vlan | default(omit) }}' + + - assert: *id005 + + - name: bfd_def idempotence + register: result + cisco.nxos.nxos_bfd_global: *id006 + + - assert: *id007 + always: + + - name: Teardown + ignore_errors: true + cisco.nxos.nxos_feature: *id008 + + - name: Teardown supporting loopback interface + ignore_errors: true + cisco.nxos.nxos_config: + lines: no interface loopback1 + match: none + +- debug: msg="END connection={{ ansible_connection }} nxos_bfd_global sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..12c20322 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/cli.yaml @@ -0,0 +1,29 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..3edd20df --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,14 @@ +- name: Populate config - 1 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "interface {{ nxos_int1 }}" + - " no switchport" + - " no bfd" + +- name: Populate config - 2 + cisco.nxos.nxos_config: + lines: + - "interface {{ nxos_int2 }}" + - " no switchport" + - " no bfd echo" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..3ec2b2de --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,8 @@ +- name: Remove config + cisco.nxos.nxos_config: + lines: + - "no feature bfd" + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + - "default interface {{ nxos_int3 }}" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..d6eb85b1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/deleted.yaml @@ -0,0 +1,75 @@ +--- +- debug: + msg: Start nxos_bfd_interfaces deleted integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N5K|N6K') + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: + - "no feature bfd" + - "default interface {{ test_int1 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "interface {{ test_int1 }}" + - " no switchport" + + - name: setup initial bfd state + cisco.nxos.nxos_bfd_interfaces: + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + echo: disable + state: merged + + - name: Gather bfd_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: bfd_interfaces + + - name: deleted + register: result + cisco.nxos.nxos_bfd_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + state: deleted + + - assert: + that: + - result.changed == true + - "'bfd echo' in result.commands" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - assert: + that: + - "{{ 'bfd' in result.commands }}" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + when: bfd_enable is defined + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_bfd_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..50b4d6ba --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_bfd_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bfd_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bfd_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bfd_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bfd_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bfd_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_bfd_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..1d0187b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START nxos_bfd_interfaces gathered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather bfd_interfaces facts from the device using nxos_bfd_interfaces + register: result + cisco.nxos.nxos_bfd_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'][:3] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_bfd_interfaces gathered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..e1b930d3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/merged.yaml @@ -0,0 +1,73 @@ +--- +- debug: + msg: Start nxos_bfd_interfaces merged integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N5K|N6K') + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: + - "no feature bfd" + - "default interface {{ test_int1 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "interface {{ test_int1 }}" + - " no switchport" + + - name: Merged + register: result + cisco.nxos.nxos_bfd_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + echo: disable + state: merged + + - assert: + that: + - result.changed == true + - "'no bfd echo' in result.commands" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - assert: + that: + - "{{ 'no bfd' in result.commands }}" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + when: bfd_enable is defined + + - name: Gather bfd_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: bfd_interfaces + + - assert: + that: + - ansible_facts.network_resources.bfd_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_bfd_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..60a77cbe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/overridden.yaml @@ -0,0 +1,79 @@ +--- +- debug: + msg: Start nxos_bfd_interfaces overridden integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: test_int2="{{ nxos_int2 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N5K|N6K') + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: + - "no feature bfd" + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "no switchport" + parents: "interface {{ item }}" + loop: + - "{{ test_int1 }}" + - "{{ test_int2 }}" + + - name: setup initial bfd state + cisco.nxos.nxos_bfd_interfaces: + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + echo: enable + + - name: '{{ test_int2 }}' + bfd: '{{ bfd_enable|default(omit)}}' + echo: disable + state: merged + + - name: Overridden + register: result + cisco.nxos.nxos_bfd_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + echo: disable + state: overridden + + - assert: + that: + - result.changed == true + - result.commands[1] == 'bfd echo' + - result.commands[3] == 'no bfd echo' + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_bfd_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..0b8403e3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/parsed.yaml @@ -0,0 +1,34 @@ +--- +- debug: + msg: START nxos_bfd_interfaces parsed integration tests on connection={{ ansible_connection + }} + +- block: + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_bfd_interfaces: + running_config: | + feature bfd + interface Ethernet1/800 + no switchport + no bfd + no bfd echo + interface Ethernet1/801 + no switchport + no bfd + interface Ethernet1/802 + no switchport + no bfd echo + interface mgmt0 + ip address dhcp + vrf member management + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_bfd_interfaces parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..ad23ab64 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/rendered.yaml @@ -0,0 +1,41 @@ +--- +- debug: + msg: START nxos_bfd_interfaces rendered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- block: + # Interfaces used here doesn't actually exist on the device + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_bfd_interfaces: + config: + - name: Ethernet1/800 + bfd: enable + echo: enable + - name: Ethernet1/801 + bfd: disable + echo: disable + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather bfd_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_bfd_interfaces: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered'] == [] }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_bfd_interfaces rendered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..6d9a25d1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/tests/common/replaced.yaml @@ -0,0 +1,70 @@ +--- +- debug: + msg: Start nxos_bfd_interfaces replaced integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N5K|N6K') + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: + - "no feature bfd" + - "default interface {{ test_int1 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "interface {{ test_int1 }}" + - " no switchport" + + - name: setup initial bfd state + cisco.nxos.nxos_bfd_interfaces: + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + echo: enable + state: merged + + - name: Replaced + register: result + cisco.nxos.nxos_bfd_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_enable|default(omit)}}' + echo: disable + state: replaced + + - assert: + that: + - result.changed == true + - "'no bfd echo' in result.commands" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - assert: + that: + - "{{ 'bfd' in result.commands }}" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + when: bfd_enable is defined + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_bfd_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/vars/main.yml new file mode 100644 index 00000000..29552637 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bfd_interfaces/vars/main.yml @@ -0,0 +1,32 @@ +gathered: + - name: "{{ nxos_int1 }}" + bfd: disable + echo: enable + - name: "{{ nxos_int2 }}" + echo: disable + bfd: enable + - name: "{{ nxos_int3 }}" + bfd: enable + echo: enable + +parsed: + - bfd: disable + echo: disable + name: Ethernet1/800 + - bfd: disable + echo: enable + name: Ethernet1/801 + - bfd: enable + echo: disable + name: Ethernet1/802 + - bfd: enable + echo: enable + name: mgmt0 + +rendered: + - "interface Ethernet1/800" + - "bfd" + - "bfd echo" + - "interface Ethernet1/801" + - "no bfd" + - "no bfd echo" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/defaults/main.yaml new file mode 100644 index 00000000..e69126b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/defaults/main.yaml @@ -0,0 +1,5 @@ +--- +testcase: '*' +vrfs: +- default +- myvrf diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/dis_policy.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/dis_policy.yaml new file mode 100644 index 00000000..bea37b7f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/dis_policy.yaml @@ -0,0 +1,80 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp parameter test" + +- debug: msg="This bgp_disable_policy is not supported on {{ image_version }}" + when: imagetag is search("A8|D1") + +- set_fact: bgp_disable_policy="false" + +- set_fact: bgp_disable_policy="true" + when: imagetag is not search("A8|D1") + +- name: Disable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- block: + + - name: set disable policy + register: result + when: bgp_disable_policy + cisco.nxos.nxos_bgp: &id001 + asn: 65535 + disable_policy_batching: true + disable_policy_batching_ipv4_prefix_list: v4_p + disable_policy_batching_ipv6_prefix_list: v6_p + + - assert: &id002 + that: + - result.changed == true + when: bgp_disable_policy + + - name: Check Idempotence + register: result + when: bgp_disable_policy + cisco.nxos.nxos_bgp: *id001 + + - assert: &id004 + that: + - result.changed == false + when: bgp_disable_policy + + - name: reset disable policy + register: result + when: bgp_disable_policy + cisco.nxos.nxos_bgp: &id003 + asn: 65535 + disable_policy_batching: false + disable_policy_batching_ipv4_prefix_list: default + disable_policy_batching_ipv6_prefix_list: default + + - assert: *id002 + when: bgp_disable_policy + + - name: Check Idempotence + register: result + when: bgp_disable_policy + cisco.nxos.nxos_bgp: *id003 + + - assert: *id004 + when: bgp_disable_policy + rescue: + + - debug: msg="Tests can fail on A8 or helsinki images" + always: + + - name: Disable feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp parameter test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/hels.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/hels.yaml new file mode 100644 index 00000000..a92258c9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/hels.yaml @@ -0,0 +1,96 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp parameter test" + +- debug: msg="This test is not supported on {{ image_version }}" + when: imagetag is search("D1") + +- set_fact: test_helsinki="false" + +- set_fact: test_helsinki="true" + when: imagetag is not search("D1") + +- name: Disable feature BGP + ignore_errors: true + when: test_helsinki + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Enable feature BGP + ignore_errors: true + when: test_helsinki + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- block: + + - name: set helsinki + with_items: '{{ vrfs }}' + register: result + when: test_helsinki + cisco.nxos.nxos_bgp: &id001 + asn: 65535 + vrf: '{{ item }}' + graceful_restart_timers_restart: 130 + graceful_restart_timers_stalepath_time: 310 + neighbor_down_fib_accelerate: true + reconnect_interval: 55 + timer_bgp_hold: 110 + timer_bgp_keepalive: 45 + + - assert: &id002 + that: + - result.changed == true + when: test_helsinki + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + when: test_helsinki + cisco.nxos.nxos_bgp: *id001 + + - assert: &id004 + that: + - result.changed == false + when: test_helsinki + + - name: reset helsinki + with_items: '{{ vrfs }}' + register: result + when: test_helsinki + cisco.nxos.nxos_bgp: &id003 + asn: 65535 + vrf: '{{ item }}' + graceful_restart: true + graceful_restart_timers_restart: default + graceful_restart_timers_stalepath_time: default + neighbor_down_fib_accelerate: false + reconnect_interval: default + timer_bgp_hold: default + timer_bgp_keepalive: default + + - assert: *id002 + when: test_helsinki + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + when: test_helsinki + cisco.nxos.nxos_bgp: *id003 + + - assert: *id004 + when: test_helsinki + rescue: + + - debug: msg="Tests can fail on helsinki images" + always: + + - name: Disable feature bgp + ignore_errors: true + when: test_helsinki + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp parameter test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/isolate.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/isolate.yaml new file mode 100644 index 00000000..8b2d7138 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/isolate.yaml @@ -0,0 +1,76 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp parameter test" + +- debug: msg="This bgp_isolate is not supported on {{ image_version }}" + when: imagetag is search("A8") + +- set_fact: bgp_isolate="false" + +- set_fact: bgp_isolate="true" + when: imagetag is not search("A8") + +- name: Disable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- block: + + - name: set isolate + register: result + when: bgp_isolate + cisco.nxos.nxos_bgp: &id001 + asn: 65535 + isolate: false + + - assert: &id002 + that: + - result.changed == true + when: bgp_isolate + + - name: Check Idempotence + register: result + when: bgp_isolate + cisco.nxos.nxos_bgp: *id001 + + - assert: &id004 + that: + - result.changed == false + when: bgp_isolate + + - name: reset isolate + register: result + when: bgp_isolate + cisco.nxos.nxos_bgp: &id003 + asn: 65535 + isolate: true + + - assert: *id002 + when: bgp_isolate + + - name: Check Idempotence + register: result + when: bgp_isolate + cisco.nxos.nxos_bgp: *id003 + + - assert: *id004 + when: bgp_isolate + rescue: + + - debug: msg="Tests can fail on A8 images" + always: + + - name: Disable feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp parameter test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/param.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/param.yaml new file mode 100644 index 00000000..4e5d9b84 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/param.yaml @@ -0,0 +1,258 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp parameter test" + +- name: Disable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- block: + + - name: set multi vrf params + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: &id001 + asn: 65535 + vrf: '{{ item }}' + router_id: 192.0.2.1 + bestpath_always_compare_med: true + bestpath_aspath_multipath_relax: true + bestpath_compare_routerid: true + bestpath_cost_community_ignore: true + bestpath_med_confed: true + bestpath_med_missing_as_worst: true + bestpath_med_non_deterministic: true + graceful_restart_helper: true + log_neighbor_changes: true + maxas_limit: 50 + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: reset multi vrf params + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: &id003 + asn: 65535 + vrf: '{{ item }}' + bestpath_always_compare_med: false + bestpath_aspath_multipath_relax: false + bestpath_compare_routerid: false + bestpath_cost_community_ignore: false + bestpath_med_confed: false + bestpath_med_missing_as_worst: false + bestpath_med_non_deterministic: false + graceful_restart_helper: false + log_neighbor_changes: false + maxas_limit: default + router_id: default + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: *id003 + + - assert: *id004 + + - name: set clusterid + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: &id005 + asn: 65535 + vrf: '{{ item }}' + cluster_id: 10.0.0.1 + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: *id005 + + - assert: *id004 + + - name: reset cluster_id + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: &id006 + asn: 65535 + vrf: '{{ item }}' + cluster_id: default + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: *id006 + + - assert: *id004 + + - name: set confederation + register: result + cisco.nxos.nxos_bgp: &id007 + asn: 65535 + confederation_id: 99 + confederation_peers: + - 16 + - 22 + - 18 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id007 + + - assert: *id004 + + - name: reset confederation + register: result + cisco.nxos.nxos_bgp: &id008 + asn: 65535 + confederation_id: default + confederation_peers: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id008 + + - assert: *id004 + + - name: set confederation_local_as + register: result + cisco.nxos.nxos_bgp: &id009 + asn: 65535 + vrf: myvrf + local_as: 33 + confederation_id: 99 + confederation_peers: + - 16 + - 22 + - 18 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id009 + + - assert: *id004 + + - name: reset confederation local_as + register: result + cisco.nxos.nxos_bgp: &id010 + asn: 65535 + vrf: myvrf + local_as: default + confederation_id: default + confederation_peers: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id010 + + - assert: *id004 + + - name: set local_as + register: result + cisco.nxos.nxos_bgp: &id011 + asn: 65535 + vrf: myvrf + local_as: 33 + confederation_id: 99 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id011 + + - assert: *id004 + + - name: reset local_as + register: result + cisco.nxos.nxos_bgp: &id012 + asn: 65535 + vrf: myvrf + confederation_id: default + local_as: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id012 + + - assert: *id004 + + - name: set default vrf params + register: result + cisco.nxos.nxos_bgp: &id013 + asn: 65535 + event_history_cli: size_medium + event_history_detail: size_large + event_history_events: size_medium + event_history_periodic: size_small + enforce_first_as: false + fast_external_fallover: false + flush_routes: true + shutdown: true + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id013 + + - assert: *id004 + + - name: reset default vrf params + register: result + cisco.nxos.nxos_bgp: &id014 + asn: 65535 + event_history_detail: default + enforce_first_as: true + fast_external_fallover: true + flush_routes: false + shutdown: false + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id014 + + - assert: *id004 + always: + + - name: Disable feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp parameter test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/sanity.yaml new file mode 100644 index 00000000..06027a5b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/sanity.yaml @@ -0,0 +1,133 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp sanity test" + +- set_fact: neighbor_down_fib_accelerate="true" + when: (not titanium) and ((imagetag != 'N1') and (imagetag != 'D1')) + +- set_fact: reconnect_interval="55" + when: (not titanium) and ((imagetag != 'N1') and (imagetag != 'D1')) + +- set_fact: isolate="false" + when: platform is not match("N35") + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- name: Setup + ignore_errors: true + register: result + cisco.nxos.nxos_bgp: &id002 + asn: 65535 + state: absent + +- block: + + - name: Configure BGP defaults + register: result + cisco.nxos.nxos_bgp: &id001 + asn: 65535 + router_id: 192.0.2.1 + state: present + + - assert: &id003 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove BGP + register: result + cisco.nxos.nxos_bgp: *id002 + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id002 + + - assert: *id004 + + - name: Configure BGP non defaults + register: result + cisco.nxos.nxos_bgp: &id005 + asn: 65535 + router_id: 192.0.2.1 + bestpath_always_compare_med: true + bestpath_aspath_multipath_relax: true + bestpath_compare_routerid: true + bestpath_cost_community_ignore: true + bestpath_med_confed: true + bestpath_med_missing_as_worst: true + bestpath_med_non_deterministic: true + cluster_id: 10.0.0.1 + confederation_id: 99 + disable_policy_batching: true + enforce_first_as: false + fast_external_fallover: false + flush_routes: true + graceful_restart_helper: true + graceful_restart_timers_restart: 130 + graceful_restart_timers_stalepath_time: 310 + isolate: '{{isolate|default(omit)}}' + log_neighbor_changes: true + maxas_limit: 50 + neighbor_down_fib_accelerate: '{{neighbor_down_fib_accelerate|default(omit)}}' + reconnect_interval: '{{reconnect_interval|default(omit)}}' + shutdown: true + timer_bestpath_limit: 255 + timer_bgp_hold: 110 + timer_bgp_keepalive: 45 + event_history_cli: size_medium + event_history_detail: size_large + event_history_events: size_medium + event_history_periodic: size_small + suppress_fib_pending: true + state: present + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id005 + + - assert: *id004 + + - name: Remove BGP + register: result + cisco.nxos.nxos_bgp: *id002 + + - assert: *id003 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp: *id002 + + - assert: *id004 + + - name: Disable feature bgp + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + rescue: + + - name: Cleanup BGP + ignore_errors: true + cisco.nxos.nxos_bgp: *id002 + + - name: Disable feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + always: + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/supp_fib.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/supp_fib.yaml new file mode 100644 index 00000000..9fe8e643 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp/tests/common/supp_fib.yaml @@ -0,0 +1,112 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp parameter test" + +- set_fact: bgp_best_path_limit="false" + +- set_fact: bgp_best_path_limit="true" + when: imagetag is not search("I2") + +- set_fact: bgp_suppress_fib_supported="false" + +- set_fact: bgp_suppress_fib_supported="true" + when: imagetag is not search("A8|D1|I2|I4") + +- name: Disable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- block: + + - name: set bestpath limit + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: &id001 + asn: 65535 + vrf: '{{ item }}' + timer_bestpath_limit: 255 + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: reset bestpath limit + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp: &id003 + asn: 65535 + vrf: '{{ item }}' + timer_bestpath_limit: default + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + when: bgp_best_path_limit + cisco.nxos.nxos_bgp: *id003 + + - assert: *id004 + when: bgp_best_path_limit + + - name: set suppress fib + register: result + cisco.nxos.nxos_bgp: &id005 + asn: 65535 + suppress_fib_pending: false + + - assert: *id002 + when: bgp_suppress_fib_supported + + - name: Check Idempotence + register: result + when: bgp_suppress_fib_supported + cisco.nxos.nxos_bgp: *id005 + + - assert: *id004 + when: bgp_suppress_fib_supported + + - name: reset suppress fib + register: result + cisco.nxos.nxos_bgp: &id006 + asn: 65535 + suppress_fib_pending: true + + - assert: *id002 + when: bgp_suppress_fib_supported + + - name: Check Idempotence + register: result + when: bgp_suppress_fib_supported + cisco.nxos.nxos_bgp: *id006 + + - assert: *id004 + when: bgp_suppress_fib_supported + rescue: + + - debug: msg="Tests can fail on I2/I4/A8/Fretta or helsinki images" + always: + + - name: Disable feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp parameter test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/defaults/main.yaml new file mode 100644 index 00000000..e69126b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/defaults/main.yaml @@ -0,0 +1,5 @@ +--- +testcase: '*' +vrfs: +- default +- myvrf diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/multisite.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/multisite.yaml new file mode 100644 index 00000000..74dfff6f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/multisite.yaml @@ -0,0 +1,131 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp_af multisite sanity test" + +- name: Enable feature BGP - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- name: Enable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: enabled + +- name: Setup - multisite + ignore_errors: true + cisco.nxos.nxos_bgp: &id012 + asn: 65535 + state: absent + +- name: Enable nv overlay evpn - multisite + when: platform is search('N9K') + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + +- name: Enable multisite border gateway - multisite + ignore_errors: true + register: multiout + cisco.nxos.nxos_config: + lines: + - evpn multisite border-gateway 10 + +- block: + + - name: Configure BGP_AF Route Target Name + register: result + cisco.nxos.nxos_bgp_af: &id001 + asn: 65535 + afi: l2vpn + safi: evpn + state: present + retain_route_target: abc + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_af: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: Configure BGP_AF Route Target Default + register: result + cisco.nxos.nxos_bgp_af: &id004 + asn: 65535 + afi: l2vpn + safi: evpn + state: present + retain_route_target: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_af: *id004 + + - assert: *id003 + + - name: Configure BGP_AF 1 Route Target All + register: result + cisco.nxos.nxos_bgp_af: &id005 + asn: 65535 + afi: l2vpn + safi: evpn + state: present + retain_route_target: all + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_af: *id005 + + - assert: *id003 + + - name: Remove BGP - Route Target + register: result + cisco.nxos.nxos_bgp_af: &id006 + asn: 65535 + afi: l2vpn + safi: evpn + retain_route_target: all + state: absent + + - assert: *id002 + + - name: Disable multisite border gateway - multisite + cisco.nxos.nxos_config: + lines: + - no evpn multisite border-gateway 10 + when: multiout is not search("Invalid command") + +- name: Disable feature bgp - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Disable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: disabled + +- pause: + seconds: 5 + +- name: Remove nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - no nv overlay evpn + +- debug: msg="END connection={{ ansible_connection }} nxos_bgp_af multisite sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/sanity.yaml new file mode 100644 index 00000000..f013588b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_af/tests/common/sanity.yaml @@ -0,0 +1,336 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp_af sanity test" + +- set_fact: advertise_l2vpn_evpn="true" + when: platform is search('N9K') + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- name: Enable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: enabled + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_bgp: &id012 + asn: 65535 + state: absent + +- block: + + - name: Enable nv overlay evpn + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + + - name: Configure BGP_AF 1 + register: result + cisco.nxos.nxos_bgp_af: &id001 + asn: 65535 + vrf: testing + afi: ipv4 + safi: unicast + advertise_l2vpn_evpn: '{{advertise_l2vpn_evpn|default(omit)}}' + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_af: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove BGP + register: result + cisco.nxos.nxos_bgp_af: + asn: 65535 + vrf: testing + afi: ipv4 + safi: unicast + state: absent + + - assert: *id002 + + - name: Configure BGP_AF 2 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id003 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampening_state: true + additional_paths_install: true + additional_paths_receive: true + additional_paths_selection: RouteMap + additional_paths_send: true + client_to_client: false + default_information_originate: true + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id003 + + - assert: *id004 + + - name: Configure BGP_AF def2 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id005 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampening_state: false + additional_paths_install: false + additional_paths_receive: false + additional_paths_selection: default + additional_paths_send: false + client_to_client: true + default_information_originate: false + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id005 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id008 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + state: absent + + - assert: *id002 + + - name: Configure BGP_AF 3 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id006 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampening_routemap: abcd + default_metric: 50 + distance_ebgp: 30 + distance_ibgp: 60 + distance_local: 90 + maximum_paths: 9 + maximum_paths_ibgp: 9 + next_hop_route_map: RouteMap + suppress_inactive: true + table_map: RouteMap + table_map_filter: true + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id006 + + - assert: *id004 + + - name: Configure BGP_AF def3 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id007 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampening_routemap: default + default_metric: default + distance_ebgp: default + distance_ibgp: default + distance_local: default + maximum_paths: default + maximum_paths_ibgp: default + next_hop_route_map: default + suppress_inactive: false + table_map: default + table_map_filter: false + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id007 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id008 + + - assert: *id002 + + - name: Configure BGP_AF 4 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id009 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampen_igp_metric: 200 + dampening_half_time: 1 + dampening_max_suppress_time: 4 + dampening_reuse_time: 2 + dampening_suppress_time: 3 + inject_map: [ + [lax_inject_map, lax_exist_map], + [nyc_inject_map, nyc_exist_map, copy-attributes], + [fsd_inject_map, fsd_exist_map] + ] + networks: [ + [10.0.0.0/16, routemap_LA], + [192.168.1.1/32, Chicago], + [192.168.2.0/24], + [192.168.3.0/24, routemap_NYC] + ] + redistribute: [ + [direct, rm_direct], + [lisp, rm_lisp] + ] + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id009 + + - assert: *id004 + + - name: Configure BGP_AF 5 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id010 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampen_igp_metric: 300 + dampening_half_time: 10 + dampening_max_suppress_time: 40 + dampening_reuse_time: 20 + dampening_suppress_time: 30 + inject_map: [ + [fsd_inject_map, fsd_exist_map] + ] + networks: [ + [192.168.2.0/24] + ] + redistribute: [ + [lisp, rm_lisp] + ] + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id010 + + - assert: *id004 + + - name: Configure BGP_AF def5 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: &id011 + asn: 65535 + vrf: '{{ item }}' + afi: ipv4 + safi: unicast + dampen_igp_metric: default + dampening_half_time: default + dampening_max_suppress_time: default + dampening_reuse_time: default + dampening_suppress_time: default + inject_map: default + networks: default + redistribute: default + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id011 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id008 + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_af: *id008 + + - assert: *id004 + rescue: + + - name: Cleanup BGP + ignore_errors: true + cisco.nxos.nxos_bgp: *id012 + always: + + - name: Disable feature bgp + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - name: Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: disabled + + - pause: + seconds: 5 + + - name: Remove nv overlay evpn + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - no nv overlay evpn + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp_af sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/meta/main.yml new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/main.yaml new file mode 100644 index 00000000..6b13ac86 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/main.yaml @@ -0,0 +1,32 @@ +--- +- name: Enable BGP feature + cisco.nxos.nxos_feature: + feature: bgp + vars: + ansible_connection: ansible.netcommon.network_cli + +- name: Enable fabric forwarding + cisco.nxos.nxos_config: + lines: feature fabric forwarding + +- block: + + - include: cli.yaml + tags: + - cli + + - include: nxapi.yaml + tags: + - nxapi + + always: + - name: Disable BGP feature + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + vars: + ansible_connection: ansible.netcommon.network_cli + + - name: Disable fabric forwarding + cisco.nxos.nxos_config: + lines: no feature fabric forwarding diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_populate_config.yaml new file mode 100644 index 00000000..e37bd0e2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_populate_config.yaml @@ -0,0 +1,63 @@ +- name: "Setup - 1" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "bestpath as-path multipath-relax" + - "bestpath compare-neighborid" + - "bestpath cost-community ignore" + - "confederation identifier 42" + - "log-neighbor-changes" + - "maxas-limit 20" + - "neighbor-down fib-accelerate" + - "router-id 198.51.100.2" + - "confederation peers 65020 65030 65040" + - "neighbor 198.51.100.20" + - " remote-as 65537" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + vars: + ansible_connection: ansible.netcommon.network_cli + +- name: "Setup - 2" + cisco.nxos.nxos_config: + lines: + - "neighbor 198.51.100.21" + - " remote-as 65537" + - " password 7 12090404011C03162E" + - "vrf site-2" + - " local-as 300" + - " log-neighbor-changes" + - " neighbor-down fib-accelerate" + - " neighbor 203.0.113.2" + - " remote-as 65539" + - " description site-2-nbr-1" + - " password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6" + parents: "router bgp 65536" + vars: + ansible_connection: ansible.netcommon.network_cli + +- name: "Setup - 3" + cisco.nxos.nxos_config: + lines: + - "vrf site-1" + - " local-as 200" + - " log-neighbor-changes" + - " neighbor 192.0.2.10" + - " remote-as 65538" + - " description site-1-nbr-1" + - " password 3 13D4D3549493D2877B1DC116EE27A6BE" + parents: "router bgp 65536" + vars: + ansible_connection: ansible.netcommon.network_cli + +- name: "Setup - 3" + cisco.nxos.nxos_config: + lines: + - "vrf site-1" + - " neighbor 192.0.2.11" + - " remote-as 65538" + - " description site-1-nbr-2" + parents: "router bgp 65536" + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_remove_config.yaml new file mode 100644 index 00000000..a10dc96b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/_remove_config.yaml @@ -0,0 +1,7 @@ +- name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: + lines: + - no router bgp 65536 + ignore_errors: True + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted.yaml new file mode 100644 index 00000000..bcf3cb69 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted.yaml @@ -0,0 +1,45 @@ +--- +- debug: + msg: Start nxos_bgp_global deleted integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Delete BGP configs handled by this module + cisco.nxos.nxos_bgp_global: &id003 + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - merged['after'] == result['before'] + + - debug: + msg: "{{ result['commands'] | symmetric_difference(deleted['commands']) }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ result['commands'] | symmetric_difference(deleted['commands']) |length\ + \ == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - deleted['after'] == result['after'] + + - name: Delete BGP configs handled by this module (IDEMPOTENT) + register: result + cisco.nxos.nxos_bgp_global: *id003 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted_af.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted_af.yaml new file mode 100644 index 00000000..c2d4125f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/deleted_af.yaml @@ -0,0 +1,115 @@ +--- +- debug: + msg: Start nxos_bgp_global deleted_af integration tests connection={{ ansible_connection}} + +- name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: &remove + lines: + - no router bgp 65536 + ignore_errors: True + +- name: "Setup - 1 (Add neighbor with AF config)" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "log-neighbor-changes" + - "maxas-limit 20" + - "router-id 198.51.100.2" + - "neighbor 203.0.113.2" + - " address-family ipv4 unicast" + - " next-hop-self" + - " remote-as 65538" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + - "neighbor 192.0.2.1" + - " remote-as 65537" + - " password 7 12090404011C03162E" + +- block: + - name: Remove a neighbor having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: &deleted + state: deleted + register: result + ignore_errors: True + + - name: Assert that the task failed + assert: + that: + - result.failed == True + - "'Neighbor 203.0.113.2 has address-family configurations. Please use the nxos_bgp_neighbor_af module to remove those first.' in result.msg" + + - name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: *remove + ignore_errors: True + + - name: "Setup - 2 (Add neighbor with AF config under a VRF)" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "log-neighbor-changes" + - "maxas-limit 20" + - "router-id 198.51.100.2" + - "neighbor 192.0.2.1" + - " remote-as 65537" + - " password 7 12090404011C03162E" + - "vrf site-1" + - " neighbor 203.0.113.2" + - " address-family ipv4 unicast" + - " next-hop-self" + - " remote-as 65538" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + - " neighbor-down fib-accelerate" + + - name: Remove a neighbor under a VRF having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: *deleted + register: result + ignore_errors: True + + - name: Assert that the task failed + assert: + that: + - result.failed == True + - "'VRF site-1 has address-family configurations. Please use the nxos_bgp_af module to remove those first.' in result.msg" + + - name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: *remove + ignore_errors: True + + - name: "Setup - 3 (Add a VRF with AF config)" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "log-neighbor-changes" + - "maxas-limit 20" + - "router-id 198.51.100.2" + - "neighbor 192.0.2.1" + - " remote-as 65537" + - " password 7 12090404011C03162E" + - "vrf site-1" + - " address-family ipv4 unicast" + - " default-information originate" + - " neighbor 203.0.113.2" + - " remote-as 65538" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + - "vrf site-2" + - " neighbor-down fib-accelerate" + + - name: Remove a neighbor under a VRF having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: *deleted + register: result + ignore_errors: True + + - name: Assert that the task failed + assert: + that: + - result.failed == True + - "'VRF site-1 has address-family configurations. Please use the nxos_bgp_af module to remove those first.' in result.msg" + + always: + - name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: *remove diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/empty_config.yaml new file mode 100644 index 00000000..345be09c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/empty_config.yaml @@ -0,0 +1,50 @@ +--- +- debug: + msg: START nxos_bgp_global empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bgp_global: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bgp_global: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bgp_global: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_bgp_global: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_bgp_global empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/fixtures/parsed.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/fixtures/parsed.cfg new file mode 100644 index 00000000..8a39b241 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/fixtures/parsed.cfg @@ -0,0 +1,36 @@ +router bgp 65536 + router-id 198.51.100.2 + confederation identifier 42 + confederation peers 65020 65030 65040 + bestpath as-path multipath-relax + bestpath cost-community ignore + bestpath compare-neighborid + neighbor-down fib-accelerate + maxas-limit 20 + log-neighbor-changes + neighbor 198.51.100.20 + low-memory exempt + remote-as 65537 + description NBR-1 + affinity-group 160 + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + neighbor 192.0.2.11 + remote-as 65538 + description site-1-nbr-2 + vrf site-2 + local-as 300 + neighbor-down fib-accelerate + log-neighbor-changes + neighbor 203.0.113.2 + remote-as 65539 + description site-2-nbr-1 + password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/gathered.yaml new file mode 100644 index 00000000..01fdc8c6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/gathered.yaml @@ -0,0 +1,20 @@ +--- +- debug: + msg: START nxos_bgp_global gathered integration tests on connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather BGP facts using gathered + register: result + cisco.nxos.nxos_bgp_global: + state: gathered + + - name: Assert that facts were correctly generated + assert: + that: merged['after'] == result['gathered'] + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/merged.yaml new file mode 100644 index 00000000..a172b228 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/merged.yaml @@ -0,0 +1,95 @@ +--- +- debug: + msg: Start nxos_bgp_global merged integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- block: + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_bgp_global: &id001 + config: + as_number: 65536 + router_id: 198.51.100.2 + bestpath: + as_path: + multipath_relax: True + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65040 + log_neighbor_changes: True + maxas_limit: 20 + neighbors: + - neighbor_address: 198.51.100.20 + neighbor_affinity_group: + group_id: 160 + remote_as: 65537 + description: NBR-1 + low_memory: + exempt: True + - neighbor_address: 198.51.100.21 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-1 + local_as: 200 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.10 + description: site-1-nbr-1 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: 65538 + - neighbor_address: 192.0.2.11 + remote_as: 65538 + description: site-1-nbr-2 + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + description: site-2-nbr-1 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: 65539 + neighbor_down: + fib_accelerate: True + register: result + + - name: Assert that before dicts were correctly generated + assert: + that: "{{ result['before'] == {} }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['commands']) |length\ + \ == 0 }}" + + - name: Assert that after dicts were correctly generated + assert: + that: + - merged['after'] == result['after'] + + - name: Merge the provided configuration with the existing running configuration + (IDEMPOTENT) + cisco.nxos.nxos_bgp_global: *id001 + register: result + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/parsed.yaml new file mode 100644 index 00000000..d0fb2842 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/parsed.yaml @@ -0,0 +1,14 @@ +--- +- debug: + msg: START nxos_bgp_global parsed integration tests on connection={{ ansible_connection }} + +- name: Parse externally provided BGP config + register: result + cisco.nxos.nxos_bgp_global: + running_config: "{{ lookup('file', './fixtures/parsed.cfg') }}" + state: parsed + +- name: Assert that config was correctly parsed + assert: + that: + - merged['after'] == result['parsed'] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/purged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/purged.yaml new file mode 100644 index 00000000..86655f5a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/purged.yaml @@ -0,0 +1,42 @@ +--- +- debug: + msg: Start nxos_bgp_global purged integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Delete all BGP config from the device + cisco.nxos.nxos_bgp_global: &id003 + state: purged + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - merged['after'] == result['before'] + + - name: Assert that correct set of commands were generated + assert: + that: + - "'no router bgp 65536' in result.commands" + - result.commands|length == 1 + + - name: Assert that after dict is correctly generated + assert: + that: + - result['after'] == {} + + - name: Delete all BGP config from the device (IDEMPOTENT) + register: result + cisco.nxos.nxos_bgp_global: *id003 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/rendered.yaml new file mode 100644 index 00000000..0b63120e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/rendered.yaml @@ -0,0 +1,80 @@ +--- +- debug: + msg: START nxos_bgp_global rendered integration tests on connection={{ ansible_connection }} + +- name: Render platform specific configuration lines with state rendered (without connecting to the device) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + bestpath: + as_path: + multipath_relax: True + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65040 + log_neighbor_changes: True + maxas_limit: 20 + neighbors: + - neighbor_address: 198.51.100.20 + neighbor_affinity_group: + group_id: 160 + remote_as: 65537 + description: NBR-1 + low_memory: + exempt: True + - neighbor_address: 198.51.100.21 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-1 + local_as: 200 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.10 + description: site-1-nbr-1 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: 65538 + - neighbor_address: 192.0.2.11 + remote_as: 65538 + description: site-1-nbr-2 + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + description: site-2-nbr-1 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: 65539 + neighbor_down: + fib_accelerate: True + state: rendered + register: result + +- name: Assert that correct set of commands were rendered + assert: + that: + - merged['commands'] == result['rendered'] + +- name: Gather BGP facts + cisco.nxos.nxos_bgp_global: + state: gathered + register: result + +- name: Ensure that no configuration changes were made + assert: + that: + - result.gathered == {} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced.yaml new file mode 100644 index 00000000..5eda5d29 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced.yaml @@ -0,0 +1,81 @@ +--- +- debug: + msg: Start nxos_bgp_global replaced integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Replace BGP configuration with provided configuration + cisco.nxos.nxos_bgp_global: &id002 + config: + as_number: 65536 + router_id: 198.51.100.2 + bestpath: + compare_neighborid: True + cost_community_ignore: True + confederation: + identifier: 42 + peers: + - 65020 + - 65030 + - 65050 + maxas_limit: 40 + neighbors: + - neighbor_address: 198.51.100.20 + neighbor_affinity_group: + group_id: 160 + remote_as: 65537 + description: NBR-1 + low_memory: + exempt: True + neighbor_down: + fib_accelerate: True + vrfs: + - vrf: site-2 + local_as: 300 + log_neighbor_changes: True + neighbors: + - neighbor_address: 203.0.113.2 + password: + encryption: 7 + key: 12090404011C03162E + neighbor_down: + fib_accelerate: True + state: replaced + register: result + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ replaced['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - replaced['after'] == result['after'] + + - name: Assert that before dicts are correctly generated + assert: + that: + - merged['after'] == result['before'] + + - name: Replace device configurations of listed OSPF processes with provided configurarions + (IDEMPOTENT) + register: result + cisco.nxos.nxos_bgp_global: *id002 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - replaced['after'] == result['before'] + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced_af.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced_af.yaml new file mode 100644 index 00000000..da51a8ac --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/tests/common/replaced_af.yaml @@ -0,0 +1,158 @@ +--- +- debug: + msg: Start nxos_bgp_global replaced_af integration tests connection={{ ansible_connection}} + +- name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: &remove + lines: + - no router bgp 65536 + ignore_errors: True + +- name: "Setup - 1 (Add neighbor with AF config)" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "log-neighbor-changes" + - "maxas-limit 20" + - "router-id 198.51.100.2" + - "neighbor 203.0.113.2" + - " address-family ipv4 unicast" + - " next-hop-self" + - " remote-as 65538" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + - "neighbor 192.0.2.1" + - " remote-as 65537" + - " password 7 12090404011C03162E" + +- block: + - name: Remove a neighbor having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + state: replaced + register: result + ignore_errors: True + + - name: Assert that the task failed + assert: + that: + - result.failed == True + - "'Neighbor 203.0.113.2 has address-family configurations. Please use the nxos_bgp_neighbor_af module to remove those first.' in result.msg" + + - name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: *remove + ignore_errors: True + + - name: "Setup - 2 (Add neighbor with AF config under a VRF)" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "log-neighbor-changes" + - "maxas-limit 20" + - "router-id 198.51.100.2" + - "neighbor 192.0.2.1" + - " remote-as 65537" + - " password 7 12090404011C03162E" + - "vrf site-1" + - " neighbor 203.0.113.2" + - " address-family ipv4 unicast" + - " next-hop-self" + - " remote-as 65538" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + - " neighbor-down fib-accelerate" + + - name: Remove a neighbor under a VRF having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + vrfs: + - vrf: site-1 + neighbor_down: + fib_accelerate: True + state: replaced + register: result + ignore_errors: True + + - name: Assert that the task failed + assert: + that: + - result.failed == True + - "'Neighbor 203.0.113.2 has address-family configurations. Please use the nxos_bgp_neighbor_af module to remove those first.' in result.msg" + + - name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: *remove + ignore_errors: True + + - name: "Setup - 3 (Add a VRF with AF config)" + cisco.nxos.nxos_config: + lines: + - "router bgp 65536" + - "log-neighbor-changes" + - "maxas-limit 20" + - "router-id 198.51.100.2" + - "neighbor 192.0.2.1" + - " remote-as 65537" + - " password 7 12090404011C03162E" + - "vrf site-1" + - " address-family ipv4 unicast" + - " default-information originate" + - " neighbor 203.0.113.2" + - " remote-as 65538" + - " affinity-group 160" + - " description NBR-1" + - " low-memory exempt" + - "vrf site-2" + - " neighbor-down fib-accelerate" + + - name: Remove a VRF having AF configurations (should fail) + cisco.nxos.nxos_bgp_global: + config: + as_number: 65536 + router_id: 198.51.100.2 + maxas_limit: 20 + log_neighbor_changes: True + neighbors: + - neighbor_address: 192.0.2.1 + remote_as: 65537 + password: + encryption: 7 + key: 12090404011C03162E + vrfs: + - vrf: site-2 + neighbor_down: + fib_accelerate: True + state: replaced + register: result + ignore_errors: True + + - name: Assert that the task failed + assert: + that: + - result.failed == True + - "'VRF site-1 has address-family configurations. Please use the nxos_bgp_af module to remove those first.' in result.msg" + + always: + - name: Remove pre-existing BGP configurations + cisco.nxos.nxos_config: *remove diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/vars/main.yml new file mode 100644 index 00000000..463ba3b8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_global/vars/main.yml @@ -0,0 +1,168 @@ +--- +merged: + commands: + - router bgp 65536 + - bestpath as-path multipath-relax + - bestpath compare-neighborid + - bestpath cost-community ignore + - confederation identifier 42 + - log-neighbor-changes + - maxas-limit 20 + - neighbor-down fib-accelerate + - router-id 198.51.100.2 + - confederation peers 65020 65030 65040 + - neighbor 198.51.100.20 + - remote-as 65537 + - affinity-group 160 + - description NBR-1 + - low-memory exempt + - neighbor 198.51.100.21 + - remote-as 65537 + - password 7 12090404011C03162E + - vrf site-1 + - local-as 200 + - log-neighbor-changes + - neighbor 192.0.2.10 + - remote-as 65538 + - description site-1-nbr-1 + - password 3 13D4D3549493D2877B1DC116EE27A6BE + - neighbor 192.0.2.11 + - remote-as 65538 + - description site-1-nbr-2 + - vrf site-2 + - local-as 300 + - log-neighbor-changes + - neighbor-down fib-accelerate + - neighbor 203.0.113.2 + - remote-as 65539 + - description site-2-nbr-1 + - password 3 AF92F4C16A0A0EC5BDF56CF58BC030F6 + + after: + as_number: '65536' + bestpath: + as_path: + multipath_relax: true + compare_neighborid: true + cost_community_ignore: true + confederation: + identifier: '42' + peers: + - '65020' + - '65030' + - '65040' + log_neighbor_changes: true + maxas_limit: 20 + neighbor_down: + fib_accelerate: true + neighbors: + - description: NBR-1 + low_memory: + exempt: true + neighbor_address: 198.51.100.20 + neighbor_affinity_group: + group_id: 160 + remote_as: '65537' + - neighbor_address: 198.51.100.21 + password: + encryption: 7 + key: 12090404011C03162E + remote_as: '65537' + router_id: 198.51.100.2 + vrfs: + - local_as: '200' + log_neighbor_changes: true + neighbors: + - description: site-1-nbr-1 + neighbor_address: 192.0.2.10 + password: + encryption: 3 + key: 13D4D3549493D2877B1DC116EE27A6BE + remote_as: '65538' + - description: site-1-nbr-2 + neighbor_address: 192.0.2.11 + remote_as: '65538' + vrf: site-1 + - local_as: '300' + log_neighbor_changes: true + neighbor_down: + fib_accelerate: true + neighbors: + - description: site-2-nbr-1 + neighbor_address: 203.0.113.2 + password: + encryption: 3 + key: AF92F4C16A0A0EC5BDF56CF58BC030F6 + remote_as: '65539' + vrf: site-2 + +replaced: + commands: + - router bgp 65536 + - no bestpath as-path multipath-relax + - no log-neighbor-changes + - maxas-limit 40 + - no confederation peers 65020 65030 65040 + - confederation peers 65020 65030 65050 + - no neighbor 198.51.100.21 + - vrf site-2 + - neighbor 203.0.113.2 + - no remote-as 65539 + - no description site-2-nbr-1 + - password 7 12090404011C03162E + - no vrf site-1 + + after: + as_number: '65536' + bestpath: + compare_neighborid: true + cost_community_ignore: true + confederation: + identifier: '42' + peers: + - '65020' + - '65030' + - '65050' + maxas_limit: 40 + neighbor_down: + fib_accelerate: true + neighbors: + - description: NBR-1 + low_memory: + exempt: true + neighbor_address: 198.51.100.20 + neighbor_affinity_group: + group_id: 160 + remote_as: '65537' + router_id: 198.51.100.2 + vrfs: + - local_as: '300' + log_neighbor_changes: true + neighbor_down: + fib_accelerate: true + neighbors: + - neighbor_address: 203.0.113.2 + password: + encryption: 7 + key: 12090404011C03162E + vrf: site-2 + +deleted: + commands: + - router bgp 65536 + - no bestpath as-path multipath-relax + - no bestpath compare-neighborid + - no bestpath cost-community ignore + - no confederation identifier 42 + - no log-neighbor-changes + - no maxas-limit 20 + - no neighbor-down fib-accelerate + - no router-id 198.51.100.2 + - no confederation peers 65020 65030 65040 + - no neighbor 198.51.100.20 + - no neighbor 198.51.100.21 + - no vrf site-1 + - no vrf site-2 + + after: + as_number: '65536' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/defaults/main.yaml new file mode 100644 index 00000000..e69126b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/defaults/main.yaml @@ -0,0 +1,5 @@ +--- +testcase: '*' +vrfs: +- default +- myvrf diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/multisite.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/multisite.yaml new file mode 100644 index 00000000..5256646b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/multisite.yaml @@ -0,0 +1,119 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp_neighbor multisite sanity + test" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: 'Setup: Disable features - multisite' + loop: + - bgp + - bfd + - nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- name: 'Setup: Enable features - multisite' + loop: + - bgp + - bfd + - nv overlay + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: enabled + +- name: Enable nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + +- name: Enable multisite border gateway - multisite + ignore_errors: true + register: multiout + cisco.nxos.nxos_config: + lines: + - evpn multisite border-gateway 10 + +- block: + + - name: Configure BGP neighbor1 - multisite + register: result + cisco.nxos.nxos_bgp_neighbor: &id001 + asn: 65535 + neighbor: 192.0.2.3/32 + remote_as: 33.22 + description: just a description + shutdown: true + state: present + peer_type: fabric_border_leaf + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: Configure BGP neighbor2 - multisite + register: result + cisco.nxos.nxos_bgp_neighbor: &id004 + asn: 65535 + neighbor: 192.0.2.3/32 + peer_type: disable + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor: *id004 + + - assert: *id003 + + - name: Configure BGP neighbor3 - multisite + register: result + cisco.nxos.nxos_bgp_neighbor: &id005 + asn: 65535 + neighbor: 192.0.2.3/32 + peer_type: fabric_external + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor: *id005 + + - assert: *id003 + + - name: Disable multisite border gateway - multisite + cisco.nxos.nxos_config: + lines: + - no evpn multisite border-gateway 10 + when: multiout is not search("Invalid command") + +- name: 'Teardown: Disable features' + loop: + - bgp + - bfd + - nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- pause: + seconds: 5 + +- name: Remove nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - no nv overlay evpn + +- debug: msg="END connection={{ ansible_connection }} nxos_bgp_neighbor multisite sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/sanity.yaml new file mode 100644 index 00000000..541f3dc1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor/tests/common/sanity.yaml @@ -0,0 +1,350 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp_neighbor sanity + test" + +- set_fact: intname="{{ nxos_int1 }}" + +- set_fact: log_neighbor_changese="enable" + when: (imagetag and (imagetag is version_compare('D1', 'ne')) and (imagetag is + version_compare('N1', 'ne'))) + +- set_fact: log_neighbor_changesd="disable" + when: (imagetag and (imagetag is version_compare('D1', 'ne')) and (imagetag is + version_compare('N1', 'ne'))) + +- debug: + var: titanium + +- set_fact: remove_private_asa="all" + when: not titanium + +- set_fact: remove_private_asr="replace-as" + when: not titanium + +- name: 'Setup: Disable features' + loop: + - bgp + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- name: 'Setup: Enable features' + loop: + - bgp + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: enabled + +- block: + + - name: Configure BGP neighbor1 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id001 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + connected_check: true + capability_negotiation: true + dynamic_capability: true + ebgp_multihop: 2 + low_memory_exempt: true + maximum_peers: 10 + suppress_4_byte_as: true + timers_keepalive: 90 + timers_holdtime: 270 + log_neighbor_changes: '{{log_neighbor_changese|default(omit)}}' + local_as: 22.33 + remote_as: 33.22 + description: just a description + update_source: '{{ intname.capitalize() }}' + shutdown: true + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure BGP neighbor2 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id003 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + connected_check: false + capability_negotiation: false + dynamic_capability: false + ebgp_multihop: default + low_memory_exempt: false + maximum_peers: default + suppress_4_byte_as: false + timers_keepalive: default + timers_holdtime: default + log_neighbor_changes: '{{log_neighbor_changesd|default(omit)}}' + local_as: default + remote_as: default + description: default + update_source: default + shutdown: false + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id003 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id005 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + state: absent + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id005 + + - assert: *id004 + + - name: Configure BGP neighbor3 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id006 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + description: tested by ansible + remove_private_as: '{{remove_private_asa|default(omit)}}' + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id006 + + - assert: *id004 + + - name: Configure BGP neighbor4 + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id007 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + description: tested by ansible + remove_private_as: '{{remove_private_asr|default(omit)}}' + state: present + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id007 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id005 + + - assert: *id002 + + - name: Configure BGP neighbor 3des password + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id008 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + remote_as: 30 + pwd: 386c0565965f89de + pwd_type: 3des + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id008 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id005 + + - assert: *id002 + + - name: Configure BGP neighbor type 7 password + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id009 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + remote_as: 30 + pwd: 386c0565965f89de + pwd_type: cisco_type_7 + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id009 + + - assert: *id004 + + - name: Remove BGP neighbor password + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id010 + asn: 65535 + neighbor: 192.0.2.3/32 + vrf: '{{ item }}' + remote_as: 30 + pwd: default + pwd_type: default + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id010 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id005 + + - assert: *id002 + + - name: Configure BGP neighbor transport type passive + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id011 + asn: 65535 + neighbor: 192.0.2.3 + vrf: '{{ item }}' + remote_as: 30 + transport_passive_only: true + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id011 + + - assert: *id004 + + - name: Configure BGP neighbor transport type default + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id012 + asn: 65535 + neighbor: 192.0.2.3 + vrf: '{{ item }}' + remote_as: 30 + transport_passive_only: false + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id012 + + - assert: *id004 + + - name: Remove BGP + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: &id013 + asn: 65535 + neighbor: 192.0.2.3 + vrf: '{{ item }}' + state: absent + + - assert: *id002 + + - name: Check Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_bgp_neighbor: *id013 + + - assert: *id004 + + - name: Configure BFD enable + register: result + cisco.nxos.nxos_bgp_neighbor: &id014 + asn: 65535 + neighbor: 192.168.1.1 + bfd: enable + state: present + + - assert: *id002 + + - name: Check BFD enable Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor: *id014 + + - assert: *id004 + + - name: Configure BFD disable Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor: &id015 + asn: 65535 + neighbor: 192.168.1.1 + bfd: disable + state: present + + - assert: *id002 + + - name: Check BFD disable Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor: *id015 + + - assert: *id004 + always: + + - name: 'Teardown: Disable features' + loop: + - bgp + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_bgp_neighbor sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/multisite.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/multisite.yaml new file mode 100644 index 00000000..36e13389 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/multisite.yaml @@ -0,0 +1,116 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp_neighbor_af multisite + sanity test" + +- set_fact: soft_reconfiguration_ina="always" + when: imagetag is not search("D1|N1") + +- name: Disable feature BGP - multisite + ignore_errors: true + cisco.nxos.nxos_feature: &id013 + feature: bgp + state: disabled + +- name: Enable feature BGP - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- name: Enable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: enabled + +- name: Enable nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + +- name: Enable multisite border gateway - multisite + ignore_errors: true + register: multiout + cisco.nxos.nxos_config: + lines: + - evpn multisite border-gateway 10 + +- block: + + - name: Configure eBGP - multisite + cisco.nxos.nxos_bgp_neighbor: + asn: 65535 + neighbor: 192.0.2.3 + remote_as: 2 + + - name: Configure BGP neighbor - multisite + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id001 + asn: 65535 + neighbor: 192.0.2.3 + afi: l2vpn + safi: evpn + send_community: standard + rewrite_evpn_rt_asn: true + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: Configure BGP neighbor 1 - multisite + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id004 + asn: 65535 + neighbor: 192.0.2.3 + afi: l2vpn + safi: evpn + send_community: standard + rewrite_evpn_rt_asn: false + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id004 + + - assert: *id003 + + - name: Disable multisite border gateway - multisite + cisco.nxos.nxos_config: + lines: + - no evpn multisite border-gateway 10 + when: multiout is not search("Invalid command") + +- name: Disable feature bgp - multisite + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- name: Disable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: disabled + +- pause: + seconds: 5 + +- name: Remove nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - no nv overlay evpn + +- debug: msg="END connection={{ ansible_connection }} nxos_bgp_neighbor_af multisite + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/sanity.yaml new file mode 100644 index 00000000..51e6bc92 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_bgp_neighbor_af/tests/common/sanity.yaml @@ -0,0 +1,295 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_bgp_neighbor_af sanity + test" + +- set_fact: soft_reconfiguration_ina="always" + when: imagetag is not search("D1|N1") + +- name: Disable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: &id013 + feature: bgp + state: disabled + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- block: + + - name: Configure BGP neighbor address-family + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id001 + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + additional_paths_receive: enable + additional_paths_send: enable + advertise_map_exist: + - ansible_rm + - my_exist_map + allowas_in: true + default_originate: true + disable_peer_as_check: true + filter_list_in: my_filter_list_in + filter_list_out: my_filter_list_out + max_prefix_limit: 100 + max_prefix_threshold: 50 + max_prefix_warning: 'true' + next_hop_self: true + next_hop_third_party: false + prefix_list_in: pfx_in + prefix_list_out: pfx_out + send_community: both + soft_reconfiguration_in: enable + suppress_inactive: true + unsuppress_map: unsup_map + weight: '30' + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure BGP neighbor address-family def1 + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id003 + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + additional_paths_receive: inherit + additional_paths_send: inherit + advertise_map_exist: default + allowas_in: false + default_originate: false + disable_peer_as_check: false + filter_list_in: default + filter_list_out: default + max_prefix_limit: default + max_prefix_threshold: default + max_prefix_warning: false + next_hop_self: false + next_hop_third_party: false + prefix_list_in: default + prefix_list_out: default + send_community: none + soft_reconfiguration_in: inherit + suppress_inactive: false + unsuppress_map: default + weight: default + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id003 + + - assert: *id004 + + - name: 'Setup: Remove BGP config' + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id005 + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id005 + + - assert: *id004 + + - name: Configure BGP neighbor address-family + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id006 + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + allowas_in_max: '5' + advertise_map_non_exist: + - ansible_rm + - my_non_exist_map + default_originate_route_map: my_route_map + max_prefix_limit: 100 + max_prefix_interval: 30 + max_prefix_threshold: 50 + route_map_in: rm_in + route_map_out: rm_out + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id006 + + - assert: *id004 + + - name: Configure BGP neighbor address-family def2 + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id007 + asn: 65535 + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + allowas_in_max: default + advertise_map_non_exist: default + default_originate_route_map: default + max_prefix_limit: default + max_prefix_interval: default + max_prefix_threshold: default + route_map_in: default + route_map_out: default + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id007 + + - assert: *id004 + + - name: 'Setup: Remove BGP config' + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id005 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id005 + + - assert: *id004 + + - name: Configure eBGP + cisco.nxos.nxos_bgp_neighbor: + asn: 65535 + vrf: blue + neighbor: 192.0.2.3 + remote_as: 2 + + - name: Configure BGP neighbor 3 + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id008 + asn: 65535 + vrf: blue + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + additional_paths_receive: disable + additional_paths_send: disable + as_override: 'true' + send_community: standard + soft_reconfiguration_in: '{{soft_reconfiguration_ina|default(omit)}}' + soo: "3:3" + next_hop_third_party: true + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id008 + + - assert: *id004 + + - name: Configure BGP neighbor def3 + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id009 + asn: 65535 + vrf: blue + neighbor: 192.0.2.3 + afi: ipv4 + safi: unicast + additional_paths_receive: inherit + additional_paths_send: inherit + as_override: false + send_community: default + soo: default + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id009 + + - assert: *id004 + + - name: 'Setup: Remove BGP config' + register: result + cisco.nxos.nxos_bgp: &id012 + asn: 65535 + state: absent + + - assert: *id002 + + - name: Configure BGP neighbor af route_reflector_client + cisco.nxos.nxos_bgp_neighbor: + asn: 65535 + neighbor: 192.0.2.2 + remote_as: 65535 + + - name: Configure BGP neighbor 4 + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id010 + asn: 65535 + neighbor: 192.0.2.2 + afi: ipv4 + safi: unicast + route_reflector_client: 'true' + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id010 + + - assert: *id004 + + - name: Configure BGP neighbor def4 + register: result + cisco.nxos.nxos_bgp_neighbor_af: &id011 + asn: 65535 + neighbor: 192.0.2.2 + afi: ipv4 + safi: unicast + route_reflector_client: false + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_bgp_neighbor_af: *id011 + + - assert: *id004 + always: + + - name: Cleanup BGP + ignore_errors: true + cisco.nxos.nxos_bgp: *id012 + + - name: Disable feature bgp + cisco.nxos.nxos_feature: *id013 + + - debug: msg="END connection={{ ansible_connection }} nxos_bgp_neighbor_af sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/defaults/main.yaml new file mode 100644 index 00000000..a845c24b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: '*' +test_items: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/cli_command.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/cli_command.yaml new file mode 100644 index 00000000..ecff9e6b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/cli_command.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START cli/cli_command.yaml on connection={{ ansible_connection }} + +- name: get output for single command + register: result + ansible.netcommon.cli_command: + command: show version + +- assert: + that: + - result.changed == false + - result.stdout is defined + +- name: send invalid command + register: result + ignore_errors: true + ansible.netcommon.cli_command: + command: show foo + +- assert: + that: + - result.failed == true + - result.msg is defined + +- debug: msg="END cli/cli_command.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/contains.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/contains.yaml new file mode 100644 index 00000000..c031f854 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/contains.yaml @@ -0,0 +1,18 @@ +--- +- debug: msg="START common/contains.yaml on connection={{ ansible_connection }}" + +- name: test contains operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[0] contains NX-OS + - result[1].TABLE_interface.ROW_interface.interface contains mgmt + +- assert: + that: + - result.changed == false + +- debug: msg="END common/contains.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/sanity.yaml new file mode 100644 index 00000000..3d2555a4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/cli/sanity.yaml @@ -0,0 +1,67 @@ +--- +- debug: msg="START cli/sanity.yaml on connection={{ ansible_connection }}" + +- name: Disable feature BGP + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- block: + + - name: Run show running-config bgp - should fail + ignore_errors: true + register: result + cisco.nxos.nxos_command: + commands: + - sh running-config bgp + + - assert: &id001 + that: + - result.failed == true + + - name: Enable feature BGP + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + + - name: Configure BGP defaults + register: result + cisco.nxos.nxos_bgp: + asn: 65535 + router_id: 192.0.2.1 + state: present + + - assert: + that: + - result.changed == true + + - name: Run show running-config bgp - should pass + register: result + cisco.nxos.nxos_command: + commands: + - sh running-config bgp + + - assert: + that: + - result.failed == false + - "'65535' in result.stdout[0]" + + - name: Run an invalid command - should fail + ignore_errors: true + register: result + cisco.nxos.nxos_command: + commands: + - show interface bief + + - assert: *id001 + rescue: + + - debug: msg="nxos_command sanity test failure detected" + always: + + - name: Disable feature bgp + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- debug: msg="END cli/sanity.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/bad_operator.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/bad_operator.yaml new file mode 100644 index 00000000..d5fa92bd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/bad_operator.yaml @@ -0,0 +1,20 @@ +--- +- debug: msg="START common/bad_operator.yaml on connection={{ ansible_connection + }}" + +- name: test bad operator + register: result + ignore_errors: true + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.state foo up + +- assert: + that: + - result.failed == true + - result.msg is defined + +- debug: msg="END common/bad_operator.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/equal.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/equal.yaml new file mode 100644 index 00000000..bd46e51a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/equal.yaml @@ -0,0 +1,30 @@ +--- +- debug: msg="START common/equal.yaml on connection={{ ansible_connection }}" + +- name: test eq operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.state eq up + +- assert: + that: + - result.changed == false + +- name: test == operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.state == up + +- assert: + that: + - result.changed == false + +- debug: msg="END common/equal.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthan.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthan.yaml new file mode 100644 index 00000000..bc080bd3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthan.yaml @@ -0,0 +1,31 @@ +--- +- debug: msg="START common/greaterthan.yaml on connection={{ ansible_connection + }}" + +- name: test gt operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask gt 0 + +- assert: + that: + - result.changed == false + +- name: test > operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask > 0 + +- assert: + that: + - result.changed == false + +- debug: msg="END common/greaterthan.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthanorequal.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthanorequal.yaml new file mode 100644 index 00000000..0a1fc6b7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/greaterthanorequal.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START common/greaterthanorequal.yaml on connection={{ ansible_connection + }}" + +- name: test ge operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask ge 0 + +- assert: + that: + - result.changed == false + +- name: test >= operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask >= 0 + +- assert: + that: + - result.changed == false + +- debug: msg="END common/greaterthanorequal.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/invalid.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/invalid.yaml new file mode 100644 index 00000000..23efe712 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/invalid.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START common/invalid.yaml on connection={{ ansible_connection }}" + +- name: run invalid command + register: result + ignore_errors: true + cisco.nxos.nxos_command: + commands: + - show foo + +- assert: + that: + - result.failed == true + +- name: run commands that include invalid command + register: result + ignore_errors: true + cisco.nxos.nxos_command: + commands: + - show version + - show foo + +- assert: + that: + - result.failed == true + +- debug: msg="END common/invalid.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthan.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthan.yaml new file mode 100644 index 00000000..616cca27 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthan.yaml @@ -0,0 +1,30 @@ +--- +- debug: msg="START common/lessthan.yaml on connection={{ ansible_connection }}" + +- name: test lt operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask lt 33 + +- assert: + that: + - result.changed == false + +- name: test < operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask lt 33 + +- assert: + that: + - result.changed == false + +- debug: msg="END common/lessthan.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthanorequal.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthanorequal.yaml new file mode 100644 index 00000000..426384d1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/lessthanorequal.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START common/lessthanorequal.yaml on connection={{ ansible_connection + }}" + +- name: test le operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask le 32 + +- assert: + that: + - result.changed == false + +- name: test <= operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.eth_ip_mask <= 32 + +- assert: + that: + - result.changed == false + +- debug: msg="END common/lessthanorequal.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/not_comparison_operator.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/not_comparison_operator.yaml new file mode 100644 index 00000000..b97be495 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/not_comparison_operator.yaml @@ -0,0 +1,20 @@ +--- +- debug: msg="START common/not_comparison_operator.yaml on connection={{ ansible_connection + }}" + +- name: test 'not' keyword in wait_for + register: result + cisco.nxos.nxos_command: + commands: + - show version + wait_for: + - result[0] not contains QWERTYQWERTYQWERTY + - result[0] == not QWERTYQWERTYQWERTY + - result[0] matches not QWERTYQWERTYQWERTY + +- assert: + that: + - result.changed == false + +- debug: msg="END common/not_comparison_operator.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/notequal.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/notequal.yaml new file mode 100644 index 00000000..cd6da5d9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/notequal.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START common/notequal.yaml on connection={{ ansible_connection }}" + +- name: test neq operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.state neq down + +- assert: + that: + - result.changed == false + - result.stdout is defined + +- name: test != operator + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface mgmt0 | json + wait_for: + - result[1].TABLE_interface.ROW_interface.state != down + +- assert: + that: + - result.changed == false + - result.stdout is defined + +- debug: msg="END common/notequal.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/output.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/output.yaml new file mode 100644 index 00000000..1d662070 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/output.yaml @@ -0,0 +1,25 @@ +--- +- debug: msg="START common/output.yaml on connection={{ ansible_connection }}" + +- name: get output for single command + register: result + cisco.nxos.nxos_command: + commands: + - show version + +- assert: + that: + - result.changed == false + +- name: get output for multiple commands + register: result + cisco.nxos.nxos_command: + commands: + - show version + - show interface + +- assert: + that: + - result.changed == false + +- debug: msg="END common/output.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/timeout.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/timeout.yaml new file mode 100644 index 00000000..63c601a4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/common/timeout.yaml @@ -0,0 +1,18 @@ +--- +- debug: msg="START common/timeout.yaml on connection={{ ansible_connection }}" + +- name: test bad condition + register: result + ignore_errors: true + cisco.nxos.nxos_command: + commands: + - show version + wait_for: + - result[0] contains bad_value_string + +- assert: + that: + - result.failed == true + - result.msg is defined + +- debug: msg="END common/timeout.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/contains.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/contains.yaml new file mode 100644 index 00000000..4bde6dee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/contains.yaml @@ -0,0 +1,22 @@ +--- +- debug: msg="START common/contains.yaml on connection={{ ansible_connection }}" + +- name: test contains operator + register: result + cisco.nxos.nxos_command: + commands: + + - command: show version + output: text + + - command: show interface mgmt0 + output: json + wait_for: + - result[0] contains NX-OS + - result[1].TABLE_interface.ROW_interface.interface contains mgmt + +- assert: + that: + - result.changed == false + +- debug: msg="END common/contains.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/sanity.yaml new file mode 100644 index 00000000..34a6655d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_command/tests/nxapi/sanity.yaml @@ -0,0 +1,67 @@ +--- +- debug: msg="START nxapi/sanity.yaml on connection={{ ansible_connection }}" + +- name: Disable feature BGP + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- block: + + - name: Run show running-config bgp - should fail + ignore_errors: true + register: result + cisco.nxos.nxos_command: + commands: + - sh running-config bgp + + - assert: &id001 + that: + - result.failed == true + + - name: Enable feature BGP + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + + - name: Configure BGP defaults + register: result + cisco.nxos.nxos_bgp: + asn: 65535 + router_id: 192.0.2.1 + state: present + + - assert: + that: + - result.changed == true + + - name: Run show running-config bgp - should pass + register: result + cisco.nxos.nxos_command: + commands: + - sh running-config bgp + + - assert: + that: + - result.failed == false + - "'65535' in result.stdout[0]|to_json" + + - name: Run an invalid command - should fail + ignore_errors: true + register: result + cisco.nxos.nxos_command: + commands: + - show interface bief + + - assert: *id001 + rescue: + + - debug: msg="nxos_command sanity test failure detected" + always: + + - name: Disable feature bgp + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- debug: msg="END nxapi/sanity.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/defaults/main.yaml new file mode 100644 index 00000000..a845c24b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: '*' +test_items: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli_config.yaml new file mode 100644 index 00000000..98bd1fce --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/cli_config.yaml @@ -0,0 +1,16 @@ +--- +- name: collect all cli_config test cases + find: + paths: '{{ role_path }}/tests/cli_config' + patterns: '{{ testcase }}.yaml' + register: test_cases + delegate_to: localhost + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test case (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/main.yaml new file mode 100644 index 00000000..8fa8524c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/main.yaml @@ -0,0 +1,24 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + + - include: nxapi.yaml + tags: + - nxapi + + - include: cli_config.yaml + tags: + - cli_config + + - include: redirection.yaml + when: ansible_version.full is version('2.10.0', '>=') + always: + + - name: Change hostname back to {{ inventory_hostname_short }} + cisco.nxos.nxos_config: + lines: + - hostname {{ inventory_hostname_short }} + match: none diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/redirection.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/redirection.yaml new file mode 100644 index 00000000..5564a3ea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tasks/redirection.yaml @@ -0,0 +1,16 @@ +--- +- name: collect all redirection cli test cases + find: + paths: '{{ role_path }}/tests/redirection/cli' + patterns: '{{ testcase }}.yaml' + register: shortname_test_cases + delegate_to: localhost + +- name: set test_items for redirection + set_fact: test_items="{{ shortname_test_cases.files | map(attribute='path') | list }}" + +- name: run test case (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/base_running_config b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/base_running_config new file mode 100644 index 00000000..563371d9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/base_running_config @@ -0,0 +1,10 @@ +version 7.0(3)I6(1) +hostname an-nxos9k-02.ansible.com +vdc an-nxos9k-02 id 1 + limit-resource vlan minimum 16 maximum 4094 + limit-resource vrf minimum 2 maximum 4096 + limit-resource port-channel minimum 0 maximum 511 + limit-resource u4route-mem minimum 96 maximum 96 + limit-resource u6route-mem minimum 24 maximum 24 + limit-resource m4route-mem minimum 58 maximum 58 + limit-resource m6route-mem minimum 8 maximum 8 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/config.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/config.j2 new file mode 100644 index 00000000..5c79ec8c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/config.j2 @@ -0,0 +1,4 @@ +interface loopback1 + description this is a test + shutdown + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configblock.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configblock.j2 new file mode 100644 index 00000000..ec03c24a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configblock.j2 @@ -0,0 +1,5 @@ +ip access-list test + 10 permit ip 192.0.2.1/32 any log + 20 permit ip 192.0.2.2/32 any log + 30 permit ip 192.0.2.3/32 any log + 40 permit ip 192.0.2.4/32 any log diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact1.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact1.j2 new file mode 100644 index 00000000..ec03c24a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact1.j2 @@ -0,0 +1,5 @@ +ip access-list test + 10 permit ip 192.0.2.1/32 any log + 20 permit ip 192.0.2.2/32 any log + 30 permit ip 192.0.2.3/32 any log + 40 permit ip 192.0.2.4/32 any log diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact2.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact2.j2 new file mode 100644 index 00000000..3fc6800d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configexact2.j2 @@ -0,0 +1,6 @@ +ip access-list test + 10 permit ip 192.0.2.1/32 any log + 20 permit ip 192.0.2.2/32 any log + 30 permit ip 192.0.2.3/32 any log + 40 permit ip 192.0.2.4/32 any log + 50 permit ip 192.0.2.5/32 any log diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configstrict1.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configstrict1.j2 new file mode 100644 index 00000000..1e7e6f44 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/configstrict1.j2 @@ -0,0 +1,6 @@ +no ip access-list test +ip access-list test + 10 permit ip 192.0.2.1/32 any log + 20 permit ip 192.0.2.2/32 any log + 30 permit ip 192.0.2.3/32 any log + 40 permit ip 192.0.2.4/32 any log diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/intended_running_config b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/intended_running_config new file mode 100644 index 00000000..ab96584b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/intended_running_config @@ -0,0 +1,10 @@ +version 7.0(3)I6(1) +hostname an-nxos9k-01.ansible.com +vdc an-nxos9k-01 id 1 + limit-resource vlan minimum 16 maximum 4094 + limit-resource vrf minimum 2 maximum 4096 + limit-resource port-channel minimum 0 maximum 511 + limit-resource u4route-mem minimum 96 maximum 96 + limit-resource u6route-mem minimum 24 maximum 24 + limit-resource m4route-mem minimum 58 maximum 58 + limit-resource m6route-mem minimum 8 maximum 8 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupexact.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupexact.j2 new file mode 100644 index 00000000..815e003c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupexact.j2 @@ -0,0 +1,7 @@ +no ip access-list test +ip access-list test + 10 permit ip 192.0.2.1/32 any log + 20 permit ip 192.0.2.2/32 any log + 30 permit ip 192.0.2.3/32 any log + 40 permit ip 192.0.2.4/32 any log + 50 permit ip 192.0.2.5/32 any log diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupstrict.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupstrict.j2 new file mode 100644 index 00000000..815e003c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/basic/setupstrict.j2 @@ -0,0 +1,7 @@ +no ip access-list test +ip access-list test + 10 permit ip 192.0.2.1/32 any log + 20 permit ip 192.0.2.2/32 any log + 30 permit ip 192.0.2.3/32 any log + 40 permit ip 192.0.2.4/32 any log + 50 permit ip 192.0.2.5/32 any log diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/config.js b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/config.js new file mode 100644 index 00000000..d2ec0c0c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/config.js @@ -0,0 +1,4 @@ +interface Ethernet2/5 + description test description from ansible + shutdown + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/config.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/config.j2 new file mode 100644 index 00000000..df0cac70 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/config.j2 @@ -0,0 +1,4 @@ +interface Ethernet2/5 + description this is a test + no shutdown + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/test.j2 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/test.j2 new file mode 100644 index 00000000..9705ee14 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/templates/defaults/test.j2 @@ -0,0 +1,4 @@ +interface Ethernet2/5 + description this is a test + shutdown + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/diff.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/diff.yaml new file mode 100644 index 00000000..b9292e16 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/diff.yaml @@ -0,0 +1,36 @@ +--- +- debug: msg="START cli/diff.yaml on connection={{ ansible_connection }}" + +- name: setup hostname + cisco.nxos.nxos_config: + lines: hostname switch + +- name: nxos_config diff against retrieved config + diff: true + register: result + cisco.nxos.nxos_config: + diff_against: intended + intended_config: "{{ lookup('file', '{{ role_path }}/templates/basic/intended_running_config')\ + \ }}" + +- assert: + that: + - "'hostname an-nxos9k-01.ansible.com' in result['diff']['after']" + - "'hostname switch' in result['diff']['before']" + +- name: nxos_config diff against provided running_config + diff: true + register: result + cisco.nxos.nxos_config: + diff_against: intended + intended_config: "{{ lookup('file', '{{ role_path }}/templates/basic/intended_running_config')\ + \ }}" + running_config: "{{ lookup('file', '{{ role_path }}/templates/basic/base_running_config')\ + \ }}" + +- assert: + that: + - "'hostname an-nxos9k-01.ansible.com' in result['diff']['after']" + - "'hostname an-nxos9k-02.ansible.com' in result['diff']['before']" + +- debug: msg="END cli/diff.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/multilevel.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/multilevel.yaml new file mode 100644 index 00000000..2754f6a3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/multilevel.yaml @@ -0,0 +1,52 @@ +--- +- debug: msg="START cli/mulitlevel.yaml" + +- name: get config + register: config + cisco.nxos.nxos_command: + commands: show running-config + +- name: enable feature bgp + when: "'feature bgp' not in config.stdout[0]" + cisco.nxos.nxos_config: + lines: feature bgp + +- name: remove bgp + when: "'router bgp 1' in config.stdout[0]" + cisco.nxos.nxos_config: + lines: no router bgp 1 + +- name: configure multi level command + register: result + cisco.nxos.nxos_config: + lines: maximum-paths 14 + parents: + - router bgp 1 + - address-family ipv4 unicast + +- assert: + that: + - result.changed == true + - "'router bgp 1' in result.updates" + - "'address-family ipv4 unicast' in result.updates" + - "'maximum-paths 14' in result.updates" + +- name: check multi level command + register: result + cisco.nxos.nxos_config: + lines: maximum-paths 14 + parents: + - router bgp 1 + - address-family ipv4 unicast + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: + - no feature bgp + match: none + +- debug: msg="END cli/mulitlevel.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel.yaml new file mode 100644 index 00000000..3ea0dd91 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel.yaml @@ -0,0 +1,36 @@ +--- +- debug: msg='START cli/sublevel.yaml' + +- name: setup + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- name: configure sub level command + register: result + cisco.nxos.nxos_config: + lines: 10 permit ip any any log + parents: ip access-list test + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip any any log' in result.updates" + +- name: configure sub level command idempotent check + register: result + cisco.nxos.nxos_config: + lines: 10 permit ip any any log + parents: ip access-list test + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- debug: msg='END cli/sublevel.yaml' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_exact.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_exact.yaml new file mode 100644 index 00000000..95aef28b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_exact.yaml @@ -0,0 +1,58 @@ +--- +- debug: msg='START cli/sublevel_exact.yaml' + +- name: setup + cisco.nxos.nxos_config: + commands: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + before: no ip access-list test + match: none + +- name: configure sub level command using exact match + register: result + cisco.nxos.nxos_config: + commands: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + match: exact + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip 192.0.2.1/32 any log' in result.updates" + - "'20 permit ip 192.0.2.2/32 any log' in result.updates" + - "'30 permit ip 192.0.2.3/32 any log' in result.updates" + - "'40 permit ip 192.0.2.4/32 any log' in result.updates" + - "'50 permit ip 192.0.2.5/32 any log' not in result.updates" + +- name: check sub level command using exact match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + match: exact + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- debug: msg='END cli/sublevel_exact.yaml' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_strict.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_strict.yaml new file mode 100644 index 00000000..0a2e3201 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/sublevel_strict.yaml @@ -0,0 +1,59 @@ +--- +- debug: msg='START cli/sublevel_strict.yaml' + +- name: setup + cisco.nxos.nxos_config: + commands: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + before: no ip access-list test + match: none + +- name: configure sub level command using strict match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + before: no ip access-list test + match: strict + replace: block + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip 192.0.2.1/32 any log' in result.updates" + - "'20 permit ip 192.0.2.2/32 any log' in result.updates" + - "'30 permit ip 192.0.2.3/32 any log' in result.updates" + - "'40 permit ip 192.0.2.4/32 any log' in result.updates" + - "'50 permit ip 192.0.2.5/32 any log' not in result.updates" + +- name: check sub level command using strict match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + match: strict + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + commands: no ip access-list test + match: none + +- debug: msg='END cli/sublevel_strict.yaml' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_after.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_after.yaml new file mode 100644 index 00000000..1f0d4814 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_after.yaml @@ -0,0 +1,40 @@ +--- +- debug: msg='START cli/toplevel_after.yaml' + +- name: setup + cisco.nxos.nxos_config: + lines: + - snmp-server contact ansible + - hostname switch + match: none + +- name: configure top level command with before + register: result + cisco.nxos.nxos_config: + lines: hostname foo + after: snmp-server contact bar + +- assert: + that: + - result.changed == true + - "'hostname foo' in result.updates" + - "'snmp-server contact bar' in result.updates" + +- name: configure top level command with before idempotent check + register: result + cisco.nxos.nxos_config: + lines: hostname foo + after: snmp-server contact foo + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: + - no snmp-server contact + - hostname switch + match: none + +- debug: msg='END cli/toplevel_after.yaml' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_before.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_before.yaml new file mode 100644 index 00000000..caf09c31 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli/toplevel_before.yaml @@ -0,0 +1,40 @@ +--- +- debug: msg='START cli/toplevel_before.yaml' + +- name: setup + cisco.nxos.nxos_config: + lines: + - snmp-server contact ansible + - hostname switch + match: none + +- name: configure top level command with before + register: result + cisco.nxos.nxos_config: + lines: hostname foo + before: snmp-server contact bar + +- assert: + that: + - result.changed == true + - "'hostname foo' in result.updates" + - "'snmp-server contact bar' in result.updates" + +- name: configure top level command with before idempotent check + register: result + cisco.nxos.nxos_config: + lines: hostname foo + before: snmp-server contact foo + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: + - no snmp-server contact + - hostname switch + match: none + +- debug: msg='END cli/toplevel_before.yaml' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_backup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_backup.yaml new file mode 100644 index 00000000..3880a040 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_backup.yaml @@ -0,0 +1,114 @@ +--- +- debug: msg="END cli_config/backup.yaml on connection={{ ansible_connection }}" + +- name: delete configurable backup file path + file: + path: '{{ item }}' + state: absent + with_items: + - '{{ role_path }}/backup_test_dir/' + - '{{ role_path }}/backup/backup.cfg' + +- name: collect any backup files + find: + paths: '{{ role_path }}/backup' + pattern: '{{ inventory_hostname_short }}_config*' + register: backup_files + connection: local + +- name: delete backup files + file: + path: '{{ item.path }}' + state: absent + with_items: '{{backup_files.files|default([])}}' + +- name: take config backup + become: true + register: result + ansible.netcommon.cli_config: + backup: true + +- assert: + that: + - result.changed == true + +- name: collect any backup files + find: + paths: '{{ role_path }}/backup' + pattern: '{{ inventory_hostname_short }}_config*' + register: backup_files + connection: local + +- assert: + that: + - backup_files.files is defined + +- name: take configuration backup in custom filename and directory path + become: true + register: result + ansible.netcommon.cli_config: + backup: true + backup_options: + filename: backup.cfg + dir_path: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + +- assert: + that: + - result.changed == true + +- name: check if the backup file-1 exist + find: + paths: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}/backup.cfg' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- name: take configuration backup in custom filename + become: true + register: result + ansible.netcommon.cli_config: + backup: true + backup_options: + filename: backup.cfg + +- assert: + that: + - result.changed == true + +- name: check if the backup file-2 exist + find: + paths: '{{ role_path }}/backup/backup.cfg' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- name: take configuration backup in custom path and default filename + become: true + register: result + ansible.netcommon.cli_config: + backup: true + backup_options: + dir_path: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + +- assert: + that: + - result.changed == true + +- name: check if the backup file-3 exist + find: + paths: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + pattern: '{{ inventory_hostname_short }}_config*' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- debug: msg="END cli_config/backup.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_basic.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_basic.yaml new file mode 100644 index 00000000..de30c90f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_basic.yaml @@ -0,0 +1,44 @@ +--- +- debug: msg="START cli_config/cli_basic.yaml on connection={{ ansible_connection + }}" + +- name: setup + ansible.netcommon.cli_config: &id002 + config: "interface loopback1\nno description\nno shutdown\n" + diff_match: none + +- name: configure device with config + register: result + ansible.netcommon.cli_config: &id001 + config: "{{ lookup('template', 'basic/config.j2') }}" + +- assert: + that: + - result.changed == true + +- name: Idempotence + register: result + ansible.netcommon.cli_config: *id001 + +- assert: + that: + - result.changed == false + +- name: remove config + ansible.netcommon.cli_config: *id002 + +- name: configure device with config + register: result + ansible.netcommon.cli_config: + config: "{{ lookup('template', 'basic/config.j2') }}" + defaults: true + +- assert: + that: + - result.changed == true + +- name: teardown + ansible.netcommon.cli_config: *id002 + +- debug: msg="END cli_config/cli_basic.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_block_replace.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_block_replace.yaml new file mode 100644 index 00000000..9eaeb09d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_block_replace.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START cli_config/cli_block_replace.yaml on connection={{ ansible_connection + }}" + +- name: setup - remove configuration + ansible.netcommon.cli_config: &id002 + config: no ip access-list test + diff_match: none + +- name: block replace + register: result + ansible.netcommon.cli_config: &id001 + config: "{{ lookup('template', 'basic/configblock.j2') }}" + diff_replace: block + +- assert: + that: + - result.changed == true + +- name: block replace (Idempotence) + register: result + ansible.netcommon.cli_config: *id001 + +- assert: + that: + - result.changed == false + +- name: teardown + ansible.netcommon.cli_config: *id002 + +- debug: msg="END cli_config/cli_block_replace.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_exact_match.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_exact_match.yaml new file mode 100644 index 00000000..1d347376 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_exact_match.yaml @@ -0,0 +1,35 @@ +--- +- debug: msg="START cli_config/cli_exact_match.yaml on connection={{ ansible_connection + }}" + +- name: setup - remove configuration + ansible.netcommon.cli_config: + config: "{{ lookup('template', 'basic/setupexact.j2') }}" + diff_match: none + +- name: configure using exact match + register: result + ansible.netcommon.cli_config: + config: "{{ lookup('template', 'basic/configexact1.j2') }}" + diff_match: exact + +- assert: + that: + - result.changed == true + +- name: check using exact match + register: result + ansible.netcommon.cli_config: + config: "{{ lookup('template', 'basic/configexact2.j2') }}" + +- assert: + that: + - result.changed == false + +- name: teardown + ansible.netcommon.cli_config: + config: no ip access-list test + diff_match: none + +- debug: msg="END cli_config/cli_exact_match.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_strict_match.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_strict_match.yaml new file mode 100644 index 00000000..a593685d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/cli_config/cli_strict_match.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START cli_config/cli_strict_match.yaml on connection={{ ansible_connection + }}" + +- name: setup - remove configuration + ansible.netcommon.cli_config: + config: "{{ lookup('template', 'basic/setupstrict.j2') }}" + diff_match: none + +- name: configure using strict match + register: result + ansible.netcommon.cli_config: + config: "{{ lookup('template', 'basic/configstrict1.j2') }}" + diff_match: strict + diff_replace: block + +- assert: + that: + - result.changed == true + +- name: teardown + ansible.netcommon.cli_config: + config: no ip access-list test + diff_match: none + +- debug: msg="END cli_config/cli_strict_match.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/backup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/backup.yaml new file mode 100644 index 00000000..3b69dfb4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/backup.yaml @@ -0,0 +1,125 @@ +--- +- debug: msg="START common/backup.yaml on connection={{ ansible_connection }}" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: setup + cisco.nxos.nxos_config: + commands: + - no description + - no shutdown + parents: + - interface {{ intname }} + match: none + +- name: collect any backup files + find: &id001 + paths: '{{ role_path }}/backup' + pattern: '{{ inventory_hostname_short }}_config*' + connection: local + register: backup_files + +- name: delete backup files + file: + path: '{{ item.path }}' + state: absent + with_items: '{{backup_files.files|default([])}}' + +- name: configure device with config + register: result + cisco.nxos.nxos_config: + commands: + - description this is a test + - shutdown + parents: + - interface {{ intname }} + backup: true + +- assert: + that: + - result.changed == true + - result.updates is defined + +- name: collect any backup files + find: *id001 + connection: local + register: backup_files + +- assert: + that: + - backup_files.files is defined + +- name: delete configurable backup file path + file: + path: '{{ item }}' + state: absent + with_items: + - '{{ role_path }}/backup_test_dir/' + - '{{ role_path }}/backup/backup.cfg' + +- name: take configuration backup in custom filename and directory path + register: result + cisco.nxos.nxos_config: + backup: true + backup_options: + filename: backup.cfg + dir_path: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + +- assert: + that: + - result.changed == true + +- name: check if the backup file-1 exist + find: + paths: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}/backup.cfg' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- name: take configuration backup in custom filename + register: result + cisco.nxos.nxos_config: + backup: true + backup_options: + filename: backup.cfg + +- assert: + that: + - result.changed == true + +- name: check if the backup file-2 exist + find: + paths: '{{ role_path }}/backup/backup.cfg' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- name: take configuration backup in custom path and default filename + register: result + cisco.nxos.nxos_config: + backup: true + backup_options: + dir_path: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + +- assert: + that: + - result.changed == true + +- name: check if the backup file-3 exist + find: + paths: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + pattern: '{{ inventory_hostname_short }}_config*' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- debug: msg="END common/backup.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/defaults.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/defaults.yaml new file mode 100644 index 00000000..4496a86e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/defaults.yaml @@ -0,0 +1,49 @@ +--- +- debug: msg="START common/defaults.yaml on connection={{ ansible_connection }}" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: setup + cisco.nxos.nxos_config: + commands: + - no description + - shutdown + parents: + - interface {{ intname }} + match: none + +- name: configure device with defaults included + register: result + cisco.nxos.nxos_config: + commands: + - description this is a test + - no shutdown + parents: + - interface {{ intname }} + defaults: true + +- debug: var=result + +- assert: + that: + - result.changed == true + - result.updates is defined + +- name: check device with defaults included + register: result + cisco.nxos.nxos_config: + commands: + - description this is a test + - no shutdown + parents: + - interface {{ intname }} + defaults: true + +- debug: var=result + +- assert: + that: + - result.changed == false + - result.updates is not defined + +- debug: msg="END common/defaults.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sanity.yaml new file mode 100644 index 00000000..c5864fe9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sanity.yaml @@ -0,0 +1,71 @@ +--- +- debug: msg="START common/sanity.yaml on connection={{ ansible_connection }}" + +- name: setup + cisco.nxos.nxos_config: + lines: ip access-list test + match: none + +- name: nxos_config sanity test + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + before: no ip access-list test + match: exact + +- name: nxos_config sanity test - replace block + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + before: no ip access-list test + replace: block + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- debug: msg='Verify https://github.com/ansible/ansible/issues/50635' + +- name: PUT INTERFACE INTO DEFAULT STATE + cisco.nxos.nxos_config: + lines: + - default interface {{ nxos_int1 }} + +- name: MAKE INTERFACE A SWITCHPORT + cisco.nxos.nxos_config: + lines: + - switchport + parents: interface {{ nxos_int1 }} + +- name: CONFIGURE EDGE TRUNK TYPE + register: result + cisco.nxos.nxos_config: &id001 + lines: + - description foo + - switchport access vlan 3333 + - spanning-tree port type edge + parents: interface {{ nxos_int1 }} + +- assert: + that: + - result.changed == true + +- name: IDEMPOTENCE CHECK + register: result + cisco.nxos.nxos_config: *id001 + +- assert: + that: + - result.changed == false + +- debug: msg="END common/sanity.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/save.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/save.yaml new file mode 100644 index 00000000..cdfe44f9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/save.yaml @@ -0,0 +1,33 @@ +--- +- debug: msg="START common/save.yaml on connection={{ ansible_connection }}" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: setup + cisco.nxos.nxos_config: + commands: + - no description + - no shutdown + parents: + - interface {{ intname }} + match: none + +- name: save config + register: result + cisco.nxos.nxos_config: + save_when: always + +- assert: + that: + - result.changed == true + +- name: save should always run + register: result + cisco.nxos.nxos_config: + save_when: always + +- assert: + that: + - result.changed == true + +- debug: msg="END common/save.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_basic.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_basic.yaml new file mode 100644 index 00000000..48983b7f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_basic.yaml @@ -0,0 +1,36 @@ +--- +- debug: msg="START common/src_basic.yaml on connection={{ ansible_connection }}" + +- set_fact: intname="loopback1" + +- name: setup + cisco.nxos.nxos_config: + commands: + - no description + - no shutdown + parents: + - interface {{ intname }} + match: none + +- name: configure device with config + register: result + cisco.nxos.nxos_config: + src: basic/config.j2 + defaults: true + +- assert: + that: + - result.changed == true + - result.updates is defined + +- name: check device with config + register: result + cisco.nxos.nxos_config: + src: basic/config.j2 + +- assert: + that: + - result.changed == false + - result.updates is not defined + +- debug: msg="END common/src_basic.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_invalid.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_invalid.yaml new file mode 100644 index 00000000..7041be11 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_invalid.yaml @@ -0,0 +1,16 @@ +--- +- debug: msg="START common/src_invalid.yaml on connection={{ ansible_connection + }}" + +- name: configure with invalid src + register: result + ignore_errors: true + cisco.nxos.nxos_config: + src: basic/foobar.j2 + +- assert: + that: + - result.failed == true + - result.msg == 'path specified in src not found' + +- debug: msg="END common/src_invalid.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_match_none.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_match_none.yaml new file mode 100644 index 00000000..84ddc909 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/src_match_none.yaml @@ -0,0 +1,48 @@ +--- +- debug: msg="START common/src_match_none.yaml on connection={{ ansible_connection + }}" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: setup + cisco.nxos.nxos_config: + commands: + - no description + - no shutdown + parents: + - interface {{ intname }} + match: none + +- name: configure device with config + register: result + cisco.nxos.nxos_config: + commands: + - description this is a test + - shutdown + parents: + - interface {{ intname }} + match: none + defaults: true + +- assert: + that: + - result.changed == true + - result.updates is defined + +- name: check device with config + register: result + cisco.nxos.nxos_config: + commands: + - description this is a test + - shutdown + parents: + - interface {{ intname }} + defaults: true + +- assert: + that: + - result.changed == false + - result.updates is not defined + +- debug: msg="END common/src_match_none.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sublevel_block.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sublevel_block.yaml new file mode 100644 index 00000000..e7dcd579 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/sublevel_block.yaml @@ -0,0 +1,50 @@ +--- +- debug: msg='START common/sublevel_block.yaml on connection={{ ansible_connection + }}' + +- name: setup + ignore_errors: true + cisco.nxos.nxos_config: &id001 + lines: no ip access-list test + match: none + +- name: configure sub level command using block replace + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + replace: block + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip 192.0.2.1/32 any log' in result.updates" + - "'20 permit ip 192.0.2.2/32 any log' in result.updates" + - "'30 permit ip 192.0.2.3/32 any log' in result.updates" + - "'40 permit ip 192.0.2.4/32 any log' in result.updates" + +- name: check sub level command using block replace + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + replace: block + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: *id001 + +- debug: msg='END common/sublevel_block.yaml on connection={{ ansible_connection + }}' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel.yaml new file mode 100644 index 00000000..d0ca8d43 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel.yaml @@ -0,0 +1,33 @@ +--- +- debug: msg='START common/toplevel.yaml on connection={{ ansible_connection }}' + +- name: setup + cisco.nxos.nxos_config: + lines: hostname switch + match: none + +- name: configure top level command + register: result + cisco.nxos.nxos_config: + lines: hostname foo + +- assert: + that: + - result.changed == true + - "'hostname foo' in result.updates" + +- name: configure top level command idempotent check + register: result + cisco.nxos.nxos_config: + lines: hostname foo + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: hostname switch + match: none + +- debug: msg='END common/toplevel.yaml on connection={{ ansible_connection }}' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel_nonidempotent.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel_nonidempotent.yaml new file mode 100644 index 00000000..a3d42840 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/common/toplevel_nonidempotent.yaml @@ -0,0 +1,37 @@ +--- +- debug: msg="START common/nonidempotent.yaml on connection={{ ansible_connection + }}" + +- name: setup + cisco.nxos.nxos_config: + lines: hostname switch + match: none + +- name: configure top level command + register: result + cisco.nxos.nxos_config: + lines: hostname foo + match: strict + +- assert: + that: + - result.changed == true + - "'hostname foo' in result.updates" + +- name: configure top level command idempotent check + register: result + cisco.nxos.nxos_config: + lines: hostname foo + match: strict + +- assert: + that: + - result.changed == true + +- name: teardown + cisco.nxos.nxos_config: + lines: hostname switch + match: none + +- debug: msg="END common/nonidempotent.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/multilevel.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/multilevel.yaml new file mode 100644 index 00000000..9cd5059d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/multilevel.yaml @@ -0,0 +1,41 @@ +--- +- debug: msg="START nxapi/mulitlevel.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: feature bgp + match: none + +- name: configure multi level command + register: result + cisco.nxos.nxos_config: + lines: maximum-paths 14 + parents: + - router bgp 1 + - address-family ipv4 unicast + +- assert: + that: + - result.changed == true + - "'router bgp 1' in result.updates" + - "'address-family ipv4 unicast' in result.updates" + - "'maximum-paths 14' in result.updates" + +- name: test multi level command + register: result + cisco.nxos.nxos_config: + lines: maximum-paths 14 + parents: + - router bgp 1 + - address-family ipv4 unicast + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no feature bgp + match: none + +- debug: msg="END nxapi/mulitlevel.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel.yaml new file mode 100644 index 00000000..72836bfd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel.yaml @@ -0,0 +1,37 @@ +--- +- debug: msg="START nxapi/sublevel.yaml" + +- name: setup + ignore_errors: true + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- name: configure sub level command + register: result + cisco.nxos.nxos_config: + lines: 10 permit ip any any log + parents: ip access-list test + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip any any log' in result.updates" + +- name: configure sub level command idempotent check + register: result + cisco.nxos.nxos_config: + lines: 10 permit ip any any log + parents: ip access-list test + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- debug: msg="END nxapi/sublevel.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_exact.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_exact.yaml new file mode 100644 index 00000000..fddce0b6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_exact.yaml @@ -0,0 +1,59 @@ +--- +- debug: msg="START nxapi/sublevel_exact.yaml" + +- name: setup + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + match: none + +- name: configure sub level command using exact match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + before: no ip access-list test + match: exact + replace: block + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip 192.0.2.1/32 any log' in result.updates" + - "'20 permit ip 192.0.2.2/32 any log' in result.updates" + - "'30 permit ip 192.0.2.3/32 any log' in result.updates" + - "'40 permit ip 192.0.2.4/32 any log' in result.updates" + - "'50 permit ip 192.0.2.5/32 any log' not in result.updates" + +- name: check sub level command using exact match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + match: exact + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- debug: msg="END nxapi/sublevel_exact.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_strict.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_strict.yaml new file mode 100644 index 00000000..d04b4b23 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/sublevel_strict.yaml @@ -0,0 +1,58 @@ +--- +- debug: msg="START nxapi/sublevel_strict.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + - 50 permit ip 192.0.2.5/32 any log + parents: ip access-list test + match: none + +- name: configure sub level command using strict match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 30 permit ip 192.0.2.2/32 any log + - 20 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + before: no ip access-list test + match: strict + replace: block + +- assert: + that: + - result.changed == true + - "'ip access-list test' in result.updates" + - "'10 permit ip 192.0.2.1/32 any log' in result.updates" + - "'30 permit ip 192.0.2.2/32 any log' in result.updates" + - "'20 permit ip 192.0.2.3/32 any log' in result.updates" + - "'40 permit ip 192.0.2.4/32 any log' in result.updates" + - "'50 permit ip 192.0.2.5/32 any log' not in result.updates" + +- name: check sub level command using strict match + register: result + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.3/32 any log + - 30 permit ip 192.0.2.2/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + match: strict + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip access-list test + match: none + +- debug: msg="END nxapi/sublevel_strict.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_after.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_after.yaml new file mode 100644 index 00000000..8b9b299c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_after.yaml @@ -0,0 +1,40 @@ +--- +- debug: msg="START nxapi/toplevel_after.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: + - snmp-server contact ansible + - hostname switch + match: none + +- name: configure top level command with before + register: result + cisco.nxos.nxos_config: + lines: hostname foo + after: snmp-server contact bar + +- assert: + that: + - result.changed == true + - "'hostname foo' in result.updates" + - "'snmp-server contact bar' in result.updates" + +- name: configure top level command with before idempotent check + register: result + cisco.nxos.nxos_config: + lines: hostname foo + after: snmp-server contact foo + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: + - no snmp-server contact ansible + - hostname switch + match: none + +- debug: msg="END nxapi/toplevel_after.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_before.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_before.yaml new file mode 100644 index 00000000..733c0ce1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/nxapi/toplevel_before.yaml @@ -0,0 +1,40 @@ +--- +- debug: msg="START nxapi/toplevel_before.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: + - snmp-server contact ansible + - hostname switch + match: none + +- name: configure top level command with before + register: result + cisco.nxos.nxos_config: + lines: hostname foo + before: snmp-server contact bar + +- assert: + that: + - result.changed == true + - "'hostname foo' in result.updates" + - "'snmp-server contact bar' in result.updates" + +- name: configure top level command with before idempotent check + register: result + cisco.nxos.nxos_config: + lines: hostname foo + before: snmp-server contact foo + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: + - no snmp-server contact ansible + - hostname switch + match: none + +- debug: msg="END nxapi/toplevel_before.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/redirection/cli/shortname.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/redirection/cli/shortname.yaml new file mode 100644 index 00000000..f7e80cd5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_config/tests/redirection/cli/shortname.yaml @@ -0,0 +1,37 @@ +--- +- debug: msg="START cli/shortname.yaml on connection={{ ansible_connection }}" + +- name: Use src with module alias + register: result + cisco.nxos.config: + src: basic/config.j2 + +- assert: + that: + # make sure that the template content was read and not the path + - result.changed == true + - result.updates is defined + +- name: use module alias to take configuration backup + register: result + cisco.nxos.config: + backup: true + backup_options: + filename: backup_with_alias.cfg + dir_path: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}' + +- assert: + that: + - result.changed == true + +- name: check if the backup file-4 exist + find: + paths: '{{ role_path }}/backup_test_dir/{{ inventory_hostname_short }}/backup_with_alias.cfg' + register: backup_file + connection: local + +- assert: + that: + - backup_file.files is defined + +- debug: msg="END cli/shortname.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/meta/main.yml new file mode 100644 index 00000000..91da2a75 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/meta/main.yml @@ -0,0 +1,2 @@ +--- +... diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/main.yaml new file mode 100644 index 00000000..d7c416ee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tasks/main.yaml @@ -0,0 +1,18 @@ +--- +- name: Check platform type and skip if not MDS + register: result + cisco.nxos.nxos_command: + commands: show version | grep MDS + +- name: Set skip_test flag to false + set_fact: + skip_test=False + +- name: Set skip_test flag to true if not MDS + set_fact: + skip_test=True + when: result.stdout[0] is not search('MDS') + +- include: cli.yaml + tags: cli + when: not skip_test diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tests/common/sanity.yaml new file mode 100644 index 00000000..5ddb8103 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_devicealias/tests/common/sanity.yaml @@ -0,0 +1,57 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_devicealias sanity + test" + +- name: Setup - Remove device alias if configured + ignore_errors: true + cisco.nxos.nxos_devicealias: &id002 + da: + + - name: ansible_test1_add + remove: true + + - name: ansible_test2_add + remove: true + +- block: + + - name: Configure device alias + register: result + cisco.nxos.nxos_devicealias: &id001 + da: + + - name: ansible_test1_add + pwwn: 57:bb:cc:dd:ee:ff:11:67 + + - name: ansible_test2_add + pwwn: 65:22:21:20:19:18:1a:0d + + - assert: + that: + - result.changed == true + + - assert: + that: + - result.commands == ["terminal dont-ask", "device-alias database", "device-alias + name ansible_test1_add pwwn 57:bb:cc:dd:ee:ff:11:67", "device-alias + name ansible_test2_add pwwn 65:22:21:20:19:18:1a:0d", "device-alias + commit", "no terminal dont-ask"] + + - name: Idempotence Check + register: result + cisco.nxos.nxos_devicealias: *id001 + + - assert: + that: + - result.changed == false + + - assert: + that: + - result.commands == [] + always: + + - name: Remove device alias config + cisco.nxos.nxos_devicealias: *id002 + + - debug: msg="END connection={{ ansible_connection }} nxos_devicealias sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tests/common/sanity.yaml new file mode 100644 index 00000000..966ca6f8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_global/tests/common/sanity.yaml @@ -0,0 +1,70 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_evpn_global sanity + test" + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_config: &id005 + lines: no nv overlay evpn + match: none + +- name: Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: &id006 + feature: nv overlay + state: disabled + +- block: + + - name: Enable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: enabled + + - name: Enable nv overlay evpn + register: result + cisco.nxos.nxos_evpn_global: &id001 + nv_overlay_evpn: true + + - assert: &id002 + that: + - result.changed == true + + - name: CHECK IDEMPOTENCE - enable nv overlay evpn + register: result + cisco.nxos.nxos_evpn_global: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Disable nv overlay evpn + register: result + cisco.nxos.nxos_evpn_global: &id003 + nv_overlay_evpn: false + + - assert: *id002 + + - name: CHECK DEMPOTENCE - Disable nv overlay evpn + register: result + cisco.nxos.nxos_evpn_global: *id003 + + - assert: *id004 + when: not ( platform is search('N3K|N35|N3L')) + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_evpn_global sanity test + - FALURE ENCOUNTERED" + always: + + - name: Cleanup - Disable nv overlay evpn + ignore_errors: true + cisco.nxos.nxos_config: *id005 + + - name: Cleanup - Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: *id006 + + - debug: msg="END connection={{ ansible_connection }} nxos_evpn_global sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml new file mode 100644 index 00000000..8745dfca --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml @@ -0,0 +1,112 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_evpn_vni sanity test" + +- set_fact: nvoe_supported="{{ platform is not search('N3K|N3L|N35')}}" + +- name: Setup + ignore_errors: true + when: nvoe_supported + cisco.nxos.nxos_config: &id007 + lines: no nv overlay evpn + match: none + +- block: + + - name: Enable feature BGP + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + + - name: Enable nv overlay evpn + cisco.nxos.nxos_config: + lines: nv overlay evpn + match: none + + - name: Configure nxos_evpn_vni + register: result + cisco.nxos.nxos_evpn_vni: &id001 + vni: 6000 + route_distinguisher: "60:10" + route_target_import: + - auto + - "5000:10" + - "4100:100" + route_target_export: + - auto + - "5000:10" + - "192.0.2.1:43" + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_evpn_vni: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure nxos_evpn_vni + register: result + cisco.nxos.nxos_evpn_vni: &id003 + vni: 6000 + route_distinguisher: "50:20" + route_target_import: auto + route_target_export: auto + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_evpn_vni: *id003 + + - assert: *id004 + + - name: Configure nxos_evpn_vni + register: result + cisco.nxos.nxos_evpn_vni: &id005 + vni: 6000 + route_distinguisher: default + route_target_import: default + route_target_export: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_evpn_vni: *id005 + + - assert: *id004 + + - name: remove nxos_evpn_vni + register: result + cisco.nxos.nxos_evpn_vni: &id006 + vni: 6000 + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_evpn_vni: *id006 + + - assert: *id004 + when: nvoe_supported + always: + + - block: + + - name: Remove nv overlay evpn + ignore_errors: true + cisco.nxos.nxos_config: *id007 + + - name: Disable feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + when: nvoe_supported + +- debug: msg="END connection={{ ansible_connection }} nxos_evpn_vni sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/all_facts.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/all_facts.yaml new file mode 100644 index 00000000..a008042d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/all_facts.yaml @@ -0,0 +1,24 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/all_facts.yaml" + +- name: test getting all facts + register: result + cisco.nxos.nxos_facts: + gather_subset: + - all + +- assert: + that: + - result.changed == false + - "'config' in result.ansible_facts.ansible_net_gather_subset" + - "'hardware' in result.ansible_facts.ansible_net_gather_subset" + - "'default' in result.ansible_facts.ansible_net_gather_subset" + - "'interfaces' in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_filesystems is defined + - result.ansible_facts.ansible_net_interfaces is defined + - result.ansible_facts.ansible_net_config is defined + - result.ansible_facts.ansible_net_model is defined + - result.ansible_facts.ansible_net_memfree_mb > 1 + - result.ansible_facts.ansible_net_memtotal_mb > 1 + +- debug: msg="END connection={{ ansible_connection }}/all_facts.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/default_facts.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/default_facts.yaml new file mode 100644 index 00000000..48f3af5f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/default_facts.yaml @@ -0,0 +1,22 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/default_facts.yaml" + +- name: test getting default facts + register: result + cisco.nxos.nxos_facts: + +- assert: + that: + - result.changed == false + - "'hardware' in result.ansible_facts.ansible_net_gather_subset" + - "'default' in result.ansible_facts.ansible_net_gather_subset" + - "'interfaces' in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_filesystems is defined + - "'config' not in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_filesystems is defined + - result.ansible_facts.ansible_net_memtotal_mb > 10 + - result.ansible_facts.ansible_net_model is defined + - result.ansible_facts.ansible_net_interfaces is defined + - result.ansible_facts.ansible_net_config is not defined + +- debug: msg="END cli/default.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/invalid_subset.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/invalid_subset.yaml new file mode 100644 index 00000000..9f6d8697 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/invalid_subset.yaml @@ -0,0 +1,17 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/invalid_subset.yaml" + +- name: test invalid subset (foobar) + register: result + ignore_errors: true + cisco.nxos.nxos_facts: + gather_subset: + - foobar + +- assert: + that: + - result.changed == false + - result.failed == true + - "'Subset must be one of' in result.msg" + +- debug: msg="END connection={{ ansible_connection }}/invalid_subset.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/not_hardware.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/not_hardware.yaml new file mode 100644 index 00000000..64cd2e05 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/not_hardware.yaml @@ -0,0 +1,19 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/not_hardware_facts.yaml" + +- name: test not hardware + register: result + cisco.nxos.nxos_facts: + gather_subset: + - '!hardware' + +- assert: + that: + - result.changed == false + - "'config' in result.ansible_facts.ansible_net_gather_subset" + - "'default' in result.ansible_facts.ansible_net_gather_subset" + - "'interfaces' in result.ansible_facts.ansible_net_gather_subset" + - "'hardware' not in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_filesystems is not defined + +- debug: msg="END connection={{ ansible_connection }}/not_hardware_facts.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/sanity.yaml new file mode 100644 index 00000000..18af85c7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_facts/tests/common/sanity.yaml @@ -0,0 +1,61 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_facts sanity test" + +- name: nxos_facts gather hardware facts + register: result + cisco.nxos.nxos_facts: + gather_subset: hardware + +- assert: + that: + - result.changed == false + - "'hardware' in result.ansible_facts.ansible_net_gather_subset" + - "'config' not in result.ansible_facts.ansible_net_gather_subset" + - "'interfaces' not in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_filesystems is defined + - result.ansible_facts.ansible_net_memfree_mb > 1 + - result.ansible_facts.ansible_net_memtotal_mb > 1 + +- name: nxos_facts gather config facts + register: result + cisco.nxos.nxos_facts: + gather_subset: config + +- assert: + that: + - result.changed == false + - "'config' in result.ansible_facts.ansible_net_gather_subset" + - "'hardware' not in result.ansible_facts.ansible_net_gather_subset" + - "'interfaces' not in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_config is defined + +- name: nxos_facts gather config and hardware facts + register: result + cisco.nxos.nxos_facts: + gather_subset: + - hardware + - config + +- assert: + that: + - result.changed == false + - "'hardware' in result.ansible_facts.ansible_net_gather_subset" + - "'config' in result.ansible_facts.ansible_net_gather_subset" + - "'interfaces' not in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_filesystems is defined + - result.ansible_facts.ansible_net_config is defined + - result.ansible_facts.ansible_net_memfree_mb > 1 + - result.ansible_facts.ansible_net_memtotal_mb > 1 + +- name: nxos_facts gather features facts + register: result + cisco.nxos.nxos_facts: + gather_subset: features + +- assert: + that: + - result.changed == false + - "'features' in result.ansible_facts.ansible_net_gather_subset" + - result.ansible_facts.ansible_net_features_enabled is defined + +- debug: msg="END connection={{ ansible_connection }} nxos_facts sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/configure.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/configure.yaml new file mode 100644 index 00000000..6a8eec3d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/configure.yaml @@ -0,0 +1,96 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/configure.yaml" + +- name: setup + cisco.nxos.nxos_config: &teardown + lines: + - no feature bgp + - no feature fabric forwarding + match: none + +- name: enable bgp + register: result + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- assert: + that: + - result.changed == true + +- name: verify bgp + register: result + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- assert: + that: + - result.changed == false + +- name: disable bgp + register: result + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- assert: + that: + - result.changed == true + +- name: verify bgp + register: result + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- assert: + that: + - result.changed == false + +- name: verify fabric forwarding + register: result + cisco.nxos.nxos_feature: + feature: fabric forwarding + state: enabled + +- assert: + that: + - result.changed == True + - "'feature fabric forwarding' in result.commands" + +- name: verify fabric forwarding (IDEMPOTENT) + register: result + cisco.nxos.nxos_feature: + feature: fabric forwarding + state: enabled + +- assert: + that: + - result.changed == False + +- name: verify fabric forwarding disable + register: result + cisco.nxos.nxos_feature: + feature: fabric forwarding + state: disabled + +- assert: + that: + - result.changed == True + - "'no feature fabric forwarding' in result.commands" + +- name: verify fabric forwarding disabled (IDEMPOTENT) + register: result + cisco.nxos.nxos_feature: + feature: fabric forwarding + state: disabled + +- assert: + that: + - result.changed == False + +- name: teardown + cisco.nxos.nxos_config: *teardown + +- debug: msg="END connection={{ ansible_connection }}/configure.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/invalid.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/invalid.yaml new file mode 100644 index 00000000..cd2017ba --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_feature/tests/common/invalid.yaml @@ -0,0 +1,14 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/invalid.yaml" + +- name: configure invalid feature name + register: result + ignore_errors: true + cisco.nxos.nxos_feature: + feature: invalid + +- assert: + that: + - result.failed == true + +- debug: msg="END connection={{ ansible_connection }}/invalid.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/fixtures/data.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/fixtures/data.cfg new file mode 100644 index 00000000..fafd7451 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/fixtures/data.cfg @@ -0,0 +1 @@ +TEST FILE diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/cli.yaml new file mode 100644 index 00000000..1edbef6f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/cli.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/main.yaml new file mode 100644 index 00000000..cde4e27c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/main.yaml @@ -0,0 +1,34 @@ +--- +- name: Fetch mgmt interface information + cisco.nxos.nxos_command: + commands: show interface mgmt 0 | json + register: result + +- name: Store mgmt interface IP address + set_fact: + mgmt0_ip: "{{ result['stdout'][0]['TABLE_interface']['ROW_interface']['eth_ip_addr'] }}" + +- name: Generate and store random password for temp user + set_fact: + temp_passwd: "{{ lookup('password', 'length=15 chars=ascii_letters') }}" + delegate_to: localhost + no_log: True + +- name: Configure temporary user for test + cisco.nxos.nxos_user: + name: temp_user + configured_password: "{{ temp_passwd }}" + +- block: + - include: cli.yaml + tags: + - cli + + - include: nxapi.yaml + tags: + - nxapi + always: + - name: Remove temporary user + cisco.nxos.nxos_user: + name: temp_user + state: absent diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/nxapi.yaml new file mode 100644 index 00000000..7e21ea41 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/input_validation.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/input_validation.yaml new file mode 100644 index 00000000..ce94948e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/input_validation.yaml @@ -0,0 +1,86 @@ +--- +- debug: msg="START nxos_file_copy input_validation test" + +- name: Input Validation - param should be type + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + remote_file: 500 + file_pull: true + +- assert: + that: + - not result is search('argument remote_file is of type') + +- name: Input Validation - param should be type + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull_timeout: foobar + +- assert: + that: + - result is search("argument file_pull_timeout is of type + and we were unable to convert to int") + +- name: Input Validation - param should be type + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: foobar + +- assert: + that: + - result is search("argument file_pull is of type + and we were unable to convert to bool") + +- name: Input Validation - param dependency + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + +- assert: + that: + - result is search("Playbook parameter required when + is True") + +- name: Input Validation - param dependency + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + remote_file: /network-integration.cfg + +- assert: + that: + - result is search('Playbook parameter required when + is True') + +- name: Input Validation - remote_scp_server params together + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + remote_scp_server: '{{ inventory_hostname_short }}' + +- assert: + that: + - result is search('Playbook parameters , + must be set together') + +- name: Input Validation - param should only accept strings, which are included in choices + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_protocol: foobar + remote_file: /network-integration.cfg + remote_scp_server: foobar + remote_scp_server_user: foobar + +- assert: + that: + - result is search("argument file_pull_protocol with value foobar is not valid. + Allowed values are scp, sftp, http, https, tftp, ftp") + +- debug: msg="END nxos_file_copy input_validation test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/negative.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/negative.yaml new file mode 100644 index 00000000..c085831b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/negative.yaml @@ -0,0 +1,130 @@ +--- +- debug: msg="START nxos_file_copy negative test" + +- set_fact: + test_source_file: "data.cfg" + test_destination_file: "test_destination_file" + +- name: Attempt to copy file to invalid file_system + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: false + local_file: "{{ role_path }}/fixtures/{{ test_source_file }}" + file_system: 'invalid_media_type:' + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result is search('Invalid nxos filesystem invalid_media_type:') + +- name: Attempt to copy source file that does not exist on Ansible controller + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: false + local_file: ./{{ test_source_file }}_does_not_exist + file_system: 'bootflash:' + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result is search('Local file ./data.cfg_does_not_exist not + found') + +- name: Try and copy file using an invalid remote scp server name + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_timeout: 10 + remote_file: "{{ role_path }}/fixtures/{{ test_source_file }}" + local_file: '{{ test_destination_file }}_copy' + local_file_directory: dir1/dir2/dir3 + remote_scp_server: scp_server_gone.example.com + remote_scp_server_user: '{{ ansible_ssh_user }}' + remote_scp_server_password: '{{ temp_passwd }}' + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result.changed == false + - "'copy scp:' in result.copy_cmd" + - "'bootflash:' in result.file_system" + - "'No Transfer' in result.transfer_status" + +- assert: + that: + - result.error_data is search("ERROR Could not resolve hostname|Copying to.*from + this server name is not permitted") + +- name: Try and copy file using an invalid remote scp server ip address + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_timeout: 300 + remote_file: /{{ test_destination_file }} + local_file: '{{ test_destination_file }}_copy' + local_file_directory: dir1/dir2/dir3 + remote_scp_server: 192.168.55.55 + remote_scp_server_user: '{{ ansible_ssh_user }}' + remote_scp_server_password: '{{ temp_passwd }}' + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result.changed == false + - "'copy scp:' in result.copy_cmd" + - "'timed out' in result.error_data" + - "'bootflash:' in result.file_system" + - "'No Transfer' in result.transfer_status" + +- pause: + seconds: 10 + +- name: Try and copy file using an invalid username + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_timeout: 10 + remote_file: /{{ test_destination_file }} + local_file: '{{ test_destination_file }}_copy' + local_file_directory: dir1/dir2/dir3 + remote_scp_server: '{{ mgmt0_ip }}' + remote_scp_server_user: invalid_user_name + remote_scp_server_password: '{{ temp_passwd }}' + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result.changed == false + - "'copy scp:' in result.copy_cmd" + - "'Too many authentication failures' in result.error_data" + - "'bootflash:' in result.file_system" + - "'No Transfer' in result.transfer_status" + +- name: Try and copy file using an invalid password + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_timeout: 10 + remote_file: /{{ test_destination_file }} + local_file: '{{ test_destination_file }}_copy' + local_file_directory: dir1/dir2/dir3 + remote_scp_server: '{{ mgmt0_ip }}' + remote_scp_server_user: '{{ ansible_ssh_user }}' + remote_scp_server_password: invalid_password + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result.changed == false + - "'copy scp:' in result.copy_cmd" + - "'Too many authentication failures' in result.error_data" + - "'bootflash:' in result.file_system" + - "'No Transfer' in result.transfer_status" + +- debug: msg="END nxos_file_copy negative test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/sanity.yaml new file mode 100644 index 00000000..055043b2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/cli/sanity.yaml @@ -0,0 +1,202 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_file_copy sanity test" + +- set_fact: + test_source_file: "data.cfg" + test_destination_file: "test_destination_file" + +- set_fact: + sftp_root_dir: "{% if major_version is version('9.2', 'ge') %}/bootflash{% else %}/{% endif %}" + +- name: Setup - Remove existing file + ignore_errors: true + cisco.nxos.nxos_command: &id002 + commands: + - terminal dont-ask + - delete {{ test_source_file }} + - delete {{ test_destination_file }} + - delete bootflash:/dir1/dir2/dir3/* + - rmdir dir1/dir2/dir3 + - rmdir dir1/dir2 + - rmdir dir1 + +- name: Setup - Turn on feature scp-server + cisco.nxos.nxos_feature: + feature: scp-server + state: enabled + +- name: Setup - Turn on feature sftp-server + cisco.nxos.nxos_feature: + feature: sftp-server + state: enabled + +- name: Setup - Backup admin password if ansible_user is not admin + cisco.nxos.nxos_command: + commands: + - command: show running-config | include "username admin password" + register: nxos_admin_password + no_log: true + when: ansible_user != "admin" + +- name: Setup - Change admin password if ansible_user is not admin + cisco.nxos.nxos_user: + name: admin + configured_password: "{{ temp_passwd }}" + when: ansible_user != "admin" + +- block: + + - name: Copy {{ test_source_file }} file from Ansible controller to bootflash + register: result + cisco.nxos.nxos_file_copy: &id001 + local_file: "{{ role_path }}/fixtures/{{ test_source_file }}" + file_system: 'bootflash:' + connect_ssh_port: '{{ ansible_ssh_port }}' + + - assert: + that: + - result.changed == true + - "'bootflash:' in result.file_system" + - "'/{{ test_source_file }}' in result.local_file" + - "'{{ test_source_file }}' in result.remote_file" + + - "'Sent: File copied to remote device.' in result.transfer_status" + + - name: Idempotence - Copy {{ test_source_file }} file from Ansible controller + to bootflash + register: result + cisco.nxos.nxos_file_copy: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Setup - Remove existing file + register: result + cisco.nxos.nxos_command: *id002 + + - name: Copy {{ test_source_file }} file from Ansible controller to bootflash + renamed as {{ test_destination_file }} + register: result + cisco.nxos.nxos_file_copy: &id003 + local_file: "{{ role_path }}/fixtures/{{ test_source_file }}" + remote_file: '{{ test_destination_file }}' + file_system: 'bootflash:' + connect_ssh_port: '{{ ansible_ssh_port }}' + + - assert: + that: + - result.changed == true + - "'bootflash:' in result.file_system" + - "'{{ test_source_file }}' in result.local_file" + - "'{{ test_destination_file }}' in result.remote_file" + + - "'Sent: File copied to remote device.' in result.transfer_status" + + - name: Idempotence - Copy {{ test_source_file }} file from Ansible controller + to bootflash renamed as {{ test_destination_file }} + register: result + cisco.nxos.nxos_file_copy: *id003 + + - name: Verify file_pull true options have no impact when file_pull is false + register: result + cisco.nxos.nxos_file_copy: + file_pull: false + file_pull_timeout: 1200 + file_pull_compact: true + file_pull_kstack: true + local_file_directory: dir1/dir2/dir3 + remote_scp_server: '{{ inventory_hostname_short }}' + remote_scp_server_user: temp_user + remote_scp_server_password: '{{ temp_passwd }}' + local_file: "{{ role_path }}/fixtures/{{ test_source_file }}" + remote_file: '{{ test_destination_file }}' + file_system: 'bootflash:' + connect_ssh_port: '{{ ansible_ssh_port }}' + + - assert: *id004 + + - name: Initiate copy from nxos device to copy {{ test_destination_file }} to + bootflash:dir1/dir2/dir3/{{ test_destination_file }}_copy + register: result + cisco.nxos.nxos_file_copy: &id005 + file_pull: true + file_pull_timeout: 30 + remote_file: /{{ test_destination_file }} + local_file: '{{ test_destination_file }}_copy' + local_file_directory: dir1/dir2/dir3 + remote_scp_server: '{{ mgmt0_ip }}' + remote_scp_server_user: temp_user + remote_scp_server_password: "{{ temp_passwd }}" + connect_ssh_port: '{{ ansible_ssh_port }}' + + - assert: &id006 + that: + - result.changed == true + - "'copy scp:' in result.copy_cmd" + - "'bootflash:' in result.file_system" + - "'bootflash:dir1/dir2/dir3/{{ test_destination_file }}_copy' in result.local_file" + - "'/{{ test_destination_file }}' in result.remote_file" + + - "'Received: File copied/pulled to nxos device from remote scp server.'\ + \ in result.transfer_status" + - "'{{ mgmt0_ip }}' in result.remote_scp_server" + + - name: Overwrite the file + register: result + cisco.nxos.nxos_file_copy: *id005 + + - assert: *id006 + + - name: Initiate copy with sftp from nxos device to copy /bootflash/{{ test_destination_file }} to + bootflash:dir2/dir2/dir3/{{ test_destination_file }}_another_copy + register: result + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_protocol: sftp + file_pull_timeout: 30 + remote_file: "{{ sftp_root_dir }}/{{ test_destination_file }}" + local_file: '{{ test_destination_file }}_another_copy' + local_file_directory: dir1/dir2/dir3 + remote_scp_server: '{{ mgmt0_ip }}' + remote_scp_server_user: admin + remote_scp_server_password: "{% if ansible_user == 'admin' %}{{ ansible_password }}{% else %}{{ temp_passwd }}{% endif %}" + connect_ssh_port: '{{ ansible_ssh_port }}' + + - assert: + that: + - result.changed == true + - "'copy sftp:' in result.copy_cmd" + - "'bootflash:' in result.file_system" + - "'bootflash:dir1/dir2/dir3/{{ test_destination_file }}_another_copy' in result.local_file" + - "'{{ sftp_root_dir }}/{{ test_destination_file }}' in result.remote_file" + + - "'Received: File copied/pulled to nxos device from remote scp server.'\ + \ in result.transfer_status" + - "'{{ mgmt0_ip }}' in result.remote_scp_server" + + always: + - name: Remove file + ignore_errors: true + cisco.nxos.nxos_command: *id002 + + + - name: Recover the admin password if ansible_user is not admin + cisco.nxos.nxos_config: + lines: + - "{{ nxos_admin_password['stdout_lines'][0][0] }}" + no_log: true + when: ansible_user != "admin" + + - name: Turn off feature scp-server + cisco.nxos.nxos_feature: + feature: scp-server + state: disabled + + - name: Turn off feature sftp-server + cisco.nxos.nxos_feature: + feature: sftp-server + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_file_copy sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/nxapi/badtransport.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/nxapi/badtransport.yaml new file mode 100644 index 00000000..933c6172 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_file_copy/tests/nxapi/badtransport.yaml @@ -0,0 +1,16 @@ +--- +- debug: msg="START nxapi/badtransport.yaml" + +- name: Sending transport other than cli should fail + register: result + ignore_errors: true + cisco.nxos.nxos_file_copy: + local_file: ./network-integration.cfg + file_system: 'bootflash:' + connect_ssh_port: '{{ ansible_ssh_port }}' + +- assert: + that: + - result.failed and result.msg is search('Connection type must be fully qualified name for network_cli connection type, got {{ ansible_connection }}') + +- debug: msg="END nxapi/badtransport.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tests/common/sanity.yaml new file mode 100644 index 00000000..7defac0f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir/tests/common/sanity.yaml @@ -0,0 +1,110 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_gir sanity test" + +- set_fact: gir_run='{{ true if (platform is not search("N35")) else false }}' + +- name: Setup0 + ignore_errors: true + cisco.nxos.nxos_config: &id007 + lines: + - no system mode maintenance timeout 30 + - no configure maintenance profile normal-mode + - no configure maintenance profile maintenance-mode + match: none + +- name: Setup1 + ignore_errors: true + cisco.nxos.nxos_gir: + system_mode_maintenance: false + +- block: + + - name: Put system in maintenance mode with reload reset reason + register: result + cisco.nxos.nxos_gir: &id001 + system_mode_maintenance_on_reload_reset_reason: manual_reload + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_gir: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove reload reason + register: result + cisco.nxos.nxos_gir: &id003 + system_mode_maintenance_on_reload_reset_reason: manual_reload + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_gir: *id003 + + - assert: *id004 + + - name: Put system in maintenance mode with timeout + register: result + cisco.nxos.nxos_gir: &id005 + system_mode_maintenance_timeout: 30 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_gir: *id005 + + - assert: *id004 + + - name: Remove maintenance mode timeout + register: result + cisco.nxos.nxos_gir: &id006 + system_mode_maintenance_timeout: 30 + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_gir: *id006 + + - assert: *id004 + + - name: Put system in maintenance mode + register: result + cisco.nxos.nxos_gir: + system_mode_maintenance: true + + - assert: *id002 + when: gir_run + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_gir failure detected" + always: + + - name: Remove snapshots + ignore_errors: true + cisco.nxos.nxos_snapshot: + action: delete_all + + - name: Teardown0 + ignore_errors: true + cisco.nxos.nxos_config: *id007 + + - name: Put system back in normal mode + retries: 3 + delay: 30 + register: result + until: result is not failed + ignore_errors: true + cisco.nxos.nxos_gir: + system_mode_maintenance: false + +- debug: msg="END connection={{ ansible_connection }} nxos_gir sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tests/common/sanity.yaml new file mode 100644 index 00000000..5db400f3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_gir_profile_management/tests/common/sanity.yaml @@ -0,0 +1,105 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_gir_profile_management + sanity test" + +- name: Setup - Remove maintenace mode profiles + ignore_errors: true + cisco.nxos.nxos_gir_profile_management: &id005 + mode: maintenance + state: absent + +- name: Setup - Remove normal mode profiles + ignore_errors: true + cisco.nxos.nxos_gir_profile_management: &id006 + mode: normal + state: absent + +- name: Setup - Turn on feature eigrp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: eigrp + state: enabled + +- block: + + - name: Create maintenace mode profile + register: result + cisco.nxos.nxos_gir_profile_management: &id001 + mode: maintenance + commands: + - router eigrp 11 + - isolate + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence - Create maintenace mode profile + register: result + cisco.nxos.nxos_gir_profile_management: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Create normal mode profile + register: result + cisco.nxos.nxos_gir_profile_management: &id003 + mode: normal + commands: + - router eigrp 11 + - isolate + state: present + + - assert: *id002 + + - name: Check Idempotence - Create normal mode profile + register: result + cisco.nxos.nxos_gir_profile_management: *id003 + + - assert: *id004 + + - name: Remove maintenance mode profile + register: result + cisco.nxos.nxos_gir_profile_management: *id005 + + - assert: *id002 + + - name: Check Idempotence - Remove maintenance mode profile + register: result + cisco.nxos.nxos_gir_profile_management: *id005 + + - assert: *id004 + + - name: Remove normal mode profile + register: result + cisco.nxos.nxos_gir_profile_management: *id006 + + - assert: *id002 + + - name: Check Idempotence - Remove normal mode profile + register: result + cisco.nxos.nxos_gir_profile_management: *id006 + + - assert: *id004 + when: not ( platform is match('N35')) and not titanium + rescue: + + - debug: msg="connection={{ ansible_connection }} nxos_gir_profile_management + failure detected" + always: + + - name: Remove normal mode profile + cisco.nxos.nxos_gir_profile_management: *id006 + + - name: Remove maintenance mode profile + cisco.nxos.nxos_gir_profile_management: *id005 + + - name: Turn off feature eigrp + cisco.nxos.nxos_feature: + feature: eigrp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_gir_profile_management + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tests/common/sanity.yaml new file mode 100644 index 00000000..ad9bd1b5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp/tests/common/sanity.yaml @@ -0,0 +1,153 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_hsrp sanity test" + +- set_fact: intname1="{{ nxos_int1 }}" + +- set_fact: intname2="{{ nxos_int2 }}" + +- block: + + - name: Enable feature hsrp + cisco.nxos.nxos_feature: + feature: hsrp + state: enabled + + - name: change int1 mode + cisco.nxos.nxos_config: + commands: + - no switchport + parents: + - interface {{ intname1 }} + match: none + + - name: change int2 mode + cisco.nxos.nxos_config: + commands: + - no switchport + parents: + - interface {{ intname2 }} + match: none + + - name: configure nxos_hsrp + register: result + cisco.nxos.nxos_hsrp: &id001 + group: 1000 + version: 2 + vip: 10.1.1.1 + priority: 150 + interface: '{{ intname1 }}' + preempt: enabled + auth_type: md5 + auth_string: 7 1234 + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_hsrp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: configure group 100 + register: result + cisco.nxos.nxos_hsrp: &id003 + group: 100 + version: 2 + vip: 192.0.2.2 + priority: 25 + interface: '{{ intname1 }}' + preempt: enabled + auth_type: md5 + auth_string: 0 1234 + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_hsrp: *id003 + + - assert: *id004 + + - name: change group 100 + register: result + cisco.nxos.nxos_hsrp: &id005 + group: 100 + version: 2 + vip: default + priority: default + interface: '{{ intname1 }}' + preempt: disabled + auth_type: md5 + auth_string: 0 1234 + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_hsrp: *id005 + + - assert: *id004 + + - name: configure group 200 + register: result + cisco.nxos.nxos_hsrp: &id006 + group: 200 + vip: 192.0.2.3 + version: 1 + interface: '{{ intname2 }}' + auth_type: text + auth_string: '1234' + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_hsrp: *id006 + + - assert: *id004 + + - name: change group 200 + register: result + cisco.nxos.nxos_hsrp: &id007 + group: 200 + vip: 192.0.2.3 + version: 2 + interface: '{{ intname2 }}' + auth_type: text + auth_string: default + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_hsrp: *id007 + + - assert: *id004 + + - name: remove nxos_hsrp + register: result + cisco.nxos.nxos_hsrp: &id008 + group: 1000 + interface: '{{ intname1 }}' + state: absent + + - assert: *id002 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_hsrp: *id008 + + - assert: *id004 + always: + + - name: Disable feature hsrp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: hsrp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_hsrp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..12c20322 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/cli.yaml @@ -0,0 +1,29 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..cba9ae6b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,15 @@ +- name: Populate Config - 1 + cisco.nxos.nxos_config: + lines: + - "feature hsrp" + - "feature bfd" + - "interface {{ nxos_int1 }}" + - " no switchport" + - " hsrp bfd" + +- name: Populate Config - 2 + cisco.nxos.nxos_config: + lines: + - "interface {{ nxos_int2 }}" + - " no switchport" + - " hsrp bfd" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..39c607e4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,8 @@ +- name: Remove Config + cisco.nxos.nxos_config: + lines: + - "no feature bfd" + - "no feature hsrp" + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..efa5dbda --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/deleted.yaml @@ -0,0 +1,57 @@ +--- +- debug: + msg: Start nxos_hsrp_interfaces deleted integration tests connection={{ ansible_connection + }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N35') + +- block: + - include_tasks: _remove_config.yaml + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "feature hsrp" + - "interface {{ test_int1 }}" + - " no switchport" + - " hsrp bfd" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int2 }}" + - " no switchport" + + - name: deleted + register: result + cisco.nxos.nxos_hsrp_interfaces: &id001 + config: + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + state: deleted + + - assert: + that: + - result.changed == true + - "'no hsrp bfd' in result.commands" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_hsrp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..65b2565f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_hsrp_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_hsrp_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_hsrp_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_hsrp_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_hsrp_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_hsrp_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_hsrp_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..d4ad00bb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START nxos_hsrp_interfaces gathered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather hsrp_interfaces facts from the device using nxos_hsrp_interfaces + register: result + cisco.nxos.nxos_hsrp_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_hsrp_interfaces gathered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..812a8fad --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/merged.yaml @@ -0,0 +1,65 @@ +--- +- debug: + msg: Start nxos_hsrp_interfaces merged integration tests connection={{ ansible_connection + }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N35') + +- block: + - include_tasks: _remove_config.yaml + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "feature hsrp" + - "interface {{ test_int1 }}" + - " no switchport" + - " hsrp bfd" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int2 }}" + - " no switchport" + + - name: Merged + register: result + cisco.nxos.nxos_hsrp_interfaces: &id001 + config: + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + state: merged + + - assert: + that: + - result.changed == true + - "'no hsrp bfd' in result.commands" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - name: Gather hsrp_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: hsrp_interfaces + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_hsrp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + when: bfd_enable is defined + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..e1b8a962 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/overridden.yaml @@ -0,0 +1,59 @@ +--- +- debug: + msg: Start nxos_hsrp_interfaces overridden integration tests connection={{ ansible_connection + }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N35') + +- block: + - include_tasks: _remove_config.yaml + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "feature hsrp" + - "interface {{ test_int1 }}" + - " no switchport" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int2 }}" + - " no switchport" + - " hsrp bfd" + + - name: Overridden + register: result + cisco.nxos.nxos_hsrp_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_enable|default(omit)}}' + state: overridden + + - assert: + that: + - result.changed == true + - result.commands[1] == 'no hsrp bfd' + - result.commands[3] == 'hsrp bfd' + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_hsrp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..b7d52df9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/parsed.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START nxos_hsrp_interfaces parsed integration tests on connection={{ ansible_connection + }} + +- block: + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_hsrp_interfaces: + running_config: | + interface Ethernet1/800 + no switchport + hsrp bfd + interface Ethernet1/801 + no switchport + hsrp bfd + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_hsrp_interfaces parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..ed3e9490 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/rendered.yaml @@ -0,0 +1,39 @@ +--- +- debug: + msg: START nxos_hsrp_interfaces rendered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- block: + # Interfaces used here doesn't actually exist on the device + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_hsrp_interfaces: + config: + - name: Ethernet1/800 + bfd: enable + - name: Ethernet1/801 + bfd: enable + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather bfd_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_hsrp_interfaces: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered'] == [] }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_hsrp_interfaces rendered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..ff3cd0d2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/tests/common/replaced.yaml @@ -0,0 +1,58 @@ +--- +- debug: + msg: Start nxos_hsrp_interfaces replaced integration tests connection={{ ansible_connection + }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- set_fact: + bfd_enable: enable + bfd_disable: disable + when: platform is not search('N35') + +- block: + - include_tasks: _remove_config.yaml + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature bfd" + - "feature hsrp" + - "interface {{ test_int1 }}" + - " no switchport" + - " hsrp bfd" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int2 }}" + - " no switchport" + + - name: Replaced + register: result + cisco.nxos.nxos_hsrp_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + bfd: '{{ bfd_disable|default(omit)}}' + state: replaced + + - assert: + that: + - result.changed == true + - "'no hsrp bfd' in result.commands" + msg: "Assert failed. 'result.commands': {{ result.commands }}" + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_hsrp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/vars/main.yml new file mode 100644 index 00000000..3956fbfe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_hsrp_interfaces/vars/main.yml @@ -0,0 +1,17 @@ +gathered: + - name: "{{ nxos_int1 }}" + bfd: enable + - name: "{{ nxos_int2 }}" + bfd: enable + +parsed: + - name: Ethernet1/800 + bfd: enable + - name: Ethernet1/801 + bfd: enable + +rendered: + - "interface Ethernet1/800" + - "hsrp bfd" + - "interface Ethernet1/801" + - "hsrp bfd" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tests/common/sanity.yaml new file mode 100644 index 00000000..9301477e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp/tests/common/sanity.yaml @@ -0,0 +1,68 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_igmp sanity test" + +- set_fact: restart="true" + when: platform is not match("N35") + +- block: + + - name: Configure igmp with non-default values + register: result + cisco.nxos.nxos_igmp: &id001 + flush_routes: true + enforce_rtr_alert: true + restart: false + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence - Configure igmp interface with non-default values + register: result + cisco.nxos.nxos_igmp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure igmp defaults + register: result + cisco.nxos.nxos_igmp: &id003 + flush_routes: false + enforce_rtr_alert: false + restart: '{{restart|default(omit)}}' + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure igmp with defaults + register: result + cisco.nxos.nxos_igmp: *id003 + + - assert: *id004 + + - name: Configure igmp non-defaults again + register: result + cisco.nxos.nxos_igmp: *id001 + + - name: Configure igmp state as values + register: result + cisco.nxos.nxos_igmp: &id005 + state: default + + - assert: *id002 + + - name: Check Idempotence - Configure igmp with state default + register: result + cisco.nxos.nxos_igmp: *id005 + + - assert: *id004 + always: + + - name: Configure igmp with default values + register: result + ignore_errors: true + cisco.nxos.nxos_igmp: *id005 + + - debug: msg="END connection={{ ansible_connection }} nxos_igmp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..bcca31eb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_interface/tests/common/sanity.yaml @@ -0,0 +1,185 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_igmp_interface sanity + test" + +- set_fact: intname="{{ nxos_int1 }}" + +- set_fact: restart="true" + when: platform is not match("N35") + +- name: Enable feature PIM + ignore_errors: true + cisco.nxos.nxos_feature: + feature: pim + state: enabled + +- name: Put interface in default mode + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - default interface {{ intname }} + match: none + +- block: + + - name: put interface in L3 and enable PIM + cisco.nxos.nxos_config: + commands: + - no switchport + - ip pim sparse-mode + parents: + - interface {{ intname }} + match: none + + - name: Configure igmp interface with non-default values + register: result + cisco.nxos.nxos_igmp_interface: &id001 + interface: '{{ intname }}' + version: 3 + startup_query_interval: 60 + startup_query_count: 5 + robustness: 6 + querier_timeout: 2000 + query_mrt: 12 + query_interval: 200 + last_member_qrt: 2 + last_member_query_count: 4 + report_llg: true + immediate_leave: true + group_timeout: 300 + oif_ps: + + - source: 192.0.2.1 + prefix: 239.255.255.2 + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence - Configure igmp interface with non-default values + register: result + cisco.nxos.nxos_igmp_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure igmp interface with some default values + register: result + cisco.nxos.nxos_igmp_interface: &id003 + interface: '{{ intname }}' + version: default + startup_query_interval: default + startup_query_count: default + robustness: default + querier_timeout: default + query_mrt: default + query_interval: default + last_member_qrt: default + last_member_query_count: default + group_timeout: default + oif_ps: + + - prefix: 238.2.2.6 + + - prefix: 238.2.2.5 + + - source: 192.0.2.1 + prefix: 238.2.2.5 + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure igmp interface with some default values + register: result + cisco.nxos.nxos_igmp_interface: *id003 + + - assert: *id004 + + - name: restart igmp + cisco.nxos.nxos_igmp_interface: + interface: '{{ intname }}' + restart: '{{restart|default(omit)}}' + + - name: Configure igmp interface with default oif_ps + register: result + cisco.nxos.nxos_igmp_interface: &id005 + interface: '{{ intname }}' + oif_ps: default + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure igmp interface with default oif_ps + register: result + cisco.nxos.nxos_igmp_interface: *id005 + + - assert: *id004 + + - name: Configure igmp interface with oif_routemap + register: result + cisco.nxos.nxos_igmp_interface: &id006 + interface: '{{ intname }}' + version: 3 + startup_query_interval: 60 + startup_query_count: 5 + robustness: 6 + oif_routemap: abcd + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure igmp interface with oif_routemap + register: result + cisco.nxos.nxos_igmp_interface: *id006 + + - assert: *id004 + + - name: Configure igmp interface with default state + register: result + cisco.nxos.nxos_igmp_interface: &id007 + interface: '{{ intname }}' + state: default + + - assert: *id002 + + - name: Check Idempotence - Configure igmp interface with default state + register: result + cisco.nxos.nxos_igmp_interface: *id007 + + - assert: *id004 + + - name: Configure igmp interface with absent state + register: result + cisco.nxos.nxos_igmp_interface: &id008 + interface: '{{ intname }}' + state: absent + + - assert: *id002 + + - name: Check Idempotence - Configure igmp interface with absent state + register: result + cisco.nxos.nxos_igmp_interface: *id008 + + - assert: *id004 + always: + + - name: Configure igmp interface with absent state + register: result + cisco.nxos.nxos_igmp_interface: *id008 + + - name: Put interface in default mode + cisco.nxos.nxos_config: + commands: + - default interface {{ intname }} + match: none + + - name: Disable feature PIM + ignore_errors: true + cisco.nxos.nxos_feature: + feature: pim + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_igmp_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tests/common/sanity.yaml new file mode 100644 index 00000000..860b7269 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_igmp_snooping/tests/common/sanity.yaml @@ -0,0 +1,120 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_igmp_snooping sanity + test" + +- meta: end_host + when: platform is search('N6K') + +- set_fact: gt_run="false" + +- block: + + - set_fact: gt_run="true" + + - set_fact: group_timeout="never" + + - set_fact: def_group_timeout="default" + when: platform is not search('N35|N5K|N6K') + +- name: Setup + cisco.nxos.nxos_igmp_snooping: &id006 + state: default + +- block: + + - name: Configure igmp snooping with non-default values + register: result + cisco.nxos.nxos_igmp_snooping: &id001 + snooping: false + link_local_grp_supp: false + report_supp: false + v3_report_supp: true + state: present + + - assert: &id002 + that: + - result.changed == true + + - block: + + - name: Check Idempotence - Configure igmp snooping with non-default values + register: result + cisco.nxos.nxos_igmp_snooping: *id001 + + - assert: &id004 + that: + - result.changed == false + when: (imagetag and (imagetag is version_compare('D1', 'ne'))) + + - block: + + - name: Negative Test config group-timeout when igmp snooping disabled + ignore_errors: true + register: result + cisco.nxos.nxos_igmp_snooping: + snooping: false + group_timeout: '{{group_timeout|default(omit)}}' + state: present + + - assert: + that: + - result.failed == true + - result.msg == 'group-timeout cannot be enabled or changed when ip + igmp snooping is disabled' + + - name: Configure group-timeout non-default + register: result + cisco.nxos.nxos_igmp_snooping: &id003 + snooping: true + group_timeout: '{{group_timeout|default(omit)}}' + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_igmp_snooping: *id003 + + - assert: *id004 + when: gt_run + + - name: Configure igmp snooping with default group timeout + register: result + cisco.nxos.nxos_igmp_snooping: &id005 + group_timeout: '{{def_group_timeout|default(omit)}}' + state: present + + - assert: *id002 + when: gt_run + + - block: + + - name: Check Idempotence + register: result + cisco.nxos.nxos_igmp_snooping: *id005 + + - assert: *id004 + when: gt_run or (imagetag and (imagetag is version_compare('D1', 'ne'))) + + - name: Configure igmp snooping with default values + register: result + cisco.nxos.nxos_igmp_snooping: *id006 + + - assert: *id002 + + - block: + + - name: Check Idempotence - Configure igmp snooping with default values + register: result + cisco.nxos.nxos_igmp_snooping: *id006 + + - assert: *id004 + when: (imagetag and (imagetag is version_compare('D1', 'ne'))) + always: + + - name: Configure igmp snooping with default values + register: result + cisco.nxos.nxos_igmp_snooping: *id006 + + - debug: msg="END connection={{ ansible_connection }} nxos_igmp_snooping sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/defaults/main.yaml new file mode 100644 index 00000000..aeb94781 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: '' +test_items: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/meta/main.yml new file mode 100644 index 00000000..7f867d73 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/meta/main.yml @@ -0,0 +1,2 @@ +--- +dependencies: diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/httpapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/httpapi.yaml new file mode 100644 index 00000000..ccd42c6c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/httpapi.yaml @@ -0,0 +1,17 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (ansible_connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/main.yaml new file mode 100644 index 00000000..fe00501d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/main.yaml @@ -0,0 +1,6 @@ +--- +- include: network_cli.yaml + when: ansible_connection == 'ansible.netcommon.network_cli' + +- include: httpapi.yaml + when: ansible_connection == 'ansible.netcommon.httpapi' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/network_cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/network_cli.yaml new file mode 100644 index 00000000..65994419 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/network_cli.yaml @@ -0,0 +1,17 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (ansible_connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml new file mode 100644 index 00000000..01370548 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml @@ -0,0 +1,15 @@ +--- +- name: Clean up sockets with file module + file: + state: absent + path: '{{ home }}/.ansible/pc/' + delegate_to: 127.0.0.1 + +- name: Display socket info after delete + shell: /bin/ls {{ home }}/.ansible + args: + executable: /bin/bash + delegate_to: 127.0.0.1 + register: output + +- debug: msg="Local Socket Info {{ output['stdout_lines'] }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml new file mode 100644 index 00000000..8412f5d6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml @@ -0,0 +1,42 @@ +--- +- set_fact: ignore_errors_httpapi='no' + +- set_fact: ignore_errors_httpapi='yes' + when: ansible_connection == 'ansible.netcommon.httpapi' + +- include: targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml + +- name: Remove SSH known_hosts file before scp of image file + ignore_errors: true + cisco.nxos.nxos_command: + commands: run bash rm /var/home/admin/.ssh/known_hosts + +- name: Copy {{ si }} to bootflash + register: result + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_timeout: 1200 + remote_file: '{{image_dir}}{{ si }}' + remote_scp_server: '{{ remote_scp_server }}' + remote_scp_server_user: '{{ remote_scp_user }}' + remote_scp_server_password: '{{ remote_scp_password }}' + +- debug: + msg: '{{ item.key }} {{ item.value }}' + with_dict: '{{ result }}' + +- name: Copy {{ ki }} to bootflash + when: ki is defined + register: result + cisco.nxos.nxos_file_copy: + file_pull: true + file_pull_timeout: 1200 + remote_file: '{{image_dir}}{{ ki }}' + remote_scp_server: '{{ remote_scp_server }}' + remote_scp_server_user: '{{ remote_scp_user }}' + remote_scp_server_password: '{{ remote_scp_password }}' + +- debug: + msg: '{{ item.key }} {{ item.value }}' + with_dict: '{{ result }}' + when: ki is defined diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/delete_files.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/delete_files.yaml new file mode 100644 index 00000000..9a947823 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/delete_files.yaml @@ -0,0 +1,10 @@ +--- +- name: Delete Files To Make Room On Bootflash + ignore_errors: true + with_items: '{{ delete_image_list }}' + cisco.nxos.nxos_config: + lines: + - terminal dont-ask + - allow delete boot-image + - delete {{ item }} + match: none diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml new file mode 100644 index 00000000..173332cd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml @@ -0,0 +1,5 @@ +--- +- name: Setup - Turn on feature scp-server + cisco.nxos.nxos_feature: + feature: scp-server + state: enabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_os.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_os.yaml new file mode 100644 index 00000000..6b7432ed --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_os.yaml @@ -0,0 +1,24 @@ +--- +- include: targets/nxos_install_os/tasks/upgrade/delete_files.yaml + when: delete_files + +- include: targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml ansible_connection=ansible.netcommon.network_cli + connection={{ cli }} + when: copy_images + +- include: targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml + when: ki is defined + +- include: targets/nxos_install_os/tasks/upgrade/install_system.yaml + when: ki is undefined + +- meta: reset_connection + +- name: Check installed OS for newly installed version {{ tv }} + register: output + cisco.nxos.nxos_command: + commands: + - show version | json + +- debug: msg="Version detected {{ output['stdout_lines'][0]['kickstart_ver_str'] + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_system.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_system.yaml new file mode 100644 index 00000000..af5580e9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_system.yaml @@ -0,0 +1,53 @@ +--- +- name: Install OS image {{ si }} + check_mode: '{{ checkmode }}' + register: result + when: not force + cisco.nxos.nxos_install_os: + system_image_file: '{{ si }}' + issu: '{{ issu }}' + +- name: Remove old boot pointers if any + ignore_errors: true + when: force + cisco.nxos.nxos_config: + lines: + - no boot nxos + - no boot kickstart + - no boot system + match: line + +- name: Set OS image {{ si }} boot pointers + when: force + cisco.nxos.nxos_config: + lines: + - boot nxos bootflash:{{ si }} + - copy run start + match: line + +- name: Boot image {{ si }} using reload + ignore_errors: true + when: force + cisco.nxos.nxos_config: + lines: + - terminal dont-ask + - reload + +- debug: msg=" {{ result['install_state'] }}" + when: not force + +- name: Wait for device to come back up with new image + wait_for: + port: 22 + state: started + timeout: 500 + delay: 60 + host: '{{ inventory_hostname }}' + when: result.changed and not checkmode + +- debug: msg='Wait 5 mins to allow system to stabilize' + when: result.changed and not checkmode + +- pause: + seconds: 300 + when: result.changed and not checkmode diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml new file mode 100644 index 00000000..fd0290f7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml @@ -0,0 +1,45 @@ +--- +- name: Install OS image {{ si }} + check_mode: '{{ checkmode }}' + register: result + when: not force + cisco.nxos.nxos_install_os: + system_image_file: '{{ si }}' + kickstart_image_file: '{{ ki }}' + issu: '{{ issu }}' + +- name: Set OS image {{ si }} boot pointers + when: force + cisco.nxos.nxos_config: + lines: + - no boot kickstart + - no boot system + - boot kickstart bootflash:{{ ki }} + - boot system bootflash:{{ si }} + - copy run start + match: line + +- name: Boot image {{ si }} using reload + ignore_errors: true + when: force + cisco.nxos.nxos_command: + commands: terminal dont-ask ; reload + +- debug: msg=" {{ result['install_state'] }}" + when: not force + +- name: Wait for device to come back up with new image + wait_for: + port: 22 + state: started + timeout: 500 + delay: 60 + host: '{{ inventory_hostname }}' + when: result.changed and not checkmode + +- debug: msg='Wait 5 mins to allow system to stabilize' + when: result.changed and not checkmode + +- pause: + seconds: 300 + when: result.changed and not checkmode diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/main_os_install.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/main_os_install.yaml new file mode 100644 index 00000000..5af834dc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tasks/upgrade/main_os_install.yaml @@ -0,0 +1,6 @@ +--- +- debug: msg="***WARNING*** Remove meta end_play to verify this module ***WARNING***" + +- meta: end_play + +- include: targets/nxos_install_os/tasks/upgrade/install_os.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade.yaml new file mode 100644 index 00000000..19deee85 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade.yaml @@ -0,0 +1,48 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/Users/mwiebe/Projects/nxos_ansible/images/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - nxos.7.0.3.I7.2.bin + - nxos.7.0.3.I7.3.bin + +- set_fact: si='n3000-uk9.6.0.2.U6.1a.bin' + +- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.1a.bin' + +- name: Upgrade to U6.1a + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml + +- set_fact: si='n3000-uk9.6.0.2.U6.2a.bin' + +- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.2a.bin' + +- name: Upgrade to U6.2a + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml + +- set_fact: si='n3000-s2-dk9.8.0.1.bin' + +- set_fact: ki='n3000-s2-kickstart.8.0.1.bin' + +- name: Upgrade to U6.3a + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml + +- set_fact: si='nxos.7.0.3.I7.2.bin' + +- name: Upgrade to 7.0.3.I7.2 + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml + +- debug: msg="END connection={{ ansible_connection }} nxos_os_install upgrade" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_greensboro.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_greensboro.yaml new file mode 100644 index 00000000..46b74442 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_greensboro.yaml @@ -0,0 +1,25 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/greensboro/REL_7_0_3_I7_4/' + +- set_fact: checkmode='no' + +- set_fact: issu='no' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - nxos*.bin + - n3000*.bin + +- set_fact: si='nxos.7.0.3.I7.4.bin' + +- name: Upgrade N3172 Device to Greensboro Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u61a.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u61a.yaml new file mode 100644 index 00000000..3b5f4b97 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u61a.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/602U6_1/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n3000*.bin + - nxos*.bin + +- set_fact: si='n3000-uk9.6.0.2.U6.1a.bin' + +- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.1a.bin' + +- name: Upgrade N3500 Device to U61a Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u62a.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u62a.yaml new file mode 100644 index 00000000..fbd6306b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u62a.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/602U6_2/' + +- set_fact: checkmode='no' + +- set_fact: issu='no' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n3000*.bin + - nxos*.bin + +- set_fact: si='n3000-uk9.6.0.2.U6.2a.bin' + +- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.2a.bin' + +- name: Upgrade N3500 Device to U62a Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u63a.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u63a.yaml new file mode 100644 index 00000000..b1a9afbd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n3172_u63a.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/602U6_3/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n3000*.bin + - nxos*.bin + +- set_fact: si='n3000-uk9.6.0.2.U6.3a.bin' + +- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.3a.bin' + +- name: Upgrade N3500 Device to U63a Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_62a88.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_62a88.yaml new file mode 100644 index 00000000..a2a2ebd0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_62a88.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/602A8_8/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n3000*.bin + - n3500*.bin + +- set_fact: si='n3500-uk9.6.0.2.A8.8.bin' + +- set_fact: ki='n3500-uk9-kickstart.6.0.2.A8.8.bin' + +- name: Upgrade N3500 Device to A8_8 Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_greensboro.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_greensboro.yaml new file mode 100644 index 00000000..b2274818 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n35_greensboro.yaml @@ -0,0 +1,25 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/greensboro/REL_7_0_3_I7_4/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=False + +- set_fact: force=False + +- set_fact: delete_files=False + +- set_fact: + delete_image_list: + - nxos*.bin + - n3500*.bin + +- set_fact: si='nxos.7.0.3.I7.4.bin' + +- name: Upgrade N3500 Device to Greensboro Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_730_N11.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_730_N11.yaml new file mode 100644 index 00000000..6e7ae774 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_730_N11.yaml @@ -0,0 +1,26 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/730_N11/' + +- set_fact: checkmode='no' + +- set_fact: issu='no' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n6000*.bin + +- set_fact: si='n6000-uk9.7.3.0.N1.1.bin' + +- set_fact: ki='n6000-uk9-kickstart.7.3.0.N1.1.bin' + +- name: Upgrade N5k Device to 7.3(0)N1(1) Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_733_N11.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_733_N11.yaml new file mode 100644 index 00000000..a18b3502 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n5k_733_N11.yaml @@ -0,0 +1,26 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/733_N11/' + +- set_fact: checkmode='no' + +- set_fact: issu='no' + +- set_fact: copy_images=False + +- set_fact: force=False + +- set_fact: delete_files=False + +- set_fact: + delete_image_list: + - n6000*.bin + +- set_fact: si='n6000-uk9.7.3.3.N1.1.bin' + +- set_fact: ki='n6000-uk9-kickstart.7.3.3.N1.1.bin' + +- name: Upgrade N5k Device to 7.3(3)N1(1) Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_atherton.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_atherton.yaml new file mode 100644 index 00000000..6e18ae19 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_atherton.yaml @@ -0,0 +1,26 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/atherton/REL_8_0_1/' + +- set_fact: checkmode='no' + +- set_fact: issu='no' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n7000*.bin + +- set_fact: si='n7000-s2-dk9.8.0.1.bin' + +- set_fact: ki='n7000-s2-kickstart.8.0.1.bin' + +- name: Upgrade N7k Device to Atherton Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_helsinki.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_helsinki.yaml new file mode 100644 index 00000000..d493c508 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n7k_helsinki.yaml @@ -0,0 +1,26 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/helsinki/REL_7_3_0_D1_1/' + +- set_fact: checkmode='no' + +- set_fact: issu='no' + +- set_fact: copy_images=True + +- set_fact: force=True + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - n7000*.bin + +- set_fact: si='n7000-s2-dk9.7.3.0.D1.1.bin' + +- set_fact: ki='n7000-s2-kickstart.7.3.0.D1.1.bin' + +- name: Upgrade N7k Device to Helsinki Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro.yaml new file mode 100644 index 00000000..c8753257 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro.yaml @@ -0,0 +1,34 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/greensboro/REL_7_0_3_I7_4/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - nxos*.bin + +- name: Unconfigure features that will conflict with upgrade + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - terminal dont-ask + - no feature nv overlay + - no nxapi ssl protocols + - no nxapi ssl ciphers weak + match: none + +- set_fact: si='nxos.7.0.3.I7.4.bin' + +- name: Upgrade N9k Device to Greensboro Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro_force.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro_force.yaml new file mode 100644 index 00000000..9649467f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_greensboro_force.yaml @@ -0,0 +1,34 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/greensboro/REL_7_0_3_I7_4/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=True + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - nxos*.bin + +- name: Unconfigure features that will conflict with upgrade + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - terminal dont-ask + - no feature nv overlay + - no nxapi ssl protocols + - no nxapi ssl ciphers weak + match: none + +- set_fact: si='nxos.7.0.3.I7.4.bin' + +- name: Upgrade N9k Device to Greensboro Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_hamilton.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_hamilton.yaml new file mode 100644 index 00000000..a9972b1e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_install_os/tests/common/upgrade_n9k_hamilton.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade" + when: connection is defined + +- set_fact: image_dir='/auto/fe_ssr/agents-ci/agents_images/release_images/hamilton/REL_9_2_1/' + +- set_fact: checkmode='no' + +- set_fact: issu='desired' + +- set_fact: copy_images=True + +- set_fact: force=False + +- set_fact: delete_files=True + +- set_fact: + delete_image_list: + - nxos*.bin + +- name: Unconfigure features that will conflict with upgrade + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - terminal dont-ask + - no feature ngmvpn + match: none + +- set_fact: si='nxos.9.2.1.bin' + +- name: Upgrade N9k Device to Hamilton Release Image + include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/intent.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/intent.yaml new file mode 100644 index 00000000..0d4502f4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/intent.yaml @@ -0,0 +1,69 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_interface intent test" + +- set_fact: testint1="{{ nxos_int1 }}" + +- set_fact: testint2="{{ nxos_int2 }}" + +- name: 'Setup: Put interfaces into a default state' + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - default interface {{ testint1 }} + - default interface {{ testint2 }} + +- name: Check intent arguments + register: result + cisco.nxos.nxos_interface: + name: '{{ testint2 }}' + admin_state: up + tx_rate: ge(0) + rx_rate: ge(0) + +- assert: + that: + - result.failed == false + +- name: Clear interface {{ testint2 }} counters before next task + ignore_errors: true + cisco.nxos.nxos_command: + commands: clear counters interface {{ testint2 }} + +- name: Check intent arguments (failed condition) + ignore_errors: true + register: result + cisco.nxos.nxos_interface: + name: '{{ testint2 }}' + admin_state: down + tx_rate: gt(10000) + rx_rate: lt(0) + +- assert: + that: + - result.failed == true + - "'tx_rate gt(10000)' in result.failed_conditions" + - "'rx_rate lt(0)' in result.failed_conditions" + +- name: aggregate definition of interface + register: result + cisco.nxos.nxos_interface: + aggregate: + + - name: '{{ testint1 }}' + description: Test aggregation on first interface + + - name: '{{ testint2 }}' + mode: layer3 + +- assert: + that: + - result.changed == true + +- name: 'TearDown: Put interfaces into a default state' + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - default interface {{ testint1 }} + - default interface {{ testint2 }} + +- debug: msg="END connection={{ ansible_connection }} nxos_interface intent test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..d9881325 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sanity.yaml @@ -0,0 +1,135 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_interface sanity test" + +- set_fact: testint="{{ nxos_int1 }}" + +- name: 'Setup: Enable feature interface-vlan' + ignore_errors: true + cisco.nxos.nxos_feature: + feature: interface-vlan + state: enabled + +- name: 'Setup: Put interface {{ testint }} into a default state' + ignore_errors: true + cisco.nxos.nxos_config: &id008 + lines: + - default interface {{ testint }} + +- name: 'Setup: Remove possibly existing vlan interfaces' + ignore_errors: true + cisco.nxos.nxos_config: &id009 + lines: + - no interface vlan 2 + - no interface vlan 710 + - no interface vlan 711 + - no interface vlan 712 + +- block: + + - name: Configure layer3 params + register: result + cisco.nxos.nxos_interface: &id001 + interface: '{{ testint }}' + mode: layer3 + description: Configured by Ansible - Layer3 + admin_state: up + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure layer2 params + register: result + cisco.nxos.nxos_interface: &id003 + interface: '{{ testint }}' + mode: layer2 + description: Configured by Ansible - Layer2 + admin_state: down + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface: *id003 + + - assert: *id004 + + - name: Create VLAN Interfaces + with_items: &id005 + + - os_svi_int: vlan2 + os_svi_desc: SVI_VLAN2 + + - os_svi_int: vlan710 + os_svi_desc: SVI_VLAN710 + + - os_svi_int: vlan711 + os_svi_desc: SVI_VLAN711 + + - os_svi_int: vlan712 + os_svi_desc: SVI_VLAN712 + register: result + cisco.nxos.nxos_interface: &id006 + interface: '{{ item.os_svi_int }}' + description: '{{ item.os_svi_desc }}' + + - assert: *id002 + + - name: Configure Required SVI + register: result + cisco.nxos.nxos_l3_interface: &id007 + aggregate: + + - name: vlan2 + ipv4: 192.168.2.1/24 + + - name: vlan710 + ipv4: 192.168.3.1/24 + + - name: vlan711 + ipv4: 192.168.4.1/24 + + - name: vlan712 + ipv4: 192.168.5.1/24 + + - assert: *id002 + + - name: Create VLAN Interfaces Idempotence Check + with_items: *id005 + register: result + cisco.nxos.nxos_interface: *id006 + + - assert: *id004 + + - name: Configure Required SVI Idempotence Check + register: result + cisco.nxos.nxos_l3_interface: *id007 + + - assert: *id004 + always: + + - name: Set interface back to default + ignore_errors: true + cisco.nxos.nxos_config: *id008 + + - name: Remove vlan interfaces + cisco.nxos.nxos_config: *id009 + + - name: 'Setup: Disable feature interface-vlan' + ignore_errors: true + cisco.nxos.nxos_feature: + feature: interface-vlan + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_absent.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_absent.yaml new file mode 100644 index 00000000..077d03fb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_absent.yaml @@ -0,0 +1,29 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/set_state_absent.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: + - interface Loopback1 + +- name: set state=absent + register: result + cisco.nxos.nxos_interface: + interface: Loopback1 + state: absent + +- assert: + that: + - result.changed == true + +- name: verify state=absent + register: result + cisco.nxos.nxos_interface: + interface: Loopback1 + state: absent + +- assert: + that: + - result.changed == false + +- debug: msg="END connection={{ ansible_connection }}/set_state_absent.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_present.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_present.yaml new file mode 100644 index 00000000..aed1b220 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/set_state_present.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/set_state_present.yaml" + +- name: setup + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no interface Loopback1 + +- name: set state=present + register: result + cisco.nxos.nxos_interface: + interface: Loopback1 + state: present + description: Configured by Ansible - Layer3 + +- assert: + that: + - result.changed == true + +- name: verify state=present + register: result + cisco.nxos.nxos_interface: + interface: Loopback1 + state: present + description: Configured by Ansible - Layer3 + +- assert: + that: + - result.changed == false + +- debug: msg="END connection={{ ansible_connection }}/set_state_present.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sub_int.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sub_int.yaml new file mode 100644 index 00000000..38e760b6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface/tests/common/sub_int.yaml @@ -0,0 +1,75 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_interface sub-interface + test" + +- set_fact: testint="{{ nxos_int1 }}" + +- name: Setup - delete sub-interface + ignore_errors: true + cisco.nxos.nxos_interface: &id003 + name: '{{ testint }}.20' + state: absent + +- name: Setup - Ensure the interface is layer3 + cisco.nxos.nxos_interface: + name: '{{ testint }}' + mode: layer3 + +- name: Create sub-interface + register: result + cisco.nxos.nxos_interface: &id001 + name: '{{ testint }}.20' + description: sub-interface Configured by Ansible + admin_state: up + mtu: 800 + +- assert: + that: + - result.changed == true + +- name: Create sub-interface (Idempotence) + register: result + cisco.nxos.nxos_interface: *id001 + +- assert: + that: + - result.changed == false + +- name: Make admin_state down + register: result + cisco.nxos.nxos_interface: &id002 + name: '{{ testint }}.20' + description: sub-interface Configured by Ansible + admin_state: down + mtu: 800 + +- assert: + that: + - result.changed == true + +- name: Create sub-interface (Idempotence) + register: result + cisco.nxos.nxos_interface: *id002 + +- assert: + that: + - result.changed == false + +- name: Remove sub-interface + register: result + cisco.nxos.nxos_interface: *id003 + +- assert: + that: + - result.changed == true + +- name: Remove sub-interface (Idempotence) + register: result + cisco.nxos.nxos_interface: *id003 + +- assert: + that: + - result.changed == false + +- debug: msg="END connection={{ ansible_connection }} nxos_interface sub-interface + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tests/common/sanity.yaml new file mode 100644 index 00000000..bf0d94b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interface_ospf/tests/common/sanity.yaml @@ -0,0 +1,295 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_interface_ospf sanity + test" + +- set_fact: testint="{{ nxos_int1 }}" + +- name: Setup - Disable features + loop: + - ospf + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- name: Setup - Enable features + loop: + - ospf + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: enabled + +- name: Put interface into default state + ignore_errors: true + cisco.nxos.nxos_config: &id013 + lines: + - default interface {{ testint }} + +- name: Remove switchport config + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no switchport + parents: + - interface {{ testint }} + +- name: Remove possibly existing port-channel and loopback ints + ignore_errors: true + cisco.nxos.nxos_config: &id014 + commands: + - no interface port-channel10 + - no interface port-channel11 + - no interface loopback55 + - no interface loopback77 + +- block: + + - name: configure ospf interface + register: result + cisco.nxos.nxos_interface_ospf: &id001 + interface: '{{ nxos_int1|upper }}' + ospf: 1 + area: 12345678 + bfd: enable + cost: 55 + passive_interface: true + hello_interval: 15 + dead_interval: 75 + network: point-to-point + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface_ospf: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Modify properties + register: result + cisco.nxos.nxos_interface_ospf: &id003 + interface: '{{ testint }}' + ospf: 1 + area: 12345678 + cost: 66 + passive_interface: false + hello_interval: 17 + dead_interval: 70 + network: broadcast + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface_ospf: *id003 + + - assert: *id004 + + - name: default properties + register: result + cisco.nxos.nxos_interface_ospf: &id005 + interface: '{{ testint }}' + ospf: 1 + area: 12345678 + bfd: default + cost: default + hello_interval: 10 + dead_interval: default + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface_ospf: *id005 + + - assert: *id004 + + - name: Message_digest properties + register: result + cisco.nxos.nxos_interface_ospf: &id006 + interface: '{{ testint }}' + ospf: 1 + area: 12345678 + message_digest: true + message_digest_key_id: 10 + message_digest_algorithm_type: md5 + message_digest_encryption_type: 3des + message_digest_password: b69f7bc54725b1bfd1ea93afa7b09400 + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface_ospf: *id006 + + - assert: *id004 + + - name: Message_digest defaults + register: result + cisco.nxos.nxos_interface_ospf: &id007 + interface: '{{ testint }}' + ospf: 1 + area: 12345678 + message_digest: false + message_digest_key_id: default + message_digest_algorithm_type: default + message_digest_encryption_type: default + message_digest_password: default + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface_ospf: *id007 + + - assert: *id004 + + - name: create port-channel and loopback interfaces + cisco.nxos.nxos_config: + commands: + - interface port-channel10 + - interface port-channel11 + - interface loopback55 + - interface loopback77 + match: none + + - name: Ensure port-channels are layer3 + with_items: + - port-channel10 + - port-channel11 + cisco.nxos.nxos_config: + commands: + - no switchport + parents: + - interface {{ item }} + + - name: configure ospf interface port-channel10 + register: result + cisco.nxos.nxos_interface_ospf: &id008 + interface: Port-channel10 + ospf: 1 + area: 429496729 + cost: 55 + passive_interface: true + hello_interval: 15 + dead_interval: 75 + state: present + + - assert: *id002 + + - name: Check Idempotence for port-channel10 + register: result + cisco.nxos.nxos_interface_ospf: *id008 + + - assert: *id004 + + - name: configure ospf interface port-channel11 using lower case name + register: result + cisco.nxos.nxos_interface_ospf: &id009 + interface: port-channel11 + ospf: 1 + area: 42949672 + cost: 55 + passive_interface: true + hello_interval: 15 + dead_interval: 75 + state: present + + - assert: *id002 + + - name: Check Idempotence for port-channel11 + register: result + cisco.nxos.nxos_interface_ospf: *id009 + + - assert: *id004 + + - name: configure ospf interface loopback55 + register: result + cisco.nxos.nxos_interface_ospf: &id010 + interface: LOOPBACK55 + ospf: 1 + area: 192.0.2.4 + cost: 55 + hello_interval: 15 + dead_interval: 75 + state: present + + - assert: *id002 + + - name: Check Idempotence for loopback55 + register: result + cisco.nxos.nxos_interface_ospf: *id010 + + - assert: *id004 + + - name: configure ospf interface loopback77 using lower case name + register: result + cisco.nxos.nxos_interface_ospf: &id011 + interface: loopback77 + ospf: 1 + area: 429496 + cost: 77 + hello_interval: 45 + dead_interval: 75 + state: present + + - assert: *id002 + + - name: Check Idempotence for loopback77 + register: result + cisco.nxos.nxos_interface_ospf: *id011 + + - assert: *id004 + + - name: remove ospf interface config + register: result + cisco.nxos.nxos_interface_ospf: &id012 + interface: '{{ testint }}' + ospf: 1 + area: 12345678 + bfd: disable + cost: 55 + passive_interface: true + hello_interval: 15 + dead_interval: 75 + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_interface_ospf: *id012 + + - assert: *id004 + always: + + - name: Disable features + loop: + - ospf + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + + - name: Interface cleanup + ignore_errors: true + cisco.nxos.nxos_config: *id013 + + - name: Remove port-channel and loopback ints + ignore_errors: true + cisco.nxos.nxos_config: *id014 + + - debug: msg="END connection={{ ansible_connection }} nxos_interface_ospf sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/main.yaml new file mode 100644 index 00000000..0138ecb8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/main.yaml @@ -0,0 +1,13 @@ +--- +- name: Set system defaults for switchports + cisco.nxos.nxos_config: + lines: "no system default switchport\nsystem default switchport shutdown\n" + connection: ansible.netcommon.network_cli + +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..b1da8bbe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,15 @@ +- name: "Populate config - {{ nxos_int1 }}" + cisco.nxos.nxos_config: + lines: + - "description outbound-intf" + - "switchport" + - "no shutdown" + parents: "interface {{ nxos_int1 }}" + +- name: "Populate config - {{ nxos_int2 }}" + cisco.nxos.nxos_config: + lines: + - "description intf-l3" + - "no switchport" + - "speed 1000" + parents: "interface {{ nxos_int2 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..7d4b12a0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,9 @@ +- name: Remove Config + cisco.nxos.nxos_config: + lines: + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + - "default interface {{ nxos_int3 }}" + - "no interface loopback1" + - "no interface loopback8" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..a573e245 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/deleted.yaml @@ -0,0 +1,66 @@ +--- +- debug: + msg: "Start nxos_interfaces deleted integration tests connection={{ ansible_connection }}" + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- set_fact: test_shutdown + when: platform is not search('N3[5KL]|N[56]K|titanium') + +- name: 'setup0: clean up (interfaces) attributes on all interfaces' + cisco.nxos.nxos_interfaces: + state: deleted + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: "default interface {{ test_int1 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int1 }}" + - " description Test-interface1" + - " no shutdown" + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: interfaces + + - name: deleted + register: result + cisco.nxos.nxos_interfaces: &id001 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.interfaces|symmetric_difference(result.before) == [] + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'no description' in result.commands" + + - assert: + that: + - result.after|length == 0 + - "'shutdown' in result.commands" + when: test_shutdown is defined + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + when: test_shutdown is defined + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..76036516 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..6aac19ea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/gathered.yaml @@ -0,0 +1,24 @@ +--- +- debug: + msg: START nxos_interfaces gathered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather interfaces facts from the device using nxos_interfaces + register: result + cisco.nxos.nxos_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'][:2] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_interfaces gathered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..254fcc12 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/merged.yaml @@ -0,0 +1,89 @@ +--- +- debug: + msg: "Start nxos_interfaces merged integration tests connection={{ ansible_connection }}" + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- set_fact: enabled=true + when: platform is not search('N3[5KL]|N[56]K|titanium') + +- block: + + - name: setup + cisco.nxos.nxos_config: &id002 + lines: + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + + - name: Merged + register: result + cisco.nxos.nxos_interfaces: &id001 + config: + + - name: '{{ test_int1 }}' + description: Configured by Ansible + enabled: '{{ enabled|default(omit)}}' + state: merged + + - assert: + that: + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'description Configured by Ansible' in result.commands" + + - assert: + that: + - "'no shutdown' in result.commands" + when: enabled is defined + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: interfaces + + - assert: + that: + - ansible_facts.network_resources.interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: "Populate {{ test_int2 }}" + cisco.nxos.nxos_config: + lines: + - "description Test" + - "switchport" + - "no shutdown" + parents: "interface {{ test_int2 }}" + + - name: Update interface state + cisco.nxos.nxos_interfaces: + config: + - name: "{{ test_int2 }}" + enabled: False + mode: layer2 + description: Test + state: merged + register: result + + - assert: + that: + - "'interface {{ test_int2 }}' in result.commands" + - "'shutdown' in result.commands" + - result.changed == True + - result.commands|length == 2 + + always: + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..906a2757 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/overridden.yaml @@ -0,0 +1,71 @@ +--- +- debug: + msg: "Start nxos_interfaces overridden integration tests connection={{ ansible_connection }}" + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- block: + + - name: setup1 + cisco.nxos.nxos_config: &id003 + lines: + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + + - block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int1 }}" + - " description Test-interface1" + - " no shutdown" + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: interfaces + + - name: Overridden + register: result + cisco.nxos.nxos_interfaces: &id002 + config: + - name: '{{ test_int2 }}' + description: Configured by Ansible + state: overridden + + - assert: + that: + - ansible_facts.network_resources.interfaces|symmetric_difference(result.before)|length + == 0 + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'shutdown' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'description Configured by Ansible' in result.commands" + + - name: Gather interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id003 + when: platform is not search('N3[5KL]|N[56]K|titanium') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..63b469af --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/parsed.yaml @@ -0,0 +1,31 @@ +--- +- debug: + msg: START nxos_interfaces parsed integration tests on connection={{ ansible_connection + }} + +- block: + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_interfaces: + running_config: | + interface Ethernet1/800 + description test-1 + speed 1000 + shutdown + no switchport + duplex half + interface Ethernet1/801 + description test-2 + switchport + no shutdown + mtu 1800 + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_interfaces parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..709940b1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rendered.yaml @@ -0,0 +1,46 @@ +--- +- debug: + msg: START nxos_interfaces rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- name: Gather pre-facts + cisco.nxos.nxos_facts: + gather_subset: ["!all", "!min"] + gather_network_resources: ["interfaces"] + +- block: + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_interfaces: + config: + - name: Ethernet1/1 + description: outbound-intf + mode: layer3 # Sys Default for rendered is assumed to be Layer3 - so no command should be sent + speed: 100 + - name: Ethernet1/2 + mode: layer2 + enabled: True # Sys Default for rendered is assumed to be disabled - so command should be sent + duplex: full + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather interfaces facts from the device and assert that nothing changed + register: result + cisco.nxos.nxos_interfaces: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered']|symmetric_difference(ansible_facts.network_resources.interfaces)|length + == 0}}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_interfaces rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..a085681c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/replaced.yaml @@ -0,0 +1,100 @@ +--- +- debug: + msg: "Start nxos_interfaces replaced integration tests connection={{ ansible_connection }}" + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- block: + + - name: setup1 + cisco.nxos.nxos_config: &id003 + lines: + - "default interface {{ test_int1 }}" + + - block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int1 }}" + - " description Test-interface1" + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: interfaces + + - name: Replaced + register: result + cisco.nxos.nxos_interfaces: &id002 + config: + - name: '{{ test_int1 }}' + description: Configured by Ansible + enabled: true + state: replaced + + - assert: + that: + - ansible_facts.network_resources.interfaces|symmetric_difference(result.before)|length + == 0 + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'description Configured by Ansible' in result.commands" + - "'no shutdown' in result.commands" + + - name: Gather interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: Reset interfaces + cisco.nxos.nxos_config: + lines: + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + - "interface {{ test_int1 }}" + - " description TEST-INTF-1" + - " speed 1000" + + - name: Replace (default existing and add new attributes) + cisco.nxos.nxos_interfaces: + config: + - name: "{{ test_int1 }}" + enabled: False + - name: "{{ test_int2 }}" + description: TEST-INTF-2 + enabled: True + state: replaced + register: result + + - assert: + that: + - "'interface {{ test_int1 }}' in result.commands" + - "'no description' in result.commands" + - "'no speed' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'description TEST-INTF-2' in result.commands" + - "'no shutdown' in result.commands" + - result.commands|length == 6 + + always: + + - name: teardown + cisco.nxos.nxos_config: *id003 + when: platform is not search('N3[5KL]|N[56]K|titanium') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rtt.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rtt.yaml new file mode 100644 index 00000000..8b52de4e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/tests/common/rtt.yaml @@ -0,0 +1,77 @@ +--- +- debug: + msg: START nxos_interfaces round trip integration tests on connection={{ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: Apply the provided configuration (Base config) + register: base_config + cisco.nxos.nxos_interfaces: + config: + - name: "{{ nxos_int1 }}" + description: TEST-INTF-1 + speed: 100 + + - name: "{{ nxos_int2 }}" + description: TEST-INTF-2 + mode: layer2 + + - name: "{{ nxos_int3 }}" + description: TEST-INTF-3 + mtu: 9216 + state: merged + tags: base_config + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - interfaces + + - name: Apply the provided configuration (config to be reverted) + register: result + cisco.nxos.nxos_interfaces: + config: + - name: "{{ nxos_int1 }}" + description: WRONG-TEST-INTF-1 + speed: 1000 + + - name: "{{ nxos_int2 }}" + description: WRONG-TEST-INTF-2 + + - name: "{{ nxos_int3 }}" + description: WRONG-TEST-INTF-3 + enabled: False + state: overridden + + - assert: + that: + - '"interface Ethernet1/1" in result.commands' + - '"description WRONG-TEST-INTF-1" in result.commands' + - '"speed 1000" in result.commands' + - '"interface Ethernet1/2" in result.commands' + - '"no switchport" in result.commands' + - '"description WRONG-TEST-INTF-2" in result.commands' + - '"interface Ethernet1/3" in result.commands' + - '"no mtu" in result.commands' + - '"description WRONG-TEST-INTF-3" in result.commands' + - result.commands|length == 9 + - result.changed == true + + - name: Revert back to base config using facts round trip + register: revert + cisco.nxos.nxos_interfaces: + config: "{{ ansible_facts['network_resources']['interfaces'] }}" + state: overridden + + - assert: + that: + - "{{ base_config['after'] == revert['after'] }}" + always: + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_interfaces round trip integration tests on connection={{ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/vars/main.yml new file mode 100644 index 00000000..016f0acd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_interfaces/vars/main.yml @@ -0,0 +1,31 @@ +gathered: + - name: "{{ nxos_int1 }}" + description: outbound-intf + mode: layer2 + enabled: True + - name: "{{ nxos_int2 }}" + description: intf-l3 + speed: "1000" + +rendered: + - "interface Ethernet1/1" + - "description outbound-intf" + - "speed 100" + - "interface Ethernet1/2" + - "switchport" + - "duplex full" + - "no shutdown" + +parsed: + - description: "test-1" + duplex: "half" + enabled: false + mode: "layer3" + name: "Ethernet1/800" + speed: "1000" + + - description: "test-2" + enabled: true + mode: "layer2" + mtu: "1800" + name: "Ethernet1/801" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/agg.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/agg.yaml new file mode 100644 index 00000000..eaa7bc38 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/agg.yaml @@ -0,0 +1,122 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_l2_interface aggregate + test" + +- set_fact: intname1="{{ nxos_int1 }}" + +- set_fact: intname2="{{ nxos_int2 }}" + +- name: Setup vlans + cisco.nxos.nxos_vlan: + vlan_range: 6,15 + +- name: Setup - Ensure interfaces are layer2 + cisco.nxos.nxos_interface: + aggregate: + + - name: '{{ intname1 }}' + + - name: '{{ intname2 }}' + mode: layer2 + +- name: Setup - Remove interface aggregate before testing + cisco.nxos.nxos_l2_interface: + aggregate: + + - name: '{{ intname1 }}' + mode: access + access_vlan: 6 + + - name: '{{ intname2 }}' + mode: access + access_vlan: 15 + state: absent + +- name: Sleep for 2 seconds on Fretta Platform + wait_for: timeout=2 + when: platform is match("N9K-F") + +- block: + + - name: Configure interface for access_vlan aggregate + register: result + cisco.nxos.nxos_l2_interface: &id001 + aggregate: + + - name: '{{ intname1 }}' + mode: access + access_vlan: 6 + + - name: '{{ intname2 }}' + mode: access + access_vlan: 15 + + - assert: + that: + - result.changed == true + + - name: Sleep for 2 seconds on Fretta Platform + wait_for: timeout=2 + when: platform is match("N9K-F") + + - name: Configure interface for access_vlan aggregate(Idempotence) + register: result + cisco.nxos.nxos_l2_interface: *id001 + + - assert: + that: + - result.changed == false + + - name: Remove interface aggregate + register: result + cisco.nxos.nxos_l2_interface: &id002 + aggregate: + + - name: '{{ intname1 }}' + mode: access + access_vlan: 6 + + - name: '{{ intname2 }}' + mode: access + access_vlan: 15 + state: absent + + - assert: + that: + - result.changed == true + + - name: Sleep for 2 seconds on Fretta Platform + wait_for: timeout=2 + when: platform is match("N9K-F") + + - name: Remove interface aggregate(Idempotence) + register: result + cisco.nxos.nxos_l2_interface: *id002 + + - assert: + that: + - result.changed == false + always: + + - name: remove vlans + ignore_errors: true + cisco.nxos.nxos_vlan: + vlan_range: 6,15 + state: absent + + - name: Remove interface aggregate after testing + ignore_errors: true + cisco.nxos.nxos_l2_interface: + aggregate: + + - name: '{{ intname1 }}' + mode: access + access_vlan: 6 + + - name: '{{ intname2 }}' + mode: access + access_vlan: 15 + state: absent + +- debug: msg="END connection={{ ansible_connection }} nxos_l2_interface aggregate + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..91084d13 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interface/tests/common/sanity.yaml @@ -0,0 +1,156 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_l2_interface sanity + test" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: Interface selected for this test + debug: msg="{{ intname }}" + +- name: Setup interface + ignore_errors: true + cisco.nxos.nxos_config: &id009 + lines: + - default interface {{ intname }} + +- name: Setup - Ensure interface is layer2 + cisco.nxos.nxos_interface: + interface: '{{ intname }}' + mode: layer2 + +- name: Setup vlans + cisco.nxos.nxos_vlan: + vlan_range: 5-10,20 + +- block: + + - name: Ensure interface is in its default switchport state + cisco.nxos.nxos_l2_interface: &id008 + name: '{{ intname }}' + state: unconfigured + + - name: Ensure interface is configured for access vlan 20 + register: result + cisco.nxos.nxos_l2_interface: &id001 + name: '{{ intname }}' + mode: access + access_vlan: 20 + + - assert: &id002 + that: + - result.changed == true + + - name: Sleep for 2 seconds on Fretta Platform + wait_for: timeout=2 + when: platform is match("N9K-F") + + - name: access vlan Idempotence + register: result + cisco.nxos.nxos_l2_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Ensure interface only has vlans 5-10 as trunk vlans + register: result + cisco.nxos.nxos_l2_interface: &id003 + name: '{{ intname }}' + mode: trunk + native_vlan: 10 + trunk_allowed_vlans: 5-10 + + - assert: *id002 + + - name: trunk vlan Idempotence + register: result + cisco.nxos.nxos_l2_interface: *id003 + + - assert: *id004 + + - name: Ensure interface is a trunk port and ensure 2-50 are being tagged (doesn't + mean others aren't also being tagged) + register: result + cisco.nxos.nxos_l2_interface: &id005 + name: '{{ intname }}' + mode: trunk + native_vlan: 10 + trunk_vlans: 2-50 + + - assert: *id002 + + - name: tag vlan Idempotence + register: result + cisco.nxos.nxos_l2_interface: *id005 + + - assert: *id004 + + - name: Remove full trunk vlan range 2-50 + register: result + cisco.nxos.nxos_l2_interface: &id006 + name: '{{ intname }}' + mode: trunk + trunk_vlans: 2-50 + state: absent + + - assert: *id002 + + - name: Check Idempotence Remove full trunk vlan range 2-50 + register: result + cisco.nxos.nxos_l2_interface: *id006 + + - assert: *id004 + + - name: Reconfigure interface trunk port and ensure 2-50 are being tagged + register: result + cisco.nxos.nxos_l2_interface: *id005 + + - assert: *id002 + + - name: Check Idempotence Reconfigure interface trunk port and ensure 2-50 are + being tagged + register: result + cisco.nxos.nxos_l2_interface: *id005 + + - assert: *id004 + + - name: Remove partial trunk vlan range 30-4094 are removed + register: result + cisco.nxos.nxos_l2_interface: &id007 + name: '{{ intname }}' + mode: trunk + trunk_vlans: 30-4094 + state: absent + + - assert: *id002 + + - name: Check Idempotence Remove partial trunk vlan range 30-4094 are removed + register: result + cisco.nxos.nxos_l2_interface: *id007 + + - assert: *id004 + + - name: put interface default state + register: result + cisco.nxos.nxos_l2_interface: *id008 + + - assert: *id002 + + - name: default state idempotence + register: result + cisco.nxos.nxos_l2_interface: *id008 + + - assert: *id004 + always: + + - name: remove vlans + ignore_errors: true + cisco.nxos.nxos_vlan: + vlan_range: 5-10,20 + state: absent + + - name: default interface + ignore_errors: true + cisco.nxos.nxos_config: *id009 + +- debug: msg="END connection={{ ansible_connection }} nxos_l2_interface sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/main.yaml new file mode 100644 index 00000000..29193c00 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/main.yaml @@ -0,0 +1,7 @@ +--- +- include: cli.yaml + tags: + - cli +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..7c9a1c1c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,18 @@ +- name: Populate interface - 1 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport access vlan 6" + - "switchport trunk allowed vlan 200" + parents: "interface {{ nxos_int1 }}" + vars: + ansible_connection: ansible.netcommon.network_cli + +- name: Populate interface - 2 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport trunk native vlan 10" + parents: "interface {{ nxos_int2 }}" + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..dc451877 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,8 @@ +- name: Cleanup + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..159cd5ce --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/deleted.yaml @@ -0,0 +1,69 @@ +--- +- debug: + msg: Start nxos_l2_interfaces deleted integration tests connection={{ ansible_connection }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: &id002 + lines: + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport trunk native vlan 10" + parents: "interface {{ test_int1 }}" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport mode trunk" + - "switchport trunk allowed vlan 20" + parents: "interface {{ test_int2 }}" + + - name: Gather l2_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l2_interfaces + + - name: deleted + register: result + cisco.nxos.nxos_l2_interfaces: &id001 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.l2_interfaces|symmetric_difference(result.before)|length + == 0 + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'no switchport trunk native vlan' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'no switchport mode' in result.commands" + - "'no switchport trunk allowed vlan' in result.commands" + - result.commands|length == 5 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_l2_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..58da74ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_lacp empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l2_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l2_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l2_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l2_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l2_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_lacp empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..202112e9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START nxos_l2_interfaces gathered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather l2_interfaces facts from the device using nxos_l2_interfaces + register: result + cisco.nxos.nxos_l2_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'][:2] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_l2_interfaces gathered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..91f7624b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/merged.yaml @@ -0,0 +1,103 @@ +--- +- debug: + msg: Start nxos_l2_interfaces merged integration tests connection={{ ansible_connection }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: &id003 + lines: + - "default interface {{ test_int1 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int1 }}" + - " switchport" + + - name: Merged + register: result + cisco.nxos.nxos_l2_interfaces: &id001 + config: + - name: '{{ test_int1 }}' + access: + vlan: 6 + trunk: + allowed_vlans: 200 + state: merged + + - assert: + that: + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'switchport access vlan 6' in result.commands" + - "'switchport trunk allowed vlan 200' in result.commands" + - result.commands|length == 3 + + - name: Gather l2_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l2_interfaces + + - assert: + that: + - ansible_facts.network_resources.l2_interfaces|symmetric_difference(result.after) == [] + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_l2_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: Merge with existing vlans + register: result + cisco.nxos.nxos_l2_interfaces: &id002 + config: + + - name: '{{ test_int1 }}' + mode: trunk + trunk: + allowed_vlans: 10-12 + state: merged + + - assert: + that: + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'switchport mode trunk' in result.commands" + - "'switchport trunk allowed vlan add 10,11,12' in result.commands" + - result.commands|length == 3 + + - name: Gather l2_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l2_interfaces + + - assert: + that: + - ansible_facts.network_resources.l2_interfaces|symmetric_difference(result.after) == [] + + - name: Idempotence - with newly added vlans + register: result + cisco.nxos.nxos_l2_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..44e7e1b9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/overridden.yaml @@ -0,0 +1,79 @@ +--- +- debug: + msg: Start nxos_l2_interfaces overridden integration tests connection={{ ansible_connection }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: &id003 + lines: + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport trunk allowed vlan 11" + parents: "interface {{ test_int1 }}" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "switchport" + parents: "interface {{ test_int2 }}" + + - name: Gather l2_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: l2_interfaces + + - name: Overridden + register: result + cisco.nxos.nxos_l2_interfaces: &id002 + config: + + - name: '{{ test_int2 }}' + access: + vlan: 6 + trunk: + allowed_vlans: 10-12 + state: overridden + + - assert: + that: + - ansible_facts.network_resources.l2_interfaces|symmetric_difference(result.before) == [] + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'no switchport trunk allowed vlan' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'switchport access vlan 6' in result.commands" + - "'switchport trunk allowed vlan 10,11,12' in result.commands" + + - name: Gather l2_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.l2_interfaces|symmetric_difference(result.after) == [] + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_l2_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..96b13bc5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/parsed.yaml @@ -0,0 +1,35 @@ +--- +- debug: + msg: START nxos_l2_interfaces parsed integration tests on connection={{ ansible_connection + }} + +- block: + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_l2_interfaces: + running_config: | + interface nve1 + no shutdown + host-reachability protocol bgp + advertise virtual-rmac + source-interface loopback1 + interface Ethernet1/800 + switchport access vlan 18 + switchport trunk allowed vlan 210 + interface Ethernet1/801 + switchport trunk allowed vlan 2,4,15 + interface Ethernet1/802 + switchport mode fex-fabric + interface Ethernet1/803 + switchport mode fabricpath + interface loopback1 + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_l2_interfaces parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..80bd0011 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rendered.yaml @@ -0,0 +1,52 @@ +--- +- debug: + msg: START nxos_l2_interfaces rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- name: Gather pre-facts + cisco.nxos.nxos_facts: + gather_subset: ['!all', '!min'] + gather_network_resources: l2_interfaces + +- block: + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_l2_interfaces: + config: + - name: Ethernet1/1 + trunk: + native_vlan: 10 + allowed_vlans: 2,4,15 + - name: Ethernet1/2 + access: + vlan: 30 + - name: Ethernet1/3 + trunk: + native_vlan: 20 + allowed_vlans: 5-10, 15 + - name: Ethernet1/4 + mode: fex-fabric + - name: Ethernet1/5 + mode: fabricpath + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather l2_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_l2_interfaces: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered']|symmetric_difference(ansible_facts.network_resources.l2_interfaces) == [] }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_l2_interfaces rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..243358db --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/replaced.yaml @@ -0,0 +1,83 @@ +--- +- debug: + msg: Start nxos_l2_interfaces replaced integration tests connection={{ ansible_connection }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: &id003 + lines: + - "default interface {{ test_int1 }}" + - "default interface {{ test_int2 }}" + +- block: + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport access vlan 5" + parents: "interface {{ test_int1 }}" + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "switchport" + - "switchport trunk native vlan 15" + - "switchport trunk allowed vlan 25-27" + parents: "interface {{ test_int2 }}" + + - name: Gather l2_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: l2_interfaces + + - name: Replaced + register: result + cisco.nxos.nxos_l2_interfaces: &id002 + config: + - name: '{{ test_int1 }}' + access: + vlan: 8 + trunk: + allowed_vlans: 10-12 + + - name: '{{ test_int2 }}' + trunk: + allowed_vlans: 25-27 + state: replaced + + - assert: + that: + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'switchport access vlan 8' in result.commands" + - "'switchport trunk allowed vlan 10,11,12' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'no switchport trunk native vlan' in result.commands" + - result.commands|length == 5 + + - name: Gather l2_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.l2_interfaces|symmetric_difference(result.after) == [] + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_l2_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rtt.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rtt.yaml new file mode 100644 index 00000000..9151442b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/tests/common/rtt.yaml @@ -0,0 +1,74 @@ +--- +- debug: + msg: START nxos_l2_interfaces round trip integration tests on connection={{ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: Prepare interfaces (switch to L2) + cisco.nxos.nxos_interfaces: + config: + - name: "{{ nxos_int1 }}" + mode: layer2 + - name: "{{ nxos_int2 }}" + mode: layer2 + - name: "{{ nxos_int3 }}" + mode: layer2 + state: merged + + - name: Apply the provided configuration (Base config) + register: base_config + cisco.nxos.nxos_l2_interfaces: + config: + - name: "{{ nxos_int1 }}" + trunk: + native_vlan: 10 + allowed_vlans: 2,4,15 + - name: "{{ nxos_int2 }}" + access: + vlan: 30 + state: merged + tags: base_config + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - l2_interfaces + + - name: Apply the provided configuration (config to be reverted) + register: result + cisco.nxos.nxos_l2_interfaces: + config: + - name: "{{ nxos_int1 }}" + trunk: + native_vlan: 20 + - name: "{{ nxos_int2 }}" + access: + vlan: 31 + - name: "{{ nxos_int3 }}" + trunk: + native_vlan: 20 + allowed_vlans: 5-10, 15 + state: overridden + + - assert: + that: + - result.changed == true + + - name: Revert back to base config using facts round trip + register: revert + cisco.nxos.nxos_l2_interfaces: + config: "{{ ansible_facts['network_resources']['l2_interfaces'] }}" + state: overridden + + - assert: + that: + - "{{ base_config['after'] == revert['after'] }}" + always: + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_l2_interfaces round trip integration tests on connection={{ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/vars/main.yml new file mode 100644 index 00000000..ffba3095 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l2_interfaces/vars/main.yml @@ -0,0 +1,40 @@ +gathered: + - name: "{{ nxos_int1 }}" + access: + vlan: 6 + trunk: + allowed_vlans: "200" + + - name: "{{ nxos_int2 }}" + trunk: + native_vlan: 10 + +parsed: + - name: nve1 + - name: Ethernet1/800 + access: + vlan: 18 + trunk: + allowed_vlans: "210" + - name: Ethernet1/801 + trunk: + allowed_vlans: "2,4,15" + - name: Ethernet1/802 + mode: fex-fabric + - name: Ethernet1/803 + mode: fabricpath + - name: loopback1 + +rendered: + - "interface Ethernet1/1" + - "switchport trunk allowed vlan 2,4,15" + - "switchport trunk native vlan 10" + - "interface Ethernet1/2" + - "switchport access vlan 30" + - "interface Ethernet1/3" + - "switchport trunk allowed vlan 5,6,7,8,9,10,15" + - "switchport trunk native vlan 20" + - "interface Ethernet1/4" + - "switchport mode fex-fabric" + - "interface Ethernet1/5" + - "switchport mode fabricpath" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/cli/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/cli/sanity.yaml new file mode 100644 index 00000000..d36376fe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/cli/sanity.yaml @@ -0,0 +1,125 @@ +--- +- debug: msg="START TRANSPORT:CLI nxos_l3_interface sanity test" + +- set_fact: testint2="{{ nxos_int2 }}" + +- set_fact: testint3="{{ nxos_int3 }}" + +- set_fact: ipv6_address="" + +- set_fact: ipv6_address="33:db::2/8" + when: ipv6_supported + +- name: Setup - remove address from interface prior to testing(Part1) + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no ip address 192.168.22.1/24 + parents: no switchport + before: interface {{ testint2 }} + +- name: Setup - remove address from interface prior to testing(Part2) + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no ip address 192.168.20.1/24 + - no ipv6 address 33:db::2/8 + parents: no switchport + before: interface {{ testint3 }} + +- name: Setup - Ensure interfaces are layer3 + cisco.nxos.nxos_interface: + aggregate: + + - name: '{{ testint2 }}' + + - name: '{{ testint3 }}' + mode: layer3 + +- name: Configure ipv4 address to interface + register: result + cisco.nxos.nxos_l3_interface: &id001 + name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + +- assert: + that: + - result.changed == true + +- name: Configure ipv4 address to interface(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id001 + +- assert: + that: + - result.changed == false + +- name: Remove ipv4 address from interface + register: result + cisco.nxos.nxos_l3_interface: &id002 + name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + state: absent + +- assert: + that: + - result.changed == true + +- name: Remove ipv4 address from interface(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id002 + +- assert: + that: + - result.changed == false + +- name: Configure address to interfaces aggregate + register: result + cisco.nxos.nxos_l3_interface: &id003 + aggregate: + + - name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + + - name: '{{ testint3 }}' + ipv4: 192.168.20.1/24 + ipv6: '{{ ipv6_address }}' + +- assert: + that: + - result.changed == true + +- name: Configure address to interfaces aggregate(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id003 + +- assert: + that: + - result.changed == false + +- name: Remove address from interfaces aggregate + register: result + cisco.nxos.nxos_l3_interface: &id004 + aggregate: + + - name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + + - name: '{{ testint3 }}' + ipv4: 192.168.20.1/24 + ipv6: '{{ ipv6_address }}' + state: absent + +- assert: + that: + - result.changed == true + +- name: Remove address from interfaces aggregate(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id004 + +- assert: + that: + - result.changed == false + +- debug: msg="END TRANSPORT:CLI nxos_l3_interface sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/nxapi/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/nxapi/sanity.yaml new file mode 100644 index 00000000..903da370 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interface/tests/nxapi/sanity.yaml @@ -0,0 +1,121 @@ +--- +- debug: msg="START TRANSPORT:NXAPI nxos_l3_interface sanity test" + +- set_fact: testint2="{{ nxos_int2 }}" + +- set_fact: testint3="{{ nxos_int3 }}" + +- set_fact: ipv6_address="" + +- set_fact: ipv6_address="33:db::2/8" + when: ipv6_supported + +- name: Setup - Remove address from interfaces aggregate + ignore_errors: true + cisco.nxos.nxos_l3_interface: + aggregate: + + - name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + + - name: '{{ testint3 }}' + ipv4: 192.168.20.1/24 + ipv6: '{{ ipv6_address }}' + state: absent + +- name: Setup - Ensure interfaces are layer3 + cisco.nxos.nxos_interface: + aggregate: + + - name: '{{ testint2 }}' + + - name: '{{ testint3 }}' + mode: layer3 + +- name: Configure ipv4 address to interface + register: result + cisco.nxos.nxos_l3_interface: &id001 + name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + +- assert: + that: + - result.changed == true + +- name: Configure ipv4 address to interface(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id001 + +- assert: + that: + - result.changed == false + +- name: Remove ipv4 address from interface + register: result + cisco.nxos.nxos_l3_interface: &id002 + name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + state: absent + +- assert: + that: + - result.changed == true + +- name: Remove ipv4 address from interface(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id002 + +- assert: + that: + - result.changed == false + +- name: Configure address to interfaces aggregate + register: result + cisco.nxos.nxos_l3_interface: &id003 + aggregate: + + - name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + + - name: '{{ testint3 }}' + ipv4: 192.168.20.1/24 + ipv6: '{{ ipv6_address }}' + +- assert: + that: + - result.changed == true + +- name: Configure address to interfaces aggregate(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id003 + +- assert: + that: + - result.changed == false + +- name: Remove address from interfaces aggregate + register: result + cisco.nxos.nxos_l3_interface: &id004 + aggregate: + + - name: '{{ testint2 }}' + ipv4: 192.168.22.1/24 + + - name: '{{ testint3 }}' + ipv4: 192.168.20.1/24 + ipv6: '{{ ipv6_address }}' + state: absent + +- assert: + that: + - result.changed == true + +- name: Remove address from interfaces aggregate(Idempotence) + register: result + cisco.nxos.nxos_l3_interface: *id004 + +- assert: + that: + - result.changed == false + +- debug: msg="END TRANSPORT:NXAPI nxos_l3_interface sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/main.yaml new file mode 100644 index 00000000..8eefce04 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- set_fact: + rsvd_intf: "{{ rsvd_intf|default('mgmt0') }}" + +- block: + - include: cli.yaml + tags: + - cli + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..8d5e2a39 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,17 @@ +- name: Populate config - 1 + cisco.nxos.nxos_config: + lines: + - "interface {{ nxos_int1 }}" + - " no switchport" + - " ip redirects" + - " ip address 192.0.2.100/24" + +- name: Populate config - 2 + cisco.nxos.nxos_config: + lines: + - "interface {{ nxos_int2 }}" + - " no switchport" + - " no ip redirects" + - " ip unreachables" + - " ip address 203.0.113.10/24" + - " ipv6 address 2001:db8::1/32" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..1bad31bc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,7 @@ +- name: Remove Config + cisco.nxos.nxos_config: + lines: + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + - "default interface {{ nxos_int3 }}" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..30e67f61 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/deleted.yaml @@ -0,0 +1,70 @@ +--- +- debug: + msg: Start nxos_l3_interfaces deleted integration tests connection={{ ansible_connection }} + +- set_fact: + test_int3: '{{ nxos_int3 }}' + subint3: '{{ nxos_int3 }}.42' + +- include_tasks: _remove_config.yaml + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "default interface {{ test_int3 }}" + - "interface {{ test_int3 }}" + - " no switchport" + +- block: + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ subint3 }}" + - " encapsulation dot1q 42" + - " ip address 192.168.10.2/24" + - " no ip redirects" + - " ip unreachables" + + - name: Gather l3_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - name: deleted + register: result + cisco.nxos.nxos_l3_interfaces: &id001 + config: + - name: "{{ subint3 }}" + state: deleted + + - assert: + that: + - result.before|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + - result.changed == true + - "'interface {{ subint3 }}' in result.commands" + - "'no encapsulation dot1q' in result.commands" + - "'ip redirects' in result.commands" + - "'no ip unreachables' in result.commands" + - "'no ip address' in result.commands" + - result.commands|length == 5 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_l3_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no interface {{ subint3 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..41aec5d7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_l3_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l3_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l3_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l3_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l3_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_l3_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_l3_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..3fbc4e54 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/gathered.yaml @@ -0,0 +1,24 @@ +--- +- debug: + msg: START nxos_l3_interfaces gathered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather l3_interfaces facts from the device using nxos_l3_interfaces + register: result + cisco.nxos.nxos_l3_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'][:2] | symmetric_difference(gathered)\ + \ |length == 0 }}" + + always: + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_l3_interfaces gathered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..2b652d79 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/merged.yaml @@ -0,0 +1,73 @@ +--- +- debug: + msg: Start nxos_l3_interfaces merged integration tests connection={{ ansible_connection }} + +- set_fact: + test_int3: '{{ nxos_int3 }}' + subint3: '{{ nxos_int3 }}.42' + +- include_tasks: _remove_config.yaml + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "default interface {{ test_int3 }}" + - "interface {{ test_int3 }}" + - " no switchport" + +- block: + + - name: Merged + register: result + cisco.nxos.nxos_l3_interfaces: &id001 + config: + + - name: '{{ subint3 }}' + dot1q: 42 + redirects: false + unreachables: true + ipv4: + + - address: 192.168.10.2/24 + state: merged + + - assert: + that: + - result.changed == true + - "'interface {{ subint3 }}' in result.commands" + - "'encapsulation dot1q 42' in result.commands" + - "'no ip redirects' in result.commands" + - "'ip unreachables' in result.commands" + - "'ip address 192.168.10.2/24' in result.commands" + - result.commands|length == 5 + + - name: Gather l3_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - assert: + that: + - result.after|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_l3_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown sub-interface + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no interface {{ subint3 }}" + + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/multisite.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/multisite.yaml new file mode 100644 index 00000000..c847d90b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/multisite.yaml @@ -0,0 +1,379 @@ +--- +- debug: + msg: Start nxos_l3_interfaces multisite integration tests connection={{ ansible_connection }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + test_int3: '{{ nxos_int3 }}' + +- include_tasks: _remove_config.yaml + +- name: Enable feature nv overlay - multisite + cisco.nxos.nxos_config: + commands: + - no feature nv overlay + - feature nv overlay + match: none + +- name: Enable nv overlay evpn - multisite + when: platform is search('N9K') + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + +- name: Enable multisite border gateway - multisite + ignore_errors: true + register: multiout + cisco.nxos.nxos_config: + lines: + - evpn multisite border-gateway 10 + +- block: + + - name: setup1 - deleted + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "default interface {{ test_int3 }}" + - "interface {{ test_int3 }}" + - " no switchport" + + - name: setup3 - deleted + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int3 }}" + - " ip address 192.168.10.2/24" + - " no ip redirects" + - " ip unreachables" + - " evpn multisite dci-tracking" + + - name: Gather l3_interfaces facts deleted + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - name: deleted + register: result + cisco.nxos.nxos_l3_interfaces: &id001 + config: + - name: "{{ test_int3 }}" + state: deleted + + - assert: + that: + - result.before|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + - result.changed == true + - "'interface {{ test_int3 }}' in result.commands" + - "'ip redirects' in result.commands" + - "'no ip unreachables' in result.commands" + - "'no ip address' in result.commands" + - "'no evpn multisite dci-tracking' in result.commands" + - result.commands|length == 5 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_l3_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - include_tasks: _remove_config.yaml + + - name: setup1 - merged + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "default interface {{ test_int3 }}" + - "interface {{ test_int3 }}" + - " no switchport" + + - name: Merged + register: result + cisco.nxos.nxos_l3_interfaces: &id002 + config: + + - name: '{{ test_int3 }}' + redirects: false + unreachables: true + evpn_multisite_tracking: fabric-tracking + ipv4: + + - address: 192.168.10.2/24 + state: merged + + - assert: + that: + - result.changed == true + - "'interface {{ test_int3 }}' in result.commands" + - "'no ip redirects' in result.commands" + - "'ip unreachables' in result.commands" + - "'ip address 192.168.10.2/24' in result.commands" + - "'evpn multisite fabric-tracking' in result.commands" + - result.commands|length == 5 + + - name: Gather l3_interfaces facts - merged + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - assert: + that: + - result.after|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_l3_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - include_tasks: _remove_config.yaml + + - name: setup1 - replaced + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "default interface {{ test_int3 }}" + - "interface {{ test_int3 }}" + - " no switchport" + + - name: setup3 - replaced + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int3 }}" + - " ip address 192.168.10.2/24" + - " no ip redirects" + - " ip unreachables" + - " evpn multisite dci-tracking" + + - name: Gather l3_interfaces facts + cisco.nxos.nxos_facts: &id003 + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - name: Replaced + register: result + cisco.nxos.nxos_l3_interfaces: &id004 + config: + + - name: '{{ test_int3 }}' + redirects: false + unreachables: false + evpn_multisite_tracking: fabric-tracking + ipv4: + + - address: 192.168.20.2/24 + tag: 5 + + - address: 192.168.200.2/24 + secondary: true + state: replaced + + - assert: + that: + - result.before|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + - result.changed == true + - "'interface {{ test_int3 }}' in result.commands" + - "'no ip unreachables' in result.commands" + - "'ip address 192.168.20.2/24 tag 5' in result.commands" + - "'ip address 192.168.200.2/24 secondary' in result.commands" + - "'evpn multisite fabric-tracking' in result.commands" + - result.commands|length == 5 + + - name: Gather l3_interfaces post facts + cisco.nxos.nxos_facts: *id003 + + - assert: + that: + - result.after|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_l3_interfaces: *id004 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - include_tasks: _remove_config.yaml + + - name: setup1 - overidden + ignore_errors: true + cisco.nxos.nxos_config: &id005 + lines: + - "no system default switchport" + - "default interface {{ item }}" + - "interface {{ item }}" + - " no switchport" + loop: + - "{{ test_int1 }}" + - "{{ test_int2 }}" + - "{{ test_int3 }}" + + - name: setup3 - overidden + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int1 }}" + - " ip address 192.168.10.2/24 tag 5" + - " evpn multisite fabric-tracking" + - "interface {{ test_int2 }}" + - " ip address 10.1.1.1/24" + - " evpn multisite dci-tracking" + + - name: Gather l3_interfaces facts + cisco.nxos.nxos_facts: &id006 + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - name: Store reserved interface IP config + set_fact: + mgmt: "{{ ansible_facts.network_resources.l3_interfaces|selectattr('name', 'equalto', rsvd_intf)|list }}" + overriden_config: + - name: '{{ test_int3 }}' + ipv4: + - address: 10.1.1.3/24 + evpn_multisite_tracking: dci-tracking + + - name: Overridden + register: result + cisco.nxos.nxos_l3_interfaces: &id007 + config: "{{ overriden_config + mgmt }}" + state: overridden + + - assert: + that: + - result.before|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'no ip address' in result.commands" + - "'no evpn multisite fabric-tracking' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'no ip address' in result.commands" + - "'no evpn multisite dci-tracking' in result.commands" + - "'interface {{ test_int3 }}' in result.commands" + - "'ip address 10.1.1.3/24' in result.commands" + - "'evpn multisite dci-tracking' in result.commands" + - result.commands|length == 9 + + - name: Gather l3_interfaces post facts + cisco.nxos.nxos_facts: *id006 + + - assert: + that: + - result.after|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_l3_interfaces: *id007 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: teardown - overdidden + ignore_errors: true + cisco.nxos.nxos_config: *id005 + loop: + - "{{ test_int1 }}" + - "{{ test_int2 }}" + - "{{ test_int3 }}" + + - name: Gather pre-facts + cisco.nxos.nxos_facts: + gather_subset: ['!all', '!min'] + gather_network_resources: l3_interfaces + + # Interfaces used here doesn't actually exist on the device + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/800 + ipv4: + - address: 192.168.1.100/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: True + tag: 10 + evpn_multisite_tracking: fabric-tracking + - name: Ethernet1/800 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + evpn_multisite_tracking: dci-tracking + state: rendered + + - assert: + that: "{{ rendered_multi | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather l3_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_l3_interfaces: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the device + assert: + that: "{{ result['gathered']|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] }}" + + - include_tasks: _remove_config.yaml + + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_l3_interfaces: + running_config: | + interface Ethernet1/800 + ip address 192.168.1.100/24 tag 5 + ip address 10.1.1.1/24 secondary tag 10 + no ip redirects + evpn multisite fabric-tracking + interface Ethernet1/801 + ipv6 address fd5d:12c9:2201:2::1/64 tag 6 + ip unreachables + evpn multisite dci-tracking + interface mgmt0 + ip address dhcp + vrf member management + state: parsed + + - assert: + that: "{{ parsed_multi | symmetric_difference(result['parsed']) |length==0\ + \ }}" + + when: multiout is not search("Invalid command") + +- name: Disable nv overlay evpn + when: platform is search('N9K') + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no nv overlay evpn + match: none + +- name: Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nve + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_l3_interfaces multisite test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..b05d613d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/overridden.yaml @@ -0,0 +1,91 @@ +--- +- debug: + msg: Start nxos_l3_interfaces overridden integration tests connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + test_int3: "{{ nxos_int3 }}" + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: &id003 + lines: + - "no system default switchport" + - "default interface {{ item }}" + - "interface {{ item }}" + - " no switchport" + loop: + - "{{ test_int1 }}" + - "{{ test_int2 }}" + - "{{ test_int3 }}" + +- block: + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ test_int1 }}" + - " ip address 192.168.10.2/24 tag 5" + - "interface {{ test_int2 }}" + - " ip address 10.1.1.1/24" + + - name: Gather l3_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - name: Store reserved interface IP config + set_fact: + mgmt: "{{ ansible_facts.network_resources.l3_interfaces|selectattr('name', 'equalto', rsvd_intf)|list }}" + overriden_config: + - name: '{{ test_int3 }}' + ipv4: + - address: 10.1.1.3/24 + + - name: Overridden + register: result + cisco.nxos.nxos_l3_interfaces: &id002 + config: "{{ overriden_config + mgmt }}" + state: overridden + + - assert: + that: + - result.before|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + - result.changed == true + - "'interface {{ test_int1 }}' in result.commands" + - "'no ip address' in result.commands" + - "'interface {{ test_int2 }}' in result.commands" + - "'no ip address' in result.commands" + - "'interface {{ test_int3 }}' in result.commands" + - "'ip address 10.1.1.3/24' in result.commands" + - result.commands|length == 6 + + - name: Gather l3_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - result.after|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_l3_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id003 + loop: + - "{{ test_int1 }}" + - "{{ test_int2 }}" + - "{{ test_int3 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..84deae97 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/parsed.yaml @@ -0,0 +1,30 @@ +--- +- debug: + msg: START nxos_l3_interfaces parsed integration tests on connection={{ ansible_connection + }} + +- block: + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_l3_interfaces: + running_config: | + interface Ethernet1/800 + ip address 192.168.1.100/24 tag 5 + ip address 10.1.1.1/24 secondary tag 10 + no ip redirects + interface Ethernet1/801 + ipv6 address fd5d:12c9:2201:2::1/64 tag 6 + ip unreachables + interface mgmt0 + ip address dhcp + vrf member management + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_l3_interface parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..cda45f09 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rendered.yaml @@ -0,0 +1,50 @@ +--- +- debug: + msg: START nxos_l3_interfaces rendered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + + +- name: Gather pre-facts + cisco.nxos.nxos_facts: + gather_subset: ['!all', '!min'] + gather_network_resources: l3_interfaces + +- block: + # Interfaces used here doesn't actually exist on the device + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_l3_interfaces: + config: + - name: Ethernet1/800 + ipv4: + - address: 192.168.1.100/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: True + tag: 10 + - name: Ethernet1/800 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather l3_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_l3_interfaces: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the device + assert: + that: "{{ result['gathered']|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] }}" + + always: + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_l3_interfaces rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..39b8bfb0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/replaced.yaml @@ -0,0 +1,119 @@ +--- +- debug: + msg: Start nxos_l3_interfaces replaced integration tests connection={{ ansible_connection }} + +- set_fact: + test_int3: '{{ nxos_int3 }}' + subint3: '{{ nxos_int3 }}.42' + +- include_tasks: _remove_config.yaml + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no system default switchport" + - "default interface {{ test_int3 }}" + - "interface {{ test_int3 }}" + - " no switchport" + +- block: + + - name: setup3 + cisco.nxos.nxos_config: + lines: + - "interface {{ subint3 }}" + - " encapsulation dot1q 42" + - " ip address 192.168.10.2/24" + - " no ip redirects" + - " ip unreachables" + + - name: Gather l3_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: l3_interfaces + + - name: Replaced + register: result + cisco.nxos.nxos_l3_interfaces: &id002 + config: + + - name: '{{ subint3 }}' + dot1q: 442 + redirects: false + unreachables: false + ipv4: + + - address: 192.168.20.2/24 + tag: 5 + + - address: 192.168.200.2/24 + secondary: true + state: replaced + + - assert: + that: + - result.before|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + - result.changed == true + - "'interface {{ subint3 }}' in result.commands" + - "'encapsulation dot1q 442' in result.commands" + - "'no ip unreachables' in result.commands" + - "'ip address 192.168.20.2/24 tag 5' in result.commands" + - "'ip address 192.168.200.2/24 secondary' in result.commands" + - result.commands|length == 5 + + - name: Gather l3_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - result.after|symmetric_difference(ansible_facts.network_resources.l3_interfaces) == [] + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_l3_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: Replaced with no optional attrs specified + register: result + cisco.nxos.nxos_l3_interfaces: &id003 + config: + + - name: '{{ subint3 }}' + state: replaced + + - assert: + that: + - result.changed == true + - "'interface {{ subint3 }}' in result.commands" + - "'no encapsulation dot1q' in result.commands" + - "'no ip address' in result.commands" + + - assert: + that: + - "'ip redirects' in result.commands" + when: platform is match('N[3567]') + + - name: Idempotence - Replaced with no attrs specified + register: result + cisco.nxos.nxos_l3_interfaces: *id003 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown sub-interface + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no interface {{ subint3 }}" + + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rtt.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rtt.yaml new file mode 100644 index 00000000..65fc05e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/tests/common/rtt.yaml @@ -0,0 +1,89 @@ +--- +- debug: + msg: START nxos_l3_interfaces round trip integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: Prepare interfaces (switch to L3) + cisco.nxos.nxos_interfaces: + config: + - name: "{{ nxos_int1 }}" + mode: layer3 + - name: "{{ nxos_int2 }}" + mode: layer3 + - name: "{{ nxos_int3 }}" + mode: layer3 + state: merged + + - name: Apply the provided configuration (Base config) + register: base_config + cisco.nxos.nxos_l3_interfaces: + config: + - name: "{{ nxos_int1 }}" + ipv4: + - address: 192.0.2.49/28 + tag: 5 + - address: 198.51.100.65/27 + secondary: true + tag: 10 + ipv6: + - address: 2001:db8:2000::1/32 + tag: 6 + - name: "{{ nxos_int2 }}" + ipv4: + - address: 192.0.2.81/28 + state: merged + tags: base_config + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - l3_interfaces + + - name: Set reserved interface IP config and config to revert + set_fact: + mgmt: "{{ ansible_facts.network_resources.l3_interfaces|selectattr('name', 'equalto', rsvd_intf)|list }}" + config_to_revert: + - name: "{{ nxos_int1 }}" + ipv4: + - address: 203.0.113.67/26 + - name: "{{ nxos_int2 }}" + ipv4: + - address: 198.51.100.10/24 + tag: 7 + - address: 198.51.100.130/25 + secondary: true + tag: 11 + - name: "{{ nxos_int3 }}" + ipv6: + - address: 2001:db8::20/32 + tag: 6 + + - name: Apply the provided configuration (config to be reverted) + register: result + cisco.nxos.nxos_l3_interfaces: + config: "{{ config_to_revert + mgmt }}" + state: overridden + + - assert: + that: + - result.changed == true + + - name: Revert back to base config using facts round trip + register: revert + cisco.nxos.nxos_l3_interfaces: + config: "{{ ansible_facts['network_resources']['l3_interfaces'] }}" + state: overridden + + - assert: + that: + - base_config['after'] == revert['after'] + always: + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_l3_interfaces round trip integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/vars/main.yml new file mode 100644 index 00000000..a954978f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_l3_interfaces/vars/main.yml @@ -0,0 +1,65 @@ +gathered: + - name: "{{ nxos_int1 }}" + ipv4: + - address: 192.0.2.100/24 + - name: "{{ nxos_int2 }}" + ipv4: + - address: 203.0.113.10/24 + ipv6: + - address: 2001:db8::1/32 + redirects: False + unreachables: True + +rendered: + - "interface Ethernet1/800" + - "ip address 192.168.1.100/24 tag 5" + - "ip address 10.1.1.1/24 secondary tag 10" + - "interface Ethernet1/800" + - "ipv6 address fd5d:12c9:2201:2::1/64 tag 6" + +parsed: + - name: Ethernet1/800 + ipv4: + - address: 192.168.1.100/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: True + tag: 10 + redirects: False + - name: Ethernet1/801 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + unreachables: True + - name: mgmt0 + ipv4: + - address: dhcp + +rendered_multi: + - "interface Ethernet1/800" + - "ip address 192.168.1.100/24 tag 5" + - "ip address 10.1.1.1/24 secondary tag 10" + - "evpn multisite fabric-tracking" + - "interface Ethernet1/800" + - "ipv6 address fd5d:12c9:2201:2::1/64 tag 6" + - "evpn multisite dci-tracking" + +parsed_multi: + - name: Ethernet1/800 + ipv4: + - address: 192.168.1.100/24 + tag: 5 + - address: 10.1.1.1/24 + secondary: True + tag: 10 + redirects: False + evpn_multisite_tracking: fabric-tracking + - name: Ethernet1/801 + ipv6: + - address: fd5d:12c9:2201:2::1/64 + tag: 6 + unreachables: True + evpn_multisite_tracking: dci-tracking + - name: mgmt0 + ipv4: + - address: dhcp diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/main.yaml new file mode 100644 index 00000000..29193c00 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/main.yaml @@ -0,0 +1,7 @@ +--- +- include: cli.yaml + tags: + - cli +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_populate_config.yaml new file mode 100644 index 00000000..1959395c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_populate_config.yaml @@ -0,0 +1,5 @@ +# The CI NX-OS image doesn't support `lacp system-mac` +- name: Setup + cisco.nxos.nxos_config: + lines: + - "lacp system-priority 10" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_remove_config.yaml new file mode 100644 index 00000000..a1520d81 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/_remove_config.yaml @@ -0,0 +1,5 @@ +- name: Remove existing LACP config + cisco.nxos.nxos_config: + lines: + - "no lacp system-priority" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/deleted.yaml new file mode 100644 index 00000000..476a73ff --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/deleted.yaml @@ -0,0 +1,72 @@ +--- +- debug: + msg: Start nxos_lacp deleted integration tests connection={{ ansible_connection }} + +- name: Enable lacp feature + cisco.nxos.nxos_feature: + feature: lacp + +- set_fact: + mac: lacp system-mac 00c1.4c00.bd15 role primary + when: platform is search('N9K') and imagetag is not search('I[2-6]') + +- block: + + - name: Setup + cisco.nxos.nxos_config: + lines: lacp system-priority 11 + + - name: Setup + cisco.nxos.nxos_config: + lines: '{{ mac|default(omit) }}' + + - name: Gather lacp facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp + + - name: deleted + register: result + cisco.nxos.nxos_lacp: &id002 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.lacp == result.before + - "'no lacp system-priority' in result.commands" + - result.changed == true + - result.commands|length == 1 + when: platform is not search('N9K') + + - assert: + that: + - ansible_facts.network_resources.lacp == result.before + - "'no lacp system-priority' in result.commands" + - "'no lacp system-mac' in result.commands" + - result.changed == true + - result.commands|length == 2 + when: platform is search('N9K') and imagetag is not search('I[2-6]') + + - name: Gather lacp post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - result.after|length == 0 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_lacp: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/empty_config.yaml new file mode 100644 index 00000000..bb06efa3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/empty_config.yaml @@ -0,0 +1,51 @@ +--- +- debug: + msg: START nxos_lacp empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_lacp empty_config integration tests on connection={{ ansible_connection }} \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/gathered.yaml new file mode 100644 index 00000000..311c2f03 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/gathered.yaml @@ -0,0 +1,32 @@ +--- +- debug: + msg: START nxos_lacp gathered integration tests on connection={{ ansible_connection }} + +- name: Enable lacp + cisco.nxos.nxos_feature: + feature: lacp + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather lacp facts from the device using nxos_lacp + register: result + cisco.nxos.nxos_lacp: + state: gathered + + - assert: + that: "{{ result['gathered'] == gathered }}" + always: + + - include_tasks: _remove_config.yaml + + - name: teardown + cisco.nxos.nxos_feature: + feature: lacp + state: disabled + + - debug: + msg: END nxos_lacp gathered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/merged.yaml new file mode 100644 index 00000000..37db2256 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/merged.yaml @@ -0,0 +1,67 @@ +--- +- debug: + msg: Start nxos_lacp merged integration tests connection={{ ansible_connection }} + +- name: Enable lacp + cisco.nxos.nxos_feature: + feature: lacp + +- set_fact: + mac: + address: 00c1.4c00.bd15 + role: primary + when: platform is search('N9K') and imagetag is not search('I[2-6]') + +- block: + + - name: Merged + register: result + cisco.nxos.nxos_lacp: &id001 + config: + system: + priority: 11 + mac: '{{ mac|default(omit) }}' + state: merged + + - assert: + that: + - result.before|length == 0 + - result.changed == true + - "'lacp system-priority 11' in result.commands" + - "'lacp system-mac 00c1.4c00.bd15 role primary' in result.commands" + - result.commands|length == 2 + when: platform is search('N9K') and imagetag is not search('I[2-6]') + + - assert: + that: + - result.before|length == 0 + - result.changed == true + - "'lacp system-priority 11' in result.commands" + - result.commands|length == 1 + when: platform is not search('N9K') + + - name: Gather lacp facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp + + - assert: + that: + - ansible_facts.network_resources.lacp == result.after + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_lacp: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/parsed.yaml new file mode 100644 index 00000000..6771d74f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/parsed.yaml @@ -0,0 +1,18 @@ +--- +- debug: + msg: START nxos_lacp parsed integration tests on connection={{ ansible_connection }} + +- block: + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_lacp: + running_config: | + lacp system-priority 10 + lacp system-mac 00c1.4c00.bd15 role secondary + state: parsed + + - assert: + that: "{{ parsed == result['parsed'] }}" + +- debug: + msg: END nxos_lacp parsed integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/rendered.yaml new file mode 100644 index 00000000..126ac336 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/rendered.yaml @@ -0,0 +1,37 @@ +--- +- debug: + msg: START nxos_lacp rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_lacp: + config: + system: + priority: 10 + mac: + address: 00c1.4c00.bd15 + role: secondary + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather lacp facts from the device and assert that its empty + register: result + cisco.nxos.nxos_lacp: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered'] == {} }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_lacp rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/replaced.yaml new file mode 100644 index 00000000..2653b6b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/tests/common/replaced.yaml @@ -0,0 +1,101 @@ +--- +- debug: + msg: Start nxos_lacp replaced integration tests connection={{ ansible_connection }} + +- name: Enable lacp feature + cisco.nxos.nxos_feature: + feature: lacp + +- set_fact: + mac1: lacp system-mac 00c1.4c00.bd20 role primary + mac2: + address: 00c1.4c00.bd15 + role: secondary + when: platform is search('N9K') and imagetag is not search('I[2-6]') + +- block: + + - name: Setup1 + cisco.nxos.nxos_config: + lines: lacp system-priority 11 + + - name: Setup2 + cisco.nxos.nxos_config: + lines: '{{ mac1|default(omit) }}' + + - name: Gather lacp facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp + + - name: Replaced + register: result + cisco.nxos.nxos_lacp: &id002 + config: + system: + priority: 12 + mac: '{{ mac2|default(omit) }}' + state: replaced + + - assert: + that: + - ansible_facts.network_resources.lacp == result.before + - result.changed == true + - result.commands|length == 2 + - "'no lacp system-priority' in result.commands" + - "'lacp system-priority 12' in result.commands" + when: platform is not search('N9K') + + - assert: + that: + - ansible_facts.network_resources.lacp == result.before + - result.changed == true + - "'no lacp system-priority' in result.commands" + - "'no lacp system-mac' in result.commands" + - "'lacp system-priority 12' in result.commands" + - "'lacp system-mac 00c1.4c00.bd15 role secondary' in result.commands" + - result.commands|length == 4 + when: platform is search('N9K') and imagetag is not search('I[2-6]') + + - name: Gather lacp interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.lacp == result.after + when: platform is search('N9K') and imagetag is not search('I[2-6]') + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_lacp: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: Setup3 + cisco.nxos.nxos_config: + lines: '{{ mac1|default(omit) }}' + + - name: Replaced + register: result + when: platform is search('N9K') and imagetag is not search('I[2-6]') + cisco.nxos.nxos_lacp: + state: replaced + + - assert: + that: + - result.changed == true + - result.commands|length == 2 + - "'no lacp system-mac' in result.commands" + - "'no lacp system-priority' in result.commands" + when: platform is search('N9K') and imagetag is not search('I[2-6]') + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/vars/main.yml new file mode 100644 index 00000000..bdb43ed4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp/vars/main.yml @@ -0,0 +1,18 @@ +# The CI NX-OS image doesn't support `lacp system-mac` +gathered: + system: + priority: 10 + +# using mac related configs in parsed and rendered would also +# prove that we're not connecting to the appliance as expected + +rendered: + - "lacp system-priority 10" + - "lacp system-mac 00c1.4c00.bd15 role secondary" + +parsed: + system: + priority: 10 + mac: + address: 00c1.4c00.bd15 + role: secondary diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/main.yaml new file mode 100644 index 00000000..29193c00 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/main.yaml @@ -0,0 +1,7 @@ +--- +- include: cli.yaml + tags: + - cli +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..7e21ea41 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..de1d0a2c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,13 @@ +- name: Populate Config + cisco.nxos.nxos_config: + lines: + - "feature lacp" + - "interface {{ nxos_int1 }}" + - " lacp port-priority 5" + - " lacp rate fast" + - "interface port-channel10" + - " switchport" + - " lacp mode delay" + - "interface port-channel11" + - " lacp max-bundle 10" + - " lacp min-links 5" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..d69f2cbf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,10 @@ +- name: Remove Config + cisco.nxos.nxos_config: + lines: + - "no interface port-channel5" + - "no interface port-channel10" + - "no interface port-channel11" + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + - "no feature lacp" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..7e3d9682 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/deleted.yaml @@ -0,0 +1,76 @@ +--- +- debug: + msg: Start nxos_lacp_interfaces deleted integration tests connection={{ ansible_connection }} + +- set_fact: + mode: delay + when: platform is not search('N3K|N5K|N6K|N7K') and imagetag is not search('A8|I2') + and image_version is not search ('9.2') and chassis_type is not search('C95') + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: + - "no interface port-channel5" + - "no interface port-channel10" + - "no feature lacp" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature lacp" + - "interface port-channel5" + - "lacp min-links 5" + - "interface port-channel10" + - " lacp max-bundle 10" + + - name: setup3 - L2 for mode command + when: mode is defined + cisco.nxos.nxos_config: + lines: + - "interface port-channel10" + - " switchport" + - " lacp mode delay" + + - name: Gather lacp_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp_interfaces + + - name: deleted + register: result + cisco.nxos.nxos_lacp_interfaces: &id001 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.lacp_interfaces|symmetric_difference(result.before)|length + == 0 + - result.after|length == 0 + - result.changed == true + - "'interface port-channel5' in result.commands" + - "'no lacp min-links' in result.commands" + - "'interface port-channel10' in result.commands" + - "'no lacp max-bundle' in result.commands" + + - assert: + that: + - "'no lacp mode delay' in result.commands" + - result.commands|length == 5 + when: mode is defined + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_lacp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..8e34bf27 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_lacp_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lacp_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_lacp_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..3006765e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/gathered.yaml @@ -0,0 +1,24 @@ +--- +- debug: + msg: START nxos_lacp_interfaces gathered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather lacp_interfaces facts from the device using nxos_lacp_interfaces + register: result + cisco.nxos.nxos_lacp_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_lacp_interfaces gathered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..7737b73a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/merged.yaml @@ -0,0 +1,84 @@ +--- +- debug: + msg: Start nxos_lacp_interfaces merged integration tests connection={{ ansible_connection }} + +- set_fact: + mode: delay + when: platform is not search('N3K|N5K|N6K|N7K') and imagetag is not search('A8|I2') + and image_version is not search ('9.2') and chassis_type is not search('C95') + +- name: setup1 + cisco.nxos.nxos_config: &id002 + lines: + - "no interface port-channel5" + - "no interface port-channel10" + - "no feature lacp" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature lacp" + + - name: setup3 - L2 for mode command + when: mode is defined + cisco.nxos.nxos_config: + lines: + - "interface port-channel5" + - " switchport" + + - name: Merged + register: result + cisco.nxos.nxos_lacp_interfaces: &id001 + config: + + - name: port-channel10 + links: + min: 5 + + - name: port-channel5 + mode: '{{ mode | default(omit) }}' + links: + max: 10 + state: merged + + - assert: + that: + - result.changed == true + - result.before|length == 0 + - "'interface port-channel10' in result.commands" + - "'lacp min-links 5' in result.commands" + - "'interface port-channel5' in result.commands" + - "'lacp max-bundle 10' in result.commands" + + - assert: + that: + - "'lacp mode delay' in result.commands" + - result.commands|length == 5 + when: mode is defined + + - name: Gather lacp_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp_interfaces + + - assert: + that: + - ansible_facts.network_resources.lacp_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_lacp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..9c75940f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/overridden.yaml @@ -0,0 +1,90 @@ +--- +- debug: + msg: Start nxos_lacp_interfaces overridden integration tests connection={{ ansible_connection }} + +- set_fact: + mode: delay + when: platform is not search('N3K|N5K|N6K|N7K') and imagetag is not search('A8|I2') + and image_version is not search ('9.2') and chassis_type is not search('C95') + +- name: setup1 + cisco.nxos.nxos_config: &id003 + lines: + - "no interface port-channel5" + - "no interface port-channel10" + - "no interface port-channel11" + - "no feature lacp" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature lacp" + - "interface port-channel10" + - "lacp min-links 5" + - "interface port-channel5" + - " lacp max-bundle 10" + + - name: setup3 - L2 for mode command + when: mode is defined + cisco.nxos.nxos_config: + lines: + - "interface port-channel11" + - " switchport" + + - name: Gather lacp_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp_interfaces + + - name: Overridden + register: result + cisco.nxos.nxos_lacp_interfaces: &id002 + config: + + - name: port-channel11 + links: + min: 4 + mode: '{{ mode | default(omit) }}' + state: overridden + + - assert: + that: + - ansible_facts.network_resources.lacp_interfaces|symmetric_difference(result.before)|length + == 0 + - result.changed == true + - "'interface port-channel10' in result.commands" + - "'no lacp min-links' in result.commands" + - "'interface port-channel5' in result.commands" + - "'no lacp max-bundle' in result.commands" + - "'interface port-channel11' in result.commands" + + - assert: + that: + - "'lacp mode delay' in result.commands" + - result.commands|length == 7 + when: mode is defined + + - name: Gather lacp_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.lacp_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_lacp_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..eb2ab053 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/parsed.yaml @@ -0,0 +1,27 @@ +--- +- debug: + msg: START nxos_lacp_interfaces parsed integration tests on connection={{ ansible_connection }} + +- block: + # Ethernet interface used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_lacp_interfaces: + running_config: | + interface nve1 + source-interface Ethernet1/100 + interface port-channel10 + lacp min-links 10 + lacp max-bundle 15 + interface Ethernet1/800 + lacp port-priority 100 + lacp rate fast + description interface + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_lacp_interfaces parsed integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..5c118618 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/rendered.yaml @@ -0,0 +1,43 @@ +--- +- debug: + msg: START nxos_lacp_interfaces rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + # Interfaces used here doesn't actually exist on the device + - name: Use rendered state to convert task input to device specific commands + register: result + nxos_lacp_interfaces: + config: + - name: Ethernet1/800 + rate: fast + - name: Ethernet1/801 + rate: fast + port_priority: 32 + - name: port-channel10 + links: + max: 15 + min: 2 + convergence: + graceful: True + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather lacp_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_lacp_interfaces: + state: gathered + + - name: Make sure that rendered + assert: + that: "{{ result['gathered'] == [] }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_lacp_interfaces rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..460b7744 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/tests/common/replaced.yaml @@ -0,0 +1,78 @@ +--- +- debug: + msg: Start nxos_lacp_interfaces replaced integration tests connection={{ ansible_connection }} + +- set_fact: + mode: delay + when: platform is not search('N3K|N5K|N6K|N7K') and imagetag is not search('A8|I2') + and image_version is not search ('9.2') and chassis_type is not search('C95') + +- name: setup1 + cisco.nxos.nxos_config: &id003 + lines: + - "no interface port-channel10" + - "no feature lacp" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "feature lacp" + - "interface port-channel10" + - "switchport" + - " lacp min-links 5" + + - name: Gather lacp_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lacp_interfaces + + - name: Replaced + register: result + cisco.nxos.nxos_lacp_interfaces: &id002 + config: + + - name: port-channel10 + links: + max: 10 + mode: '{{ mode | default(omit) }}' + state: replaced + + - assert: + that: + - ansible_facts.network_resources.lacp_interfaces|symmetric_difference(result.before)|length + == 0 + - result.changed == true + - "'interface port-channel10' in result.commands" + - "'no lacp min-links' in result.commands" + - "'lacp max-bundle 10' in result.commands" + + - assert: + that: + - "'lacp mode delay' in result.commands" + - result.commands|length == 4 + when: mode is defined + + - name: Gather lacp_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.lacp_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_lacp_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/vars/main.yml new file mode 100644 index 00000000..bbb0687b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lacp_interfaces/vars/main.yml @@ -0,0 +1,30 @@ +gathered: + - name: "{{ nxos_int1 }}" + port_priority: 5 + rate: fast + - name: port-channel10 + mode: delay + - name: port-channel11 + links: + max: 10 + min: 5 + +parsed: + - name: port-channel10 + links: + max: 15 + min: 10 + - name: Ethernet1/800 + port_priority: 100 + rate: fast + +rendered: + - "interface Ethernet1/800" + - "lacp rate fast" + - "interface Ethernet1/801" + - "lacp port-priority 32" + - "lacp rate fast" + - "interface port-channel10" + - "lacp min-links 2" + - "lacp max-bundle 15" + - "lacp graceful-convergence" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/main.yaml new file mode 100644 index 00000000..29193c00 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/main.yaml @@ -0,0 +1,7 @@ +--- +- include: cli.yaml + tags: + - cli +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..7e21ea41 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..bef46eeb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,8 @@ +- name: Populate Config + cisco.nxos.nxos_config: + lines: + - "feature lacp" + - "interface {{ nxos_int1 }}" + - " channel-group 10 mode active" + - "interface {{ nxos_int2 }}" + - " channel-group 11 mode passive" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..9539edb7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,10 @@ +- name: Remove config + cisco.nxos.nxos_config: + lines: + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + - "no interface port-channel10" + - "no interface port-channel11" + - "no interface port-channel19" + - "no feature lacp" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..06c08d69 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/deleted.yaml @@ -0,0 +1,67 @@ +--- +- debug: + msg: Start nxos_lag_interfaces deleted integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: test_int2="{{ nxos_int2 }}" + +- include_tasks: _remove_config.yaml + +- name: enable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + +- block: + + - name: Setup2 + loop: + - interface {{ test_int1 }} + - interface {{ test_int2 }} + cisco.nxos.nxos_config: + lines: + - channel-group 10 + parents: '{{ item }}' + + - name: Gather LAG interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lag_interfaces + + - name: deleted + register: result + cisco.nxos.nxos_lag_interfaces: &id002 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.lag_interfaces|symmetric_difference(result.before)|length + == 0 + + - name: Gather LAG interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + # the module should not remove the implicitly created port-channel + - result.after|length == 1 + - result.changed == true + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_lag_interfaces: *id002 + + - assert: + that: + - result.changed == false + always: + + - include_tasks: _remove_config.yaml + + - name: disable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..10b583bb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_lag_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_lag_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..c6f42542 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START nxos_lag_interfaces gathered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather lag_interfaces facts from the device using nxos_lag_interfaces + register: result + cisco.nxos.nxos_lag_interfaces: + state: gathered + + - assert: + that: "{{ result['gathered'] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_lag_interfaces gathered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..1103e870 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/merged.yaml @@ -0,0 +1,108 @@ +--- +- debug: + msg: Start nxos_lag_interfaces merged integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: test_int2="{{ nxos_int2 }}" + +- name: Enable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no interface port-channel 10 + - no interface port-channel 11 + - no interface port-channel 19 + +- name: setup2 + cisco.nxos.nxos_lag_interfaces: &id002 + state: deleted + +- block: + + - name: Merged + register: result + cisco.nxos.nxos_lag_interfaces: &id001 + config: + + - name: port-channel10 + members: + + - member: '{{ test_int1 }}' + + - member: '{{ test_int2 }}' + mode: true + state: merged + + - assert: + that: + - result.before|length == 0 + - result.changed == true + + - name: Gather LAG interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lag_interfaces + + - assert: + that: + - ansible_facts.network_resources.lag_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_lag_interfaces: *id001 + + - assert: + that: + - result.changed == false + + - name: Add new port-channel with no members + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - interface port-channel 11 + + - name: Merged - No Members + register: result + cisco.nxos.nxos_lag_interfaces: &id003 + config: + + - name: port-channel11 + members: + + - member: '{{ test_int1 }}' + + - member: '{{ test_int2 }}' + mode: true + state: merged + + - assert: + that: + - result.changed == true + + - name: Idempotence - Merged - No Members + register: result + cisco.nxos.nxos_lag_interfaces: *id003 + + - assert: + that: + - result.changed == false + + always: + + - name: Teardown + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: *id002 + + - name: Disable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..061ca7ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/overridden.yaml @@ -0,0 +1,85 @@ +--- +- debug: + msg: Start nxos_lag_interfaces overridden integration tests connection={{ ansible_connection + }} + +- set_fact: + test_int1: "{{ nxos_int1 }}" + test_int2: "{{ nxos_int2 }}" + test_int3: "{{ nxos_int3 }}" + +- name: enable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no interface port-channel 10 + - no interface port-channel 19 + +- name: setup2 + cisco.nxos.nxos_lag_interfaces: &id003 + state: deleted + +- block: + + - name: setup3 + ignore_errors: true + loop: + - interface {{ test_int1 }} + - interface {{ test_int2 }} + cisco.nxos.nxos_config: + lines: + - channel-group 10 + parents: '{{ item }}' + + - name: Gather LAG interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lag_interfaces + + - name: Overridden + register: result + cisco.nxos.nxos_lag_interfaces: &id002 + config: + - name: port-channel19 + members: + + - member: '{{ test_int3 }}' + state: overridden + + - assert: + that: + - ansible_facts.network_resources.lag_interfaces|symmetric_difference(result.before)|length + == 0 + - result.changed == true + + - name: Gather LAG interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.lag_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_lag_interfaces: *id002 + + - assert: + that: + - result.changed == false + always: + + - name: Teardown + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: *id003 + + - name: disable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..a2f00db8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/parsed.yaml @@ -0,0 +1,32 @@ +--- +- debug: + msg: START nxos_lag_interfaces parsed integration tests on connection={{ ansible_connection + }} + +- block: + # Interfaces used in the task don't actually exist on the appliance + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_lag_interfaces: + running_config: | + interface port-channel10 + interface port-channel11 + interface port-channel12 + interface Ethernet1/800 + channel-group 10 + no shutdown + interface Ethernet1/801 + channel-group 10 mode active + interface Ethernet1/802 + channel-group 11 mode passive + interface Ethernet1/803 + channel-group 11 mode passive + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_lag_interfaces parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..dd72cc18 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/rendered.yaml @@ -0,0 +1,43 @@ +--- +- debug: + msg: START nxos_lag_interfaces rendered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- block: + # Interfaces used here doesn't actually exist on the device + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_lag_interfaces: + config: + - name: port-channel10 + members: + - member: Ethernet1/800 + mode: active + - member: Ethernet1/801 + - name: port-channel11 + members: + - member: Ethernet1/802 + mode: passive + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather l2_interfaces facts from the device and assert that its empty + register: result + cisco.nxos.nxos_lag_interfaces: + state: gathered + + - name: Make sure that rendered + assert: + that: "{{ result['gathered'] == [] }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_lag_interfaces rendered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..16952a45 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/tests/common/replaced.yaml @@ -0,0 +1,86 @@ +--- +- debug: + msg: Start nxos_lag_interfaces replaced integration tests connection={{ ansible_connection + }} + +- set_fact: test_int1="{{ nxos_int1 }}" + +- set_fact: test_int2="{{ nxos_int2 }}" + +- name: enable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + +- name: setup1 + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no interface port-channel 10 + - no interface port-channel 11 + - no interface port-channel 19 + +- name: setup2 + cisco.nxos.nxos_lag_interfaces: &id003 + state: deleted + +- block: + + - name: setup3 + ignore_errors: true + loop: + - interface {{ test_int1 }} + - interface {{ test_int2 }} + cisco.nxos.nxos_config: + lines: + - channel-group 10 + parents: '{{ item }}' + + - name: Gather LAG interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lag_interfaces + + - name: Replaced + register: result + cisco.nxos.nxos_lag_interfaces: &id002 + config: + + - name: port-channel11 + members: + + - member: '{{ test_int2 }}' + mode: active + state: replaced + + - assert: + that: + - ansible_facts.network_resources.lag_interfaces|symmetric_difference(result.before)|length + == 0 + + - name: Gather LAG interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.lag_interfaces|symmetric_difference(result.after)|length + == 0 + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_lag_interfaces: *id002 + + - assert: + that: + - result.changed == false + always: + + - name: teardown1 + ignore_errors: true + cisco.nxos.nxos_lag_interfaces: *id003 + + - name: disable feature lacp + cisco.nxos.nxos_feature: + feature: lacp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/vars/main.yml new file mode 100644 index 00000000..a0edbc1b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lag_interfaces/vars/main.yml @@ -0,0 +1,33 @@ +gathered: + - name: port-channel10 + members: + - member: '{{ nxos_int1 }}' + mode: active + - name: port-channel11 + members: + - member: '{{ nxos_int2 }}' + mode: passive + +rendered: + - "interface Ethernet1/800" + - "channel-group 10 mode active" + - "interface Ethernet1/801" + - "channel-group 10" + - "interface Ethernet1/802" + - "channel-group 11 mode passive" + +parsed: + - members: + - member: Ethernet1/800 + - member: Ethernet1/801 + mode: active + name: port-channel10 + + - members: + - member: Ethernet1/802 + mode: passive + - member: Ethernet1/803 + mode: passive + name: port-channel11 + + - name: port-channel12 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/defaults/main.yaml new file mode 100644 index 00000000..a845c24b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: '*' +test_items: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tests/common/sanity.yaml new file mode 100644 index 00000000..19e75afd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_linkagg/tests/common/sanity.yaml @@ -0,0 +1,201 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_linkagg sanity test" + +- set_fact: testint1="{{ nxos_int1 }}" + +- set_fact: testint2="{{ nxos_int2 }}" + +- name: Enable feature LACP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: lacp + state: enabled + +- name: setup - remove config used in test(part1) + cisco.nxos.nxos_config: + lines: + - no interface port-channel 20 + - no interface port-channel 100 + +- name: setup - remove config used in test(part2) + ignore_errors: true + loop: + - interface {{ testint1 }} + - interface {{ testint2 }} + cisco.nxos.nxos_config: + lines: + - no channel-group 20 + parents: '{{ item }}' + +- name: Put interface in L2 mode + when: platform is match("N35") + cisco.nxos.nxos_interface: + aggregate: + + - name: '{{testint1}}' + + - name: '{{testint2}}' + mode: layer2 + +- name: create linkagg + register: result + cisco.nxos.nxos_linkagg: &id001 + group: 20 + state: present + +- assert: + that: + - result.changed == true + - '"interface port-channel 20" in result.commands' + +- name: create linkagg(Idempotence) + register: result + cisco.nxos.nxos_linkagg: *id001 + +- assert: + that: + - result.changed == false + +- name: set link aggregation group to members declaratively + register: result + cisco.nxos.nxos_linkagg: &id002 + group: 20 + mode: active + force: true + members: + - '{{ testint1 }}' + - '{{ testint2 }}' + +- assert: + that: + - result.changed == true + - '"interface {{ testint1 }}" in result.commands' + - '"channel-group 20 force mode active" in result.commands' + - '"interface {{ testint2 }}" in result.commands' + - '"channel-group 20 force mode active" in result.commands' + +- name: set link aggregation group to members(Idempotence) + register: result + cisco.nxos.nxos_linkagg: *id002 + +- assert: + that: + - result.changed == false + +- name: remove link aggregation group from member declaratively + register: result + cisco.nxos.nxos_linkagg: &id003 + group: 20 + mode: active + force: true + members: + - '{{ testint2 }}' + +- assert: + that: + - result.changed == true + - '"interface {{ testint1 }}" in result.commands' + - '"no channel-group 20" in result.commands' + +- name: remove link aggregation group from member(Idempotence) + register: result + cisco.nxos.nxos_linkagg: *id003 + +- assert: + that: + - result.changed == false + +- name: remove linkagg + register: result + cisco.nxos.nxos_linkagg: &id004 + group: 20 + state: absent + +- assert: + that: + - result.changed == true + - '"no interface port-channel 20" in result.commands' + +- name: remove linkagg(Idempotence) + register: result + cisco.nxos.nxos_linkagg: *id004 + +- assert: + that: + - result.changed == false + +- name: create aggregate of linkagg definitions + register: result + cisco.nxos.nxos_linkagg: &id005 + aggregate: + + - group: 20 + min_links: 3 + + - group: 100 + min_links: 4 + +- assert: + that: + - result.changed == true + - '"interface port-channel 20" in result.commands' + - '"lacp min-links 3" in result.commands' + - '"interface port-channel 100" in result.commands' + - '"lacp min-links 4" in result.commands' + +- name: create aggregate of linkagg definitions(Idempotence) + register: result + cisco.nxos.nxos_linkagg: *id005 + +- assert: + that: + - result.changed == false + +- name: remove aggregate of linkagg definitions + register: result + cisco.nxos.nxos_linkagg: &id006 + aggregate: + + - group: 20 + min_links: 3 + + - group: 100 + min_links: 4 + state: absent + +- assert: + that: + - result.changed == true + - '"no interface port-channel 20" in result.commands' + - '"no interface port-channel 100" in result.commands' + +- name: remove aggregate of linkagg definitions(Idempotence) + register: result + cisco.nxos.nxos_linkagg: *id006 + +- assert: + that: + - result.changed == false + +- name: teardown - remove config used in test(part1) + cisco.nxos.nxos_config: + lines: + - no interface port-channel 20 + - no interface port-channel 100 + +- name: teardown - remove config used in test(part2) + ignore_errors: true + loop: + - interface {{ testint1 }} + - interface {{ testint2 }} + cisco.nxos.nxos_config: + lines: + - no channel-group 20 + parents: '{{ item }}' + +- name: Disable feature LACP + cisco.nxos.nxos_feature: + feature: lacp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_linkagg sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/cli/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/cli/sanity.yaml new file mode 100644 index 00000000..17036385 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/cli/sanity.yaml @@ -0,0 +1,47 @@ +--- +- debug: msg="START TRANSPORT:CLI nxos_lldp sanity test" + +- name: Make sure LLDP is not running before tests + cisco.nxos.nxos_feature: + feature: lldp + state: disabled + +- name: Enable LLDP service + register: result + cisco.nxos.nxos_lldp: + state: present + +- assert: + that: + - result.changed == true + - '"feature lldp" in result.commands' + +- name: Enable LLDP service again (idempotent) + register: result + cisco.nxos.nxos_lldp: + state: present + +- assert: + that: + - result.changed == false + +- name: Disable LLDP service + register: result + cisco.nxos.nxos_lldp: + state: absent + +- assert: + that: + - result.changed == true + - '"no feature lldp" in result.commands' + +- name: Disable LLDP service (idempotent) + register: result + cisco.nxos.nxos_lldp: + state: absent + +- assert: + that: + - result.changed == false + +- debug: msg="END TRANSPORT:CLI nxos_lldp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/nxapi/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/nxapi/sanity.yaml new file mode 100644 index 00000000..36cc40ae --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp/tests/nxapi/sanity.yaml @@ -0,0 +1,47 @@ +--- +- debug: msg="START TRANSPORT:NXAPI nxos_lldp sanity test" + +- name: Make sure LLDP is not running before tests + cisco.nxos.nxos_feature: + feature: lldp + state: disabled + +- name: Enable LLDP service + register: result + cisco.nxos.nxos_lldp: + state: present + +- assert: + that: + - result.changed == true + - '"feature lldp" in result.commands' + +- name: Enable LLDP service again (idempotent) + register: result + cisco.nxos.nxos_lldp: + state: present + +- assert: + that: + - result.changed == false + +- name: Disable LLDP service + register: result + cisco.nxos.nxos_lldp: + state: absent + +- assert: + that: + - result.changed == true + - '"no feature lldp" in result.commands' + +- name: Disable LLDP service (idempotent) + register: result + cisco.nxos.nxos_lldp: + state: absent + +- assert: + that: + - result.changed == false + +- debug: msg="END TRANSPORT:NXAPI nxos_lldp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/cli.yaml new file mode 100644 index 00000000..251529d5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/nxapi.yaml new file mode 100644 index 00000000..b6bd3eaf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_populate_config.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_populate_config.yml new file mode 100644 index 00000000..153d1895 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_populate_config.yml @@ -0,0 +1,8 @@ +- name: Populate config + cisco.nxos.nxos_config: + lines: + - "feature lldp" + - "lldp holdtime 129" + - "lldp reinit 5" + - "lldp timer 35" + - "no lldp tlv-select system-name" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_remove_config.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_remove_config.yml new file mode 100644 index 00000000..3ee42c41 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/_remove_config.yml @@ -0,0 +1,5 @@ +- name: Remove config + cisco.nxos.nxos_feature: + feature: lldp + state: disabled + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/deleted.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/deleted.yml new file mode 100644 index 00000000..2d85aa50 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/deleted.yml @@ -0,0 +1,84 @@ +--- +- debug: + msg: Start nxos_lldp_global deleted integration tests connection = {{ ansible_connection + }} + +- block: + + - set_fact: cfg_port_id=True + when: platform is not search('N[567]K') and imagetag is not search("I[2345]") + + - name: feature off to cleanup lldp + cisco.nxos.nxos_feature: &id003 + feature: lldp + state: disabled + + - name: Enable LLDP feature + cisco.nxos.nxos_feature: + feature: lldp + state: enabled + + - name: Setup + cisco.nxos.nxos_config: + lines: + - "lldp holdtime 125" + - "lldp timer 32" + - "no lldp tlv-select dcbxp" + - "lldp tlv-select system-name" + - "no lldp tlv-select system-description" + + - name: Setup2 + when: cfg_port_id is defined + cisco.nxos.nxos_config: + lines: + - "lldp portid-subtype 1" + - "no lldp tlv-select power-management" + + - name: Gather lldp_global facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_global + + - name: Deleted + register: result + cisco.nxos.nxos_lldp_global: &id002 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.lldp_global == result.before + - "'no lldp holdtime 125' in result.commands" + - "'no lldp timer 32' in result.commands" + - "'lldp tlv-select dcbxp' in result.commands" + - "'lldp tlv-select system-description' in result.commands" + - 'result.changed == true ' + - result.after | length == 0 + + - assert: + that: + - "'no lldp portid-subtype 1' in result.commands" + - "'lldp tlv-select power-management' in result.commands" + when: cfg_port_id is defined + + - name: Gather lldp_global post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - 'ansible_facts.network_resources == {} ' + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_lldp_global: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: *id003 + when: platform is not search('N35') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/gathered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/gathered.yml new file mode 100644 index 00000000..f7df327d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/gathered.yml @@ -0,0 +1,24 @@ +--- +- debug: + msg: START nxos_lldp_global gathered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yml + +- include_tasks: _populate_config.yml + +- block: + + - name: Gather lldp_global facts from the device using nxos_lldp_global + register: result + cisco.nxos.nxos_lldp_global: + state: gathered + + - assert: + that: "{{ result['gathered'] == gathered }}" + + always: + + - include_tasks: _remove_config.yml + + - debug: + msg: END nxos_lldp_global gathered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/merged.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/merged.yml new file mode 100644 index 00000000..1bdf945b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/merged.yml @@ -0,0 +1,72 @@ +--- +- debug: + msg: Start nxos_lldp_global merged integration tests connection={{ansible_connection}} + +- block: + + - set_fact: + port_id: 1 + tlv_power_mgmt: + power_management: false + when: platform is not search('N5K|N6K|N7K') and imagetag is not search("I[2345]") + + - name: feature off to cleanup lldp + cisco.nxos.nxos_feature: &id002 + feature: lldp + state: disabled + + - name: Enable lldp + cisco.nxos.nxos_feature: + feature: lldp + + - name: Merged + register: result + cisco.nxos.nxos_lldp_global: &id001 + config: + reinit: 5 + timer: 40 + port_id: '{{port_id|default(omit)}}' + tlv_select: '{{tlv_power_mgmt|default(omit)}}' + state: merged + + - assert: + that: + - result.before|length == 0 + - result.changed == true + - "'lldp reinit 5' in result.commands" + - "'lldp timer 40' in result.commands" + + - assert: + that: + - "'lldp portid-subtype 1' in result.commands" + when: port_id is defined + + - assert: + that: + - "'no lldp tlv-select power-management' in result.commands" + when: tlv_power_mgmt is defined + + - name: Gather lldp_global facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_global + + - assert: + that: + - ansible_facts.network_resources.lldp_global == result.after + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_lldp_global: *id001 + + - assert: + that: + - result.changed == false + - result.commands | length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: *id002 + when: platform is not search('N35') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/parsed.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/parsed.yml new file mode 100644 index 00000000..0a025c0e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/parsed.yml @@ -0,0 +1,20 @@ +--- +- debug: + msg: START nxos_lldp_global parsed integration tests on connection={{ ansible_connection }} + +- block: + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_lldp_global: + running_config: | + lldp holdtime 131 + lldp reinit 7 + no lldp tlv-select system-name + no lldp tlv-select system-description + state: parsed + + - assert: + that: "{{ parsed == result['parsed'] }}" + +- debug: + msg: END nxos_lldp_global parsed integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/rendered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/rendered.yml new file mode 100644 index 00000000..63ffe95d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/rendered.yml @@ -0,0 +1,38 @@ +--- +- debug: + msg: START nxos_lldp_global rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yml + +- block: + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_lldp_global: + config: + holdtime: 130 + port_id: 1 + reinit: 5 + tlv_select: + dcbxp: yes + power_management: yes + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather lldp_global facts from the device and assert that its empty + register: result + cisco.nxos.nxos_lldp_global: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered'] == {} }}" + always: + + - include_tasks: _remove_config.yml + +- debug: + msg: END nxos_lldp_global rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/replaced.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/replaced.yml new file mode 100644 index 00000000..e42e1b68 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/tests/common/replaced.yml @@ -0,0 +1,93 @@ +--- +- debug: + msg: Start nxos_lldp_global replaced integration tests connection = {{ansible_connection}} + +- block: + + - set_fact: + port_id: 1 + tlv_power_mgmt: + power_management: false + when: platform is not search('N[567]K') and imagetag is not search("I[2345]") + + - name: feature off to cleanup lldp + cisco.nxos.nxos_feature: &id002 + feature: lldp + state: disabled + + - name: Enable lldp feature + cisco.nxos.nxos_feature: + feature: lldp + state: enabled + + - name: Setup + cisco.nxos.nxos_config: + lines: + - "lldp holdtime 125" + - "lldp tlv-select system-name" + - "no lldp tlv-select port-vlan" + + - name: Setup2 + when: port_id is defined + cisco.nxos.nxos_config: + lines: + - "lldp portid-subtype 1" + - "no lldp tlv-select power-management" + + - name: Replaced + register: result + cisco.nxos.nxos_lldp_global: &id001 + config: + holdtime: 125 + timer: 35 + tlv_select: + system: + name: false + description: false + port: + vlan: false + dcbxp: false + state: replaced + + - assert: + that: + - result.changed == true + - "'lldp timer 35' in result.commands" + - "'no lldp tlv-select system-name' in result.commands" + - "'no lldp tlv-select system-description' in result.commands" + - "'no lldp tlv-select dcbxp' in result.commands" + + - assert: + that: + - "'no lldp portid-subtype 1' in result.commands" + when: port_id is defined + + - assert: + that: + - "'lldp tlv-select power-management' in result.commands" + when: tlv_power_mgmt is defined + + - name: Gather lldp_global post facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_global + + - assert: + that: + - ansible_facts.network_resources.lldp_global == result.after + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_lldp_global: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: *id002 + when: platform is not search('N35') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/vars/main.yml new file mode 100644 index 00000000..7bca43e2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_global/vars/main.yml @@ -0,0 +1,22 @@ +gathered: + reinit: 5 + timer: 35 + tlv_select: + system: + name: False + holdtime: 129 + +rendered: + - "lldp tlv-select dcbxp" + - "lldp tlv-select power-management" + - "lldp portid-subtype 1" + - "lldp reinit 5" + - "lldp holdtime 130" + +parsed: + holdtime: 131 + reinit: 7 + tlv_select: + system: + description: false + name: false diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..b2117741 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/cli.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/main.yaml new file mode 100644 index 00000000..29193c00 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/main.yaml @@ -0,0 +1,7 @@ +--- +- include: cli.yaml + tags: + - cli +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..b6bd3eaf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/deleted.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/deleted.yml new file mode 100644 index 00000000..5f0c129e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/deleted.yml @@ -0,0 +1,76 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces deleted integration tests connection = {{ ansible_connection + }} + +- name: Enable LLDP feature + cisco.nxos.nxos_feature: + feature: lldp + state: enabled + +- block: + + - name: Setup + cisco.nxos.nxos_config: + lines: + - "interface Ethernet1/1" + - " lldp receive" + - " no lldp transmit" + - "interface Ethernet1/2" + - " no lldp receive" + - " lldp tlv-set vlan 12" + - "interface Ethernet1/3" + - " lldp tlv-set management-address 192.0.2.12" + + - name: Delete on single interface + register: result + cisco.nxos.nxos_lldp_interfaces: + config: + + - name: Ethernet1/2 + state: deleted + + - assert: + that: + - result.changed == true + - "'interface Ethernet1/2' in result.commands" + - "'lldp receive' in result.commands" + - "'no lldp tlv-set vlan 12' in result.commands" + - result.commands | length == 3 + + - name: Gather lldp_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_interfaces + + - name: Deleted + register: result + cisco.nxos.nxos_lldp_interfaces: &id001 + state: deleted + + - assert: + that: + - ansible_facts.network_resources.lldp_interfaces == result.before + - "'interface Ethernet1/1' in result.commands" + - "'lldp transmit' in result.commands" + - "'interface Ethernet1/3' in result.commands" + - "'no lldp tlv-set management-address 192.0.2.12' in result.commands" + - 'result.changed == true ' + - result.commands | length == 4 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_lldp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/gathered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/gathered.yml new file mode 100644 index 00000000..d00691ad --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/gathered.yml @@ -0,0 +1,53 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces gathered integration tests connection={{ansible_connection}}" + +- name: Enable LLDP feature + cisco.nxos.nxos_feature: + feature: lldp + state: enabled + +- block: + + - name: Setup + cisco.nxos.nxos_config: + lines: + - "interface Ethernet1/1" + - " lldp receive" + - " no lldp transmit" + - "interface Ethernet1/2" + - " no lldp receive" + - " lldp tlv-set vlan 12" + - "interface Ethernet1/3" + - " lldp tlv-set management-address 192.0.2.12" + + - name: Gather lldp interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_interfaces + + - name: Gathered + register: result + cisco.nxos.nxos_lldp_interfaces: &id001 + state: gathered + + - assert: + that: + - result.changed == false + - ansible_facts.network_resources.lldp_interfaces == result.gathered + + - name: Idempotence - Gathered + register: result + cisco.nxos.nxos_lldp_interfaces: *id001 + + - assert: + that: + - result.changed == false + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/merged.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/merged.yml new file mode 100644 index 00000000..89cd5ea0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/merged.yml @@ -0,0 +1,62 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces merged integration tests connection={{ansible_connection}} + +- name: Enable lldp + cisco.nxos.nxos_feature: + feature: lldp + +- block: + + - name: Merged + register: result + cisco.nxos.nxos_lldp_interfaces: &id001 + config: + + - name: Ethernet 1/1 + receive: false + tlv_set: + vlan: 123 + + - name: Ethernet1/2 + transmit: false + tlv_set: + management_address: 10.0.0.1 + state: merged + + - assert: + that: + - result.changed == true + - "'interface Ethernet1/1' in result.commands" + - "'no lldp receive' in result.commands" + - "'lldp tlv-set vlan 123' in result.commands" + - "'interface Ethernet1/2' in result.commands" + - "'no lldp transmit' in result.commands" + - "'lldp tlv-set management-address 10.0.0.1' in result.commands" + - result.commands | length == 6 + + - name: Gather lldp_interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_interfaces + + - assert: + that: + - ansible_facts.network_resources.lldp_interfaces == result.after + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_lldp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands | length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/overridden.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/overridden.yml new file mode 100644 index 00000000..edacef1e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/overridden.yml @@ -0,0 +1,69 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces overridden tests connection={{ ansible_connection + }} + +- name: Enable LLDP feature + cisco.nxos.nxos_feature: + feature: lldp + state: enabled + +- block: + + - name: Setup + cisco.nxos.nxos_config: + lines: + - "interface Ethernet1/1" + - " no lldp receive" + - " lldp tlv-set management-address 12.12.12.12" + + - name: Gather lldp_interfaces facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_interfaces + + - name: Overridden + register: result + cisco.nxos.nxos_lldp_interfaces: &id002 + config: + + - name: Ethernet1/2 + receive: false + tlv_set: + vlan: 12 + state: overridden + + - assert: + that: + - ansible_facts.network_resources.lldp_interfaces == result.before + - "'interface Ethernet1/1' in result.commands" + - "'lldp receive' in result.commands" + - "'no lldp tlv-set management-address 12.12.12.12' in result.commands" + - "'interface Ethernet1/2' in result.commands" + - "'no lldp receive' in result.commands" + - "'lldp tlv-set vlan 12' in result.commands" + - result.commands | length == 6 + + - name: Gather lldp_interfaces post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - ansible_facts.network_resources.lldp_interfaces == result.after + + - name: Idempotence - overridden + register: result + cisco.nxos.nxos_lldp_interfaces: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/parsed.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/parsed.yml new file mode 100644 index 00000000..72d97425 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/parsed.yml @@ -0,0 +1,42 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces parsed integration tests connection={{ansible_connection}}" + +- name: Enable lldp + cisco.nxos.nxos_feature: + feature: lldp + +- block: + + - name: Gather lldp interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_interfaces + + - name: Parsed + register: result + cisco.nxos.nxos_lldp_interfaces: &id001 + running_config: "interface Ethernet1/1\n lldp receive\n no lldp transmit\n\ + interface Ethernet1/2\n no lldp receive\n lldp tlv-set vlan 12\ninterface\ + \ Ethernet1/3\n lldp tlv-set management-address 192.0.2.12\n" + state: parsed + + - assert: + that: + - result.changed == false + - result.parsed == parsed + + - name: Idempotence - Parsed + register: result + cisco.nxos.nxos_lldp_interfaces: *id001 + + - assert: + that: result.changed == false + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/remove_config.yaml new file mode 100644 index 00000000..db070420 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/remove_config.yaml @@ -0,0 +1,7 @@ +--- +- ignore_errors: true + cisco.nxos.nxos_config: + lines: + - "no interface port-channel1" + - "no interface port-channel2" + - "no interface port-channel12" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rendered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rendered.yml new file mode 100644 index 00000000..a20f1488 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rendered.yml @@ -0,0 +1,44 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces rendered tests connection={{ ansible_connection + }} + +- name: Rendered + register: result + cisco.nxos.nxos_lldp_interfaces: &id001 + config: + + - name: Ethernet1/1 + receive: true + transmit: false + + - name: Ethernet1/2 + receive: false + tlv_set: + vlan: 12 + + - name: Ethernet1/3 + tlv_set: + management_address: 192.0.2.12 + state: rendered + +- assert: + that: + - result.changed == false + - "'interface Ethernet1/1' in result.rendered" + - "'lldp receive' in result.rendered" + - "'no lldp transmit' in result.rendered" + - "'interface Ethernet1/2' in result.rendered" + - "'no lldp receive' in result.rendered" + - "'lldp tlv-set vlan 12' in result.rendered" + - "'interface Ethernet1/3' in result.rendered" + - "'lldp tlv-set management-address 192.0.2.12' in result.rendered" + - result.rendered | length == 8 + +- name: Idempotence - Rendered + register: result + cisco.nxos.nxos_lldp_interfaces: *id001 + +- assert: + that: + - result.changed == false diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/replaced.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/replaced.yml new file mode 100644 index 00000000..b6127906 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/replaced.yml @@ -0,0 +1,64 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces replaced integration tests connection = {{ansible_connection}} + +- name: Enable lldp feature + cisco.nxos.nxos_feature: + feature: lldp + state: enabled + +- block: + + - name: Setup + cisco.nxos.nxos_config: + lines: + - "interface Ethernet1/2" + - " no lldp receive" + - " lldp tlv-set management-address 192.168.122.64" + + - name: Replaced + register: result + cisco.nxos.nxos_lldp_interfaces: &id001 + config: + + - name: Ethernet1/2 + transmit: false + tlv_set: + vlan: 2 + state: replaced + + - assert: + that: + - result.changed == true + - "'interface Ethernet1/2' in result.commands" + - "'lldp receive' in result.commands" + - "'no lldp tlv-set management-address 192.168.122.64' in result.commands" + - "'no lldp transmit' in result.commands" + - "'lldp tlv-set vlan 2' in result.commands" + - result.commands|length == 5 + + - name: Gather lldp_interfaces post facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: lldp_interfaces + + - assert: + that: + - ansible_facts.network_resources.lldp_interfaces == result.after + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_lldp_interfaces: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rtt.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rtt.yml new file mode 100644 index 00000000..4adb7c15 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/tests/common/rtt.yml @@ -0,0 +1,75 @@ +--- +- debug: + msg: Start nxos_lldp_interfaces round trip integration tests on connection={{ + ansible_connection }} + +- name: Enable lldp + cisco.nxos.nxos_feature: + feature: lldp + +- include_tasks: remove_config.yaml + +- block: + + - name: RTT - Apply the provided configuration (base config) + register: base_config + cisco.nxos.nxos_lldp_interfaces: + config: + + - name: Ethernet1/1 + transmit: false + tlv_set: + vlan: 5 + state: merged + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - lldp_interfaces + + - name: Apply provided configuration (this will be reverted) + register: result + cisco.nxos.nxos_lldp_interfaces: + config: + + - name: Ethernet1/1 + transmit: false + + - name: Ethernet1/2 + transmit: true + tlv_set: + vlan: 12 + management_address: 10.1.1.2 + state: overridden + + - name: Assert that changes were applied + assert: + that: + - result.changed == true + - "'interface Ethernet1/1' in result.commands" + - "'no lldp tlv-set vlan 5' in result.commands" + - "'interface Ethernet1/2' in result.commands" + - "'lldp transmit' in result.commands" + - "'lldp tlv-set vlan 12' in result.commands" + - "'lldp tlv-set management-address 10.1.1.2' in result.commands" + - result.commands | length == 6 + + - name: Revert back to base configuration + register: revert + cisco.nxos.nxos_lldp_interfaces: + config: "{{ ansible_facts['network_resources']['lldp_interfaces'] }}" + state: overridden + + - name: Assert that config was reverted + assert: + that: "{{ base_config['after'] | symmetric_difference(revert['after']) |length\ + \ == 0 }}" + always: + + - name: teardown + cisco.nxos.nxos_feature: + feature: lldp + state: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/vars/main.yml new file mode 100644 index 00000000..ed33efa4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_lldp_interfaces/vars/main.yml @@ -0,0 +1,12 @@ +--- +parsed: + - name: Ethernet1/1 + receive: true + transmit: false + - name: Ethernet1/2 + receive: false + tlv_set: + vlan: 12 + - name: Ethernet1/3 + tlv_set: + management_address: 192.0.2.12 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/meta/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/meta/main.yaml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/meta/main.yaml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/main.yaml new file mode 100644 index 00000000..02b53261 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/main.yaml @@ -0,0 +1,18 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + + - include: nxapi.yaml + tags: + - nxapi + always: + + - name: Set Baud Rate Back to 9600 so our tests don't break + connection: ansible.netcommon.network_cli + cisco.nxos.nxos_config: + lines: + - speed 9600 + parents: line console diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/basic.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/basic.yaml new file mode 100644 index 00000000..403e8161 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/basic.yaml @@ -0,0 +1,519 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_logging basic test" + +- name: Workaround to clear logging logfile size + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - logging logfile test 1 size 4194304 + +- name: Purge logging configuration first + cisco.nxos.nxos_logging: + purge: true + +- name: Set up console logging + register: result + cisco.nxos.nxos_logging: &id001 + dest: console + dest_level: 0 + state: present + +- assert: + that: + - result.changed == true + - '"logging console 0" in result.commands' + +- name: Set up console logging again (idempotent) + register: result + cisco.nxos.nxos_logging: *id001 + +- assert: &id003 + that: + - result.changed == false + +- name: Set up console logging with level 2 (edge case) + register: result + cisco.nxos.nxos_logging: &id002 + dest: console + dest_level: 2 + state: present + +- assert: + that: + - result.changed == true + - '"logging console 2" in result.commands' + +- name: Set up console logging with level 2 (edge case) (idempotent) + register: result + cisco.nxos.nxos_logging: *id002 + +- assert: *id003 + +- name: Set Baud Rate to less than 38400 + cisco.nxos.nxos_config: + lines: + - speed 19200 + parents: line console + +- name: Enable console logging with level 3 (will fail) + register: result + ignore_errors: true + cisco.nxos.nxos_logging: &id004 + dest: console + dest_level: 3 + +- assert: + that: + - result.failed == true + +- name: Set Baud Rate to 38400 + cisco.nxos.nxos_config: + lines: + - speed 38400 + parents: line console + +- name: Enable console logging with level 3 (will pass) + register: result + cisco.nxos.nxos_logging: *id004 + +- assert: + that: + - result.changed == true + - '"logging console 3" in result.commands' + +- block: + + - name: Logfile logging with level + register: result + cisco.nxos.nxos_logging: &id005 + dest: logfile + name: test + dest_level: 1 + state: present + + - assert: + that: + - result.changed == true + - '"logging logfile test 1" in result.commands' + + - name: Logfile logging with level (idempotent) + register: result + cisco.nxos.nxos_logging: *id005 + + - assert: *id003 + when: platform is not search('N5K|N7K') and imagetag is not search("A8") + +- name: Configure module with level + register: result + cisco.nxos.nxos_logging: &id006 + dest: module + dest_level: 2 + +- assert: + that: + - result.changed == true + - '"logging module 2" in result.commands' + +- name: Configure module with level (idempotent) + register: result + cisco.nxos.nxos_logging: *id006 + +- assert: *id003 + +- name: Configure monitor with level + register: result + cisco.nxos.nxos_logging: &id007 + dest: monitor + dest_level: 3 + +- assert: + that: + - result.changed == true + - '"logging monitor 3" in result.commands' + +- name: Configure monitor with level (idempotent) + register: result + cisco.nxos.nxos_logging: *id007 + +- assert: *id003 + +- name: Configure monitor with level 5 (edge case) + register: result + cisco.nxos.nxos_logging: &id008 + dest: monitor + dest_level: 5 + +- assert: + that: + - result.changed == true + - '"logging monitor 5" in result.commands' + +- name: Configure monitor with level 5 (edge case) (idempotent) + register: result + cisco.nxos.nxos_logging: *id008 + +- assert: *id003 + +- name: Configure facility with level + register: result + cisco.nxos.nxos_logging: &id009 + facility: daemon + facility_level: 4 + +- assert: + that: + - result.changed == true + - '"logging level daemon 4" in result.commands' + +- name: Configure facility with level (idempotent) + register: result + cisco.nxos.nxos_logging: *id009 + +- assert: *id003 + +- name: Configure Remote Logging + register: result + cisco.nxos.nxos_logging: &id010 + dest: server + remote_server: test-syslogserver.com + facility: auth + facility_level: 1 + use_vrf: management + state: present + +- assert: + that: + - result.changed == true + - '"logging server test-syslogserver.com 1 facility auth use-vrf management" + in result.commands' + +- name: Configure Remote Logging (idempotent) + register: result + cisco.nxos.nxos_logging: *id010 + +- assert: *id003 + +- name: Configure Source Interface for Logging + register: result + cisco.nxos.nxos_logging: &id011 + interface: mgmt0 + +- assert: + that: + - result.changed == true + - '"logging source-interface mgmt 0" in result.commands' + +- name: Configure Source Interface for Logging (idempotent) + register: result + cisco.nxos.nxos_logging: *id011 + +- assert: + that: + - result.changed == false + +- name: remove logging as collection tearDown + register: result + cisco.nxos.nxos_logging: &id012 + aggregate: + + - dest: console + dest_level: 3 + + - dest: module + dest_level: 2 + + - dest: monitor + dest_level: 5 + + - dest: logfile + dest_level: 1 + name: test + + - facility: daemon + facility_level: 4 + + - dest: server + remote_server: test-syslogserver.com + facility: auth + facility_level: 1 + use_vrf: management + + - interface: mgmt0 + state: absent + +- assert: + that: + - result.changed == true + - '"no logging logfile" in result.commands' + - '"no logging level daemon 4" in result.commands' + - '"no logging monitor" in result.commands' + - '"no logging module" in result.commands' + - '"no logging server test-syslogserver.com" in result.commands' + - '"no logging source-interface" in result.commands' + when: platform is not search('N5K|N7K') and imagetag is not search("A8") + +- assert: + that: + - result.changed == true + - '"no logging level daemon 4" in result.commands' + - '"no logging monitor" in result.commands' + - '"no logging module" in result.commands' + - '"no logging server test-syslogserver.com" in result.commands' + - '"no logging source-interface" in result.commands' + when: platform is search('N5K|N7K') or imagetag is search("A8") + +- name: remove aggregate logging (idempotent) + register: result + cisco.nxos.nxos_logging: *id012 + +- assert: *id003 + +- block: + + - name: Configure Logging message + register: result + cisco.nxos.nxos_logging: &id013 + interface_message: add-interface-description + state: present + + - assert: &id014 + that: + - result.changed == true + + - name: Configure Logging message (idempotent) + register: result + cisco.nxos.nxos_logging: *id013 + + - assert: *id003 + + - name: Remove Logging message + register: result + cisco.nxos.nxos_logging: + interface_message: add-interface-description + state: absent + + - assert: *id014 + when: platform is not search('N5K') and imagetag is not search("A8") + +- name: Logfile logging with level and size + register: result + cisco.nxos.nxos_logging: &id015 + dest: logfile + name: test + dest_level: 1 + file_size: 16384 + state: present + +- assert: + that: + - result.changed == true + - '"logging logfile test 1 size 16384" in result.commands' + +- name: Logfile logging with level and size (idempotent) + register: result + cisco.nxos.nxos_logging: *id015 + +- assert: *id003 + +- name: Remove logfile logging with level and size + register: result + cisco.nxos.nxos_logging: + dest: logfile + name: test + dest_level: 1 + file_size: 16384 + state: absent + +- assert: *id014 + +- name: Set up logging event link enable + register: result + cisco.nxos.nxos_logging: &id016 + event: link-enable + +- assert: + that: + - result.changed == true + - '"logging event link-status enable" in result.commands' + +- name: Set up logging event link enable again (idempotent) + register: result + cisco.nxos.nxos_logging: *id016 + +- assert: *id003 + +- name: Remove logging event link enable + register: result + cisco.nxos.nxos_logging: &id017 + event: link-enable + state: absent + +- assert: *id014 + +- name: Remove logging event link enable again (idempotent) + register: result + cisco.nxos.nxos_logging: *id017 + +- assert: *id003 + +- name: Set up logging event link default + register: result + cisco.nxos.nxos_logging: &id018 + event: link-default + +- assert: + that: + - result.changed == true + - '"logging event link-status default" in result.commands' + +- name: Set up logging event link default again (idempotent) + register: result + cisco.nxos.nxos_logging: *id018 + +- assert: *id003 + +- name: Remove logging event link default + register: result + cisco.nxos.nxos_logging: &id019 + event: link-default + state: absent + +- assert: *id014 + +- name: Remove logging event link default again (idempotent) + register: result + cisco.nxos.nxos_logging: *id019 + +- assert: *id003 + +- name: Set up logging event trunk enable + register: result + cisco.nxos.nxos_logging: &id020 + event: trunk-enable + +- assert: + that: + - result.changed == true + - '"logging event trunk-status enable" in result.commands' + +- name: Set up logging event trunk enable again (idempotent) + register: result + cisco.nxos.nxos_logging: *id020 + +- assert: *id003 + +- name: Remove logging event trunk enable + register: result + cisco.nxos.nxos_logging: &id021 + event: trunk-enable + state: absent + +- assert: *id014 + +- name: Remove logging event trunk enable again (idempotent) + register: result + cisco.nxos.nxos_logging: *id021 + +- assert: *id003 + +- name: Set up logging event trunk default + register: result + cisco.nxos.nxos_logging: &id022 + event: trunk-default + +- assert: + that: + - result.changed == true + - '"logging event trunk-status default" in result.commands' + +- name: Set up logging event trunk default again (idempotent) + register: result + cisco.nxos.nxos_logging: *id022 + +- assert: *id003 + +- name: Remove logging event trunk default + register: result + cisco.nxos.nxos_logging: &id023 + event: trunk-default + state: absent + +- assert: *id014 + +- name: Remove logging event trunk default again (idempotent) + register: result + cisco.nxos.nxos_logging: *id023 + +- assert: *id003 + +- name: Set up Logging Timestamp + register: result + cisco.nxos.nxos_logging: &id024 + timestamp: microseconds + state: present + +- assert: *id014 + +- name: Set up Logging Timestamp (idempotent) + register: result + cisco.nxos.nxos_logging: *id024 + +- assert: *id003 + +- name: Remove Logging Timestamp + register: result + cisco.nxos.nxos_logging: + timestamp: microseconds + state: absent + +- assert: *id014 + +- name: Set up Facility ethpm Link UP Error + register: result + cisco.nxos.nxos_logging: &id025 + facility: ethpm + facility_link_status: link-up-error + state: present + +- assert: *id014 + +- name: Set up Facility ethpm Link UP Error (idempotent) + register: result + cisco.nxos.nxos_logging: *id025 + +- assert: *id003 + +- name: Remove Facility ethpm Link UP Error + register: result + cisco.nxos.nxos_logging: + facility: ethpm + facility_link_status: link-up-error + state: absent + +- assert: *id014 + +- name: Set up Facility ethpm Link DOWN Error + register: result + cisco.nxos.nxos_logging: &id026 + facility: ethpm + facility_link_status: link-down-error + state: present + +- assert: *id014 + +- name: Set up Facility ethpm Link DOWN Error (idempotent) + register: result + cisco.nxos.nxos_logging: *id026 + +- assert: *id003 + +- name: Remove Facility ethpm Link DOWN Error + register: result + cisco.nxos.nxos_logging: + facility: ethpm + facility_link_status: link-down-error + state: absent + +- assert: *id014 + +- debug: msg="END connection={{ ansible_connection }} nxos_logging basic test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/net_logging.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/net_logging.yaml new file mode 100644 index 00000000..8f9cc35d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/net_logging.yaml @@ -0,0 +1,30 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos common/net_logging.yaml" + +- name: Delete/disable console logging - setup + register: result + ansible.netcommon.net_logging: + dest: console + dest_level: 0 + state: absent + +- name: Set up console logging using platform agnostic module + register: result + ansible.netcommon.net_logging: + dest: console + dest_level: 0 + state: present + +- assert: + that: + - result.changed == true + - '"logging console 0" in result.commands' + +- name: Delete/disable console logging - teardown + register: result + ansible.netcommon.net_logging: + dest: console + dest_level: 0 + state: absent + +- debug: msg="END connection={{ ansible_connection }} nxos common/net_logging.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/purge.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/purge.yaml new file mode 100644 index 00000000..f0d56822 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_logging/tests/common/purge.yaml @@ -0,0 +1,112 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_logging purge test" + +- name: Purge logging configuration first + cisco.nxos.nxos_logging: + purge: true + +- block: + + - name: Set up console logging + register: result + cisco.nxos.nxos_logging: + dest: console + dest_level: 0 + state: present + + - assert: + that: + - result.changed == true + - '"logging console 0" in result.commands' + + - name: Set up Logging Timestamp + register: result + cisco.nxos.nxos_logging: + timestamp: microseconds + state: present + + - assert: + that: + - result.changed == true + - '"logging timestamp microseconds" in result.commands' + + - name: Configure monitor with level + register: result + cisco.nxos.nxos_logging: + dest: monitor + dest_level: 3 + + - assert: + that: + - result.changed == true + - '"logging monitor 3" in result.commands' + + - name: Configure facility with level + register: result + cisco.nxos.nxos_logging: + facility: daemon + facility_level: 4 + + - assert: + that: + - result.changed == true + - '"logging level daemon 4" in result.commands' + + - name: Configure logging level virtual-service 7 using nxos_config + register: result + cisco.nxos.nxos_config: + lines: logging level virtual-service 7 + + - assert: + that: + - result.changed == true + + - name: Purge the outliers + register: result + cisco.nxos.nxos_logging: + purge: true + + - assert: + that: + - result.changed == true + - '"no logging level virtual-service 7" in result.commands' + + - block: + + - name: Purge the outliers (idempotent) + register: result + cisco.nxos.nxos_logging: + purge: true + + - assert: + that: + - result.changed == false + when: imagetag is not search("A8") + + - name: remove logging as collection tearDown + register: result + cisco.nxos.nxos_logging: + aggregate: + + - dest: console + dest_level: 0 + + - dest: monitor + dest_level: 3 + + - timestamp: microseconds + + - facility: daemon + facility_level: 4 + state: absent + + - assert: + that: + - result.changed == true + - '"no logging console" in result.commands' + - '"no logging timestamp microseconds" in result.commands' + - '"no logging level daemon 4" in result.commands' + - '"no logging monitor" in result.commands' + when: ansible_connection != "local" + +- debug: msg="END connection={{ ansible_connection }} nxos_logging purge test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tests/common/sanity.yaml new file mode 100644 index 00000000..d8baa70f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp/tests/common/sanity.yaml @@ -0,0 +1,114 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_ntp sanity test" + +- name: Setup - Remove ntp if configured + ignore_errors: true + cisco.nxos.nxos_ntp: &id005 + server: 1.2.3.4 + key_id: 32 + prefer: disabled + vrf_name: management + source_addr: 192.0.2.5 + state: absent + +- block: + + - name: Configure ntp + register: result + cisco.nxos.nxos_ntp: &id001 + server: 1.2.3.4 + key_id: 32 + prefer: enabled + vrf_name: management + source_addr: 192.0.2.5 + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_ntp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure ntp with some defaults + register: result + cisco.nxos.nxos_ntp: &id003 + peer: 1.2.3.4 + key_id: default + prefer: enabled + vrf_name: default + source_addr: default + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_ntp: *id003 + + - assert: *id004 + + - name: Remove ntp config + register: result + cisco.nxos.nxos_ntp: *id005 + + - assert: *id002 + + - name: Remove Idempotence Check + register: result + cisco.nxos.nxos_ntp: *id005 + + - assert: *id004 + + - name: Configure ntp again + register: result + cisco.nxos.nxos_ntp: &id006 + source_int: Ethernet1/3 + peer: 1.2.3.4 + prefer: enabled + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_ntp: *id006 + + - assert: *id004 + + - name: Remove source interface + register: result + cisco.nxos.nxos_ntp: &id007 + source_int: default + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_ntp: *id007 + + - assert: *id004 + + - name: Remove ntp + register: result + cisco.nxos.nxos_ntp: *id005 + + - assert: *id002 + + - name: Remove Idempotence Check + register: result + cisco.nxos.nxos_ntp: *id005 + + - assert: *id004 + always: + + - name: Remove ntp config + cisco.nxos.nxos_ntp: *id005 + + - debug: msg="END connection={{ ansible_connection }} nxos_ntp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tests/common/sanity.yaml new file mode 100644 index 00000000..5fa09b68 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_auth/tests/common/sanity.yaml @@ -0,0 +1,133 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_ntp_auth sanity test" + +- name: Configure text ntp authentication + ignore_errors: true + cisco.nxos.nxos_ntp_auth: &id009 + key_id: 32 + md5string: hello + state: absent + +- block: + + - name: Configure text ntp authentication + register: result + cisco.nxos.nxos_ntp_auth: + key_id: 32 + md5string: hello + authentication: false + state: present + + - assert: &id001 + that: + - result.changed == true + + - name: Remove text ntp authentication + register: result + cisco.nxos.nxos_ntp_auth: + key_id: 32 + md5string: hello + authentication: false + state: absent + + - assert: *id001 + + - name: Configure encrypt ntp authentication + register: result + cisco.nxos.nxos_ntp_auth: &id002 + key_id: 32 + md5string: hello + auth_type: encrypt + state: present + + - assert: *id001 + + - name: Check Idempotence - Configure encrypt ntp authentication + register: result + cisco.nxos.nxos_ntp_auth: *id002 + + - assert: &id004 + that: + - result.changed == false + + - name: Turn on authentication + register: result + cisco.nxos.nxos_ntp_auth: &id003 + authentication: true + state: present + + - assert: *id001 + + - name: Check Idempotence - Turn on authentication + register: result + cisco.nxos.nxos_ntp_auth: *id003 + + - assert: *id004 + + - name: Turn off authentication + register: result + cisco.nxos.nxos_ntp_auth: &id005 + authentication: false + state: present + + - assert: *id001 + + - name: Check Idempotence - Turn off authentication + register: result + cisco.nxos.nxos_ntp_auth: *id005 + + - assert: *id004 + + - name: Add trusted key + register: result + cisco.nxos.nxos_ntp_auth: &id006 + key_id: 32 + trusted_key: true + state: present + + - assert: *id001 + + - name: Check Idempotence - Add trusted key + register: result + cisco.nxos.nxos_ntp_auth: *id006 + + - assert: *id004 + + - name: Remove trusted key + register: result + cisco.nxos.nxos_ntp_auth: &id007 + key_id: 32 + trusted_key: false + state: present + + - assert: *id001 + + - name: Check Idempotence - Remove trusted key + register: result + cisco.nxos.nxos_ntp_auth: *id007 + + - assert: *id004 + + - name: Remove encrypt ntp authentication + register: result + cisco.nxos.nxos_ntp_auth: &id008 + key_id: 32 + md5string: hello + auth_type: encrypt + authentication: true + state: absent + + - assert: *id001 + + - name: Check Idempotence - Remove encrypt ntp authentication + register: result + cisco.nxos.nxos_ntp_auth: *id008 + + - assert: *id004 + always: + + - name: Cleanup ntp auth config + ignore_errors: true + cisco.nxos.nxos_ntp_auth: *id009 + + - debug: msg="END connection={{ ansible_connection }} nxos_ntp_auth sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tests/common/sanity.yaml new file mode 100644 index 00000000..a4babe05 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ntp_options/tests/common/sanity.yaml @@ -0,0 +1,101 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_ntp_options sanity + test" + +- name: Apply default ntp config + ignore_errors: true + cisco.nxos.nxos_ntp_options: &id007 + state: absent + +- block: + + - name: Configure ntp with master and default stratum + register: result + cisco.nxos.nxos_ntp_options: &id001 + master: true + logging: true + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence - Configure ntp with master and default stratum + register: result + cisco.nxos.nxos_ntp_options: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure ntp with master and non-default stratum + register: result + cisco.nxos.nxos_ntp_options: &id003 + master: true + stratum: 10 + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure ntp with master and non-default stratum + register: result + cisco.nxos.nxos_ntp_options: *id003 + + - assert: *id004 + + - name: Configure ntp with master and no logging + register: result + cisco.nxos.nxos_ntp_options: &id005 + master: true + stratum: 10 + logging: false + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure ntp with master and no logging + register: result + cisco.nxos.nxos_ntp_options: *id005 + + - assert: *id004 + + - name: Configure ntp with logging and no master + register: result + cisco.nxos.nxos_ntp_options: &id006 + master: false + logging: true + state: present + + - assert: *id002 + + - name: Check Idempotence - Configure ntp with logging and no master + register: result + cisco.nxos.nxos_ntp_options: *id006 + + - assert: *id004 + + - name: Configure ntp with master and non-default stratum again + register: result + cisco.nxos.nxos_ntp_options: *id003 + + - assert: *id002 + + - name: Remove ntp options + register: result + cisco.nxos.nxos_ntp_options: *id007 + + - assert: *id002 + + - name: Check Idempotence - Remove + register: result + cisco.nxos.nxos_ntp_options: *id007 + + - assert: *id004 + always: + + - name: Cleanup ntp config + register: result + cisco.nxos.nxos_ntp_options: *id007 + + - debug: msg="END connection={{ ansible_connection }} nxos_ntp_options sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/nxapi.yaml new file mode 100644 index 00000000..a41d081b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/nxapi.yaml @@ -0,0 +1,35 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run + +- name: run test cases (connection=local) + include: '{{ test_case_to_run }} ansible_connection=local connection={{ nxapi + }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_http.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_http.yaml new file mode 100644 index 00000000..134e5d7c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_http.yaml @@ -0,0 +1,17 @@ +--- +- name: Assert HTTP configuration changes + assert: + that: + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'].l_port + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'].l_port|string + is search("80") + - result.stdout[0]['operation_status'].o_status == 'nxapi enabled' + when: result.stdout[0].TABLE_listen_on_port is defined + +- name: Assert HTTP configuration changes 9.2 or greater + assert: + that: + - result.stdout[0]['http_port'] + - result.stdout[0]['http_port']|string is search("80") + - result.stdout[0]['nxapi_status'] == 'nxapi enabled' + when: result.stdout[0].http_port is defined diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https.yaml new file mode 100644 index 00000000..b6e642e5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https.yaml @@ -0,0 +1,17 @@ +--- +- name: Assert HTTPS configuration changes + assert: + that: + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'].l_port + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'].l_port|string + is search("9443") + - result.stdout[0]['operation_status'].o_status == 'nxapi enabled' + when: result.stdout[0].TABLE_listen_on_port is defined + +- name: Assert HTTPS configuration changes 9.2 or greater + assert: + that: + - result.stdout[0]['https_port'] + - result.stdout[0]['https_port']|string is search("9443") + - result.stdout[0]['nxapi_status'] == 'nxapi enabled' + when: result.stdout[0].https_port is defined diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http.yaml new file mode 100644 index 00000000..bdf5bfab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http.yaml @@ -0,0 +1,23 @@ +--- +- name: Assert HTTPS & HTTP configuration changes + assert: + that: + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][1].l_port + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][1].l_port|string + is search("9443") + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][0].l_port + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][0].l_port|string + is search("80") + - result.stdout[0]['operation_status'].o_status == 'nxapi enabled' + when: result.stdout[0].TABLE_listen_on_port is defined + +- name: Assert HTTPS & HTTP configuration changes 9.2 or greater + assert: + that: + - result.stdout[0]['https_port'] + - result.stdout[0]['https_port']|string is search("9443") + - result.stdout[0]['http_port'] + - result.stdout[0]['http_port']|string is search("80") + - result.stdout[0]['nxapi_status'] == 'nxapi enabled' + when: result.stdout[0].https_port is defined or result.stdout[0].http_port is + defined diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http_ports.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http_ports.yaml new file mode 100644 index 00000000..4154a4e4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/default/assert_changes_https_http_ports.yaml @@ -0,0 +1,23 @@ +--- +- name: Assert HTTPS & HTTP configuration changes + assert: + that: + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][1].l_port + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][1].l_port|string + is search("500") + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][0].l_port + - result.stdout[0]['TABLE_listen_on_port']['ROW_listen_on_port'][0].l_port|string + is search("99") + - result.stdout[0]['operation_status'].o_status == 'nxapi enabled' + when: result.stdout[0].TABLE_listen_on_port is defined + +- name: Assert HTTPS & HTTP configuration changes 9.2 or greater + assert: + that: + - result.stdout[0]['https_port'] + - result.stdout[0]['https_port']|string is search("500") + - result.stdout[0]['http_port'] + - result.stdout[0]['http_port']|string is search("99") + - result.stdout[0]['nxapi_status'] == 'nxapi enabled' + when: result.stdout[0].https_port is defined or result.stdout[0].http_port is + defined diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_http.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_http.yaml new file mode 100644 index 00000000..2f79127f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_http.yaml @@ -0,0 +1,6 @@ +--- +- name: Assert HTTP configuration changes + assert: + that: + - result.stdout[0].https_port is not defined + - result.stdout[0].http_port|string is search("80") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https.yaml new file mode 100644 index 00000000..a934a1fa --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https.yaml @@ -0,0 +1,6 @@ +--- +- name: Assert HTTPS configuration changes + assert: + that: + - result.stdout[0].http_port is not defined + - result.stdout[0].https_port|string is search("9443") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http.yaml new file mode 100644 index 00000000..4dded98c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http.yaml @@ -0,0 +1,8 @@ +--- +- name: Assert HTTPS && HTTP configuration changes + assert: + that: + - result.stdout[0].https_port is defined + - result.stdout[0].http_port is defined + - result.stdout[0].https_port|string is search("9443") + - result.stdout[0].http_port|string is search("80") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http_ports.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http_ports.yaml new file mode 100644 index 00000000..09c69d67 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n5k/assert_changes_https_http_ports.yaml @@ -0,0 +1,8 @@ +--- +- name: Assert HTTPS && HTTP configuration changes + assert: + that: + - result.stdout[0].https_port is defined + - result.stdout[0].http_port is defined + - result.stdout[0].https_port|string is search("500") + - result.stdout[0].http_port|string is search("99") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_http.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_http.yaml new file mode 100644 index 00000000..fbfba2fd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_http.yaml @@ -0,0 +1,7 @@ +--- +- name: Assert HTTP configuration changes + assert: + that: + - result.stdout[0].https_port is not defined + - result.stdout[0].http_port|string is search("80") + - result.stdout[0].sandbox_status == 'Enabled' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https.yaml new file mode 100644 index 00000000..83d954aa --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https.yaml @@ -0,0 +1,7 @@ +--- +- name: Assert HTTPS configuration changes + assert: + that: + - result.stdout[0].http_port is not defined + - result.stdout[0].https_port|string is search("9443") + - result.stdout[0].sandbox_status == 'Enabled' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http.yaml new file mode 100644 index 00000000..1db6d488 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http.yaml @@ -0,0 +1,9 @@ +--- +- name: Assert HTTPS & HTTP configuration changes + assert: + that: + - result.stdout[0].https_port is defined + - result.stdout[0].http_port is defined + - result.stdout[0].https_port|string is search("9443") + - result.stdout[0].http_port|string is search("80") + - result.stdout[0].sandbox_status == 'Enabled' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http_ports.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http_ports.yaml new file mode 100644 index 00000000..48611ef8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tasks/platform/n7k/assert_changes_https_http_ports.yaml @@ -0,0 +1,9 @@ +--- +- name: Assert HTTPS & HTTP configuration changes + assert: + that: + - result.stdout[0].https_port is defined + - result.stdout[0].http_port is defined + - result.stdout[0].https_port|string is search("500") + - result.stdout[0].http_port|string is search("99") + - result.stdout[0].sandbox_status == 'Enabled' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/configure.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/configure.yaml new file mode 100644 index 00000000..bf1c0bc5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/configure.yaml @@ -0,0 +1,142 @@ +--- +- debug: msg="START cli/configure.yaml" + +- set_fact: nxapi_sandbox_option="yes" + when: platform is search('N7K') + +- name: Setup - put NXAPI in stopped state + cisco.nxos.nxos_nxapi: + state: absent + +- block: + + - name: Configure NXAPI HTTPS + register: result + cisco.nxos.nxos_nxapi: &id001 + enable_http: false + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + enable_https: true + https_port: 9443 + + - register: result + cisco.nxos.nxos_command: + commands: + - show nxapi | json + + - include: tasks/platform/n7k/assert_changes_https.yaml + when: platform is match('N7K') + + - include: tasks/platform/n5k/assert_changes_https.yaml + when: platform is search('N5K|N6K') + + - include: tasks/platform/default/assert_changes_https.yaml + when: platform is not search('N35|N5K|N6K|N7K') + + - name: Configure NXAPI HTTPS again + register: result + cisco.nxos.nxos_nxapi: *id001 + + - name: Assert configuration is idempotent + assert: &id003 + that: + - result.changed == false + + - name: Configure NXAPI HTTPS & HTTP + register: result + cisco.nxos.nxos_nxapi: &id002 + enable_http: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + enable_https: true + https_port: 9443 + + - register: result + cisco.nxos.nxos_command: + commands: + - show nxapi | json + + - include: tasks/platform/n7k/assert_changes_https_http.yaml + when: platform is match('N7K') + + - include: tasks/platform/n5k/assert_changes_https_http.yaml + when: platform is match('N5K') + + - include: tasks/platform/default/assert_changes_https_http.yaml + when: platform is not search('N35|N5K|N6K|N7K') + + - name: Configure NXAPI HTTPS & HTTP again + register: result + cisco.nxos.nxos_nxapi: *id002 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure different NXAPI HTTPS & HTTP ports + register: result + cisco.nxos.nxos_nxapi: &id004 + enable_http: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + enable_https: true + http_port: 99 + https_port: 500 + + - register: result + cisco.nxos.nxos_command: + commands: + - show nxapi | json + + - include: tasks/platform/n7k/assert_changes_https_http_ports.yaml + when: platform is match('N7K') + + - include: tasks/platform/n5k/assert_changes_https_http_ports.yaml + when: platform is match('N5K') + + - include: tasks/platform/default/assert_changes_https_http_ports.yaml + when: platform is not search('N35|N5K|N6K|N7K') + + - name: Configure different NXAPI HTTPS & HTTP ports again + register: result + cisco.nxos.nxos_nxapi: *id004 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTP + register: result + cisco.nxos.nxos_nxapi: &id005 + enable_http: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + enable_https: false + + - register: result + cisco.nxos.nxos_command: + commands: + - show nxapi | json + + - include: tasks/platform/n7k/assert_changes_http.yaml + when: platform is match('N7K') + + - include: tasks/platform/n5k/assert_changes_http.yaml + when: platform is match('N5K') + + - include: tasks/platform/default/assert_changes_http.yaml + when: platform is not search('N35|N5K|N6K|N7K') + + - name: Configure NXAPI HTTP again + register: result + cisco.nxos.nxos_nxapi: *id005 + + - name: Assert configuration is idempotent + assert: *id003 + always: + + - name: Cleanup - Disable NXAPI + register: result + cisco.nxos.nxos_nxapi: + state: absent + + - name: Cleanup - Re-enable NXAPI + register: result + cisco.nxos.nxos_nxapi: + state: present + + - debug: msg="END cli/configure.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/disable.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/disable.yaml new file mode 100644 index 00000000..5d44c1a2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/disable.yaml @@ -0,0 +1,28 @@ +--- +- debug: msg="START cli/disable.yaml" + +- name: Disable NXAPI + register: result + cisco.nxos.nxos_nxapi: + state: absent + +- name: Check NXAPI state + register: result + cisco.nxos.nxos_command: + commands: + - show feature | grep nxapi + +- name: Assert NXAPI is disabled + assert: + that: result.stdout[0] is search('disabled') + +- name: Disable NXAPI again + register: result + cisco.nxos.nxos_nxapi: + state: absent + +- name: Assert idempotence + assert: + that: result.changed == false + +- debug: msg="END cli/disable.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/enable.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/enable.yaml new file mode 100644 index 00000000..7bcf411c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/enable.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START cli/enable.yaml" + +- name: Setup - put NXAPI in stopped state + register: result + cisco.nxos.nxos_nxapi: + state: absent + +- name: Enable NXAPI + register: result + cisco.nxos.nxos_nxapi: + state: present + +- name: Check NXAPI state + register: result + cisco.nxos.nxos_command: + commands: + - show feature | grep nxapi + +- name: Assert NXAPI is enabled + assert: + that: result.stdout[0] is search('enabled') + +- name: Enable NXAPI again + register: result + cisco.nxos.nxos_nxapi: + +- name: Assert idempotence + assert: + that: result.changed == false + +- debug: msg="END cli/enable.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/nxapi_ssl.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/nxapi_ssl.yaml new file mode 100644 index 00000000..d70d5134 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/cli/nxapi_ssl.yaml @@ -0,0 +1,248 @@ +--- +- block: + + - debug: msg="START cli/nxapi_ssl.yaml" + + - name: Configure NXAPI HTTPs w/weak ciphers + register: result + cisco.nxos.nxos_nxapi: &id001 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + ssl_strong_ciphers: false + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc ciphers + + - name: Assert weak ciphers configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl ciphers weak' + + - name: Configure NXAPI HTTP w/weak ciphers again + register: result + cisco.nxos.nxos_nxapi: *id001 + + - name: Assert configuration is idempotent + assert: &id003 + that: + - result.changed == false + + - name: Configure NXAPI HTTPs w/strong ciphers + register: result + cisco.nxos.nxos_nxapi: &id002 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + ssl_strong_ciphers: true + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc ciphers + + - name: Assert strong ciphers configuration + assert: + that: + - result.stdout_lines[0][0] == 'no nxapi ssl ciphers weak' + + - name: Configure NXAPI HTTPs w/strong ciphers again + register: result + cisco.nxos.nxos_nxapi: *id002 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs w/default TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id004 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/default TLSv1 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1' + + - name: Configure NXAPI HTTPs w/default again + register: result + cisco.nxos.nxos_nxapi: *id004 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs TLSv1.1 -default TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id005 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + tlsv1_1: true + tlsv1_0: false + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/TLSv1.1 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1.1' + + - name: Configure NXAPI HTTPs w/TLSv1.1 -default TLSv1 again + register: result + cisco.nxos.nxos_nxapi: *id005 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs TLSv1.2 -default TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id006 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + tlsv1_2: true + tlsv1_0: false + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/TLSv1.2 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1.2' + + - name: Configure NXAPI HTTPs w/TLSv1.2 -default TLSv1 again + register: result + cisco.nxos.nxos_nxapi: *id006 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs w/TLS1.2 +default TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id007 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + ssl_strong_ciphers: true + tlsv1_2: true + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/TLS1.2 +default TLSv1 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1 TLSv1.2' + + - name: Configure NXAPI HTTPs w/TLS1.2 again + register: result + cisco.nxos.nxos_nxapi: *id007 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs w/TLS1.2 TLS1.1 -default TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id008 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + ssl_strong_ciphers: true + tlsv1_0: false + tlsv1_1: true + tlsv1_2: true + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/TLS1.2 TLS1.2 -default TLSv1 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1.1 TLSv1.2' + + - name: Configure NXAPI HTTPs w/TLS1.2 TLS1.1 -default TLSv1 again + register: result + cisco.nxos.nxos_nxapi: *id008 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs w/TLS1.2 TLS1.1 +default TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id009 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + ssl_strong_ciphers: true + tlsv1_1: true + tlsv1_2: true + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/TLS1.2 TLS1.1 +default TLSv1 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1 TLSv1.1 TLSv1.2' + + - name: Configure NXAPI HTTPs w/TLS1.2 TLS1.1 +default TLSv1 again + register: result + cisco.nxos.nxos_nxapi: *id009 + + - name: Assert configuration is idempotent + assert: *id003 + + - name: Configure NXAPI HTTPs with explicit TLS1.2 TLS1.1 TLSv1 + register: result + cisco.nxos.nxos_nxapi: &id010 + enable_https: true + enable_sandbox: '{{nxapi_sandbox_option|default(omit)}}' + ssl_strong_ciphers: true + tlsv1_0: true + tlsv1_1: true + tlsv1_2: true + + - register: result + cisco.nxos.nxos_command: + commands: + - show run all | inc nxapi | inc protocols + + - name: Assert NXAPI HTTPs w/TLS1.2 TLS1.2 TLSv1 configuration + assert: + that: + - result.stdout_lines[0][0] == 'nxapi ssl protocols TLSv1 TLSv1.1 TLSv1.2' + + - name: Configure NXAPI HTTPs w/TLS1.2 TLS1.1 TLSv1 again + register: result + cisco.nxos.nxos_nxapi: *id010 + + - name: Assert configuration is idempotent + assert: *id003 + always: + + - name: Cleanup - Disable NXAPI + register: result + cisco.nxos.nxos_nxapi: + state: absent + + - name: Cleanup - Re-enable NXAPI + register: result + cisco.nxos.nxos_nxapi: + state: present + + - debug: msg="END cli/nxapi_ssl.yaml" + when: (platform is match("N9K") or platform is match("N3K") or platform is match("N9K-F") + or platform is match("N35") or platform is match("N3L")) and major_version is + version('9.2', '>=') diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/nxapi/badtransport.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/nxapi/badtransport.yaml new file mode 100644 index 00000000..6feb46ec --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_nxapi/tests/nxapi/badtransport.yaml @@ -0,0 +1,17 @@ +--- +- debug: msg="START nxapi/badtransport.yaml" + +- name: Sending transport other than cli should fail + register: result + ignore_errors: true + cisco.nxos.nxos_nxapi: + enable_http: false + enable_sandbox: false + https_port: 9443 + provider: '{{ nxapi }}' + +- assert: + that: + - result.failed and result.msg is search('Transport') + +- debug: msg="END nxapi/badtransport.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tests/common/sanity.yaml new file mode 100644 index 00000000..b5108468 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf/tests/common/sanity.yaml @@ -0,0 +1,52 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_ospf sanity test" + +- name: Enable feature OSPF + ignore_errors: true + cisco.nxos.nxos_feature: + feature: ospf + state: enabled + +- block: + + - name: Configure ospf + register: result + cisco.nxos.nxos_ospf: &id001 + ospf: 1 + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf: *id001 + + - assert: &id004 + that: + - result.changed == false + rescue: + + - name: Disable feature OSPF + ignore_errors: true + cisco.nxos.nxos_feature: + feature: ospf + state: disabled + always: + + - name: Unconfigure ospf + register: result + cisco.nxos.nxos_ospf: &id003 + ospf: 1 + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf: *id003 + + - assert: *id004 + + - debug: msg="END connection={{ ansible_connection }} nxos_ospf sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/meta/main.yml new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/main.yaml new file mode 100644 index 00000000..583ae0fe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/main.yaml @@ -0,0 +1,27 @@ +--- +- name: Enable OSPF v2 and v3 features + cisco.nxos.nxos_config: + lines: + - feature ospf + - feature ospfv3 + vars: + ansible_connection: ansible.netcommon.network_cli + +- block: + + - include: cli.yaml + tags: + - cli.yaml + + - include: nxapi.yaml + tags: + - nxapi + + always: + - name: Disable OSPF v2 and v3 features + cisco.nxos.nxos_config: + lines: + - feature ospf + - feature ospfv3 + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_populate_config.yaml new file mode 100644 index 00000000..ad6404f8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_populate_config.yaml @@ -0,0 +1,20 @@ +--- +- name: Populate config + cisco.nxos.nxos_config: + lines: + - "interface {{ nxos_int1 }}" + - " ip router ospf 100 area 1.1.1.1 secondaries none" + - " ip router ospf multi-area 11.11.11.11" + - " ipv6 router ospfv3 200 area 2.2.2.2" + - " ipv6 router ospfv3 200 multi-area 21.0.0.0" + - " ipv6 router ospfv3 300 multi-area 50.50.50.50" + - " ipv6 router ospfv3 multi-area 16.10.10.10" + - "interface {{ nxos_int2 }}" + - " ip ospf authentication" + - " ip ospf authentication key-chain test-1" + - " ip ospf message-digest-key 10 md5 3 abc01d272be25d29" + - " ip ospf cost 100" + - " ospfv3 network broadcast" + - " ospfv3 shutdown" + - "interface {{ nxos_int3 }}" + - " ip ospf authentication-key 7 12090404011C03162E" \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_remove_config.yaml new file mode 100644 index 00000000..24c11bbb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_remove_config.yaml @@ -0,0 +1,9 @@ +- name: Default interfaces + cisco.nxos.nxos_config: + lines: + - "default interface {{ nxos_int1 }}" + - "default interface {{ nxos_int2 }}" + - "default interface {{ nxos_int3 }}" + ignore_errors: True + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_setup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_setup.yaml new file mode 100644 index 00000000..dc8db1c6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/_setup.yaml @@ -0,0 +1,11 @@ +- name: "Populate interfaces" + cisco.nxos.nxos_config: + lines: + - "no switchport" + parents: "interface {{ item }}" + loop: + - "{{ nxos_int1 }}" + - "{{ nxos_int2 }}" + - "{{ nxos_int3 }}" + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/deleted.yaml new file mode 100644 index 00000000..e923050c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/deleted.yaml @@ -0,0 +1,101 @@ +--- +- debug: + msg: Start nxos_ospf_interfaces deleted integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _setup.yaml + +- include_tasks: _populate_config.yaml + +- set_fact: + int1: + name: "{{ nxos_int1 }}" + int2: + name: "{{ nxos_int2 }}" + int3: + name: "{{ nxos_int3 }}" + +- block: + - name: Delete OSPF config from a single interface + cisco.nxos.nxos_ospf_interfaces: &id005 + config: + - name: "{{ nxos_int1 }}" + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - result["before"][0] == merged["after"][0] + - result["before"][1] == merged["after"][1] + - result["before"][2] == merged["after"][2] + + - name: Assert that correct set of commands were generated + assert: + that: + - '"interface {{ nxos_int1 }}" in result.commands' + - '"no ip router ospf 100 area 1.1.1.1 secondaries none" in result.commands' + - '"no ip router ospf multi-area 11.11.11.11" in result.commands' + - '"no ipv6 router ospfv3 200 area 2.2.2.2" in result.commands' + - '"no ipv6 router ospfv3 200 multi-area 21.0.0.0" in result.commands' + - '"no ipv6 router ospfv3 300 multi-area 50.50.50.50" in result.commands' + - '"no ipv6 router ospfv3 multi-area 16.10.10.10" in result.commands' + - result.commands|length == 7 + + - name: Assert that after dict is correctly generated + assert: + that: + - result["after"][0] == int1 + - result["after"][1] == merged["after"][1] + - result["after"][2] == merged["after"][2] + + + - name: Delete OSPF config from a single interface (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospf_interfaces: *id005 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - include_tasks: _populate_config.yaml + + - name: Delete OSPF config from all interfaces + cisco.nxos.nxos_ospf_interfaces: &id007 + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - result["before"][0] == merged["after"][0] + - result["before"][1] == merged["after"][1] + - result["before"][2] == merged["after"][2] + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ deleted['commands'] | symmetric_difference(result['commands']) |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - result["after"][0] == int1 + - result["after"][1] == int2 + - result["after"][2] == int3 + + - name: Delete OSPF config from all interfaces (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospf_interfaces: *id007 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/empty_config.yaml new file mode 100644 index 00000000..b318c4a9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_ospf_interfaces empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospf_interfaces: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospf_interfaces: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospf_interfaces: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospf_interfaces: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospf_interfaces: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_ospf_interfaces empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/fixtures/parsed.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/fixtures/parsed.cfg new file mode 100644 index 00000000..846a722c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/fixtures/parsed.cfg @@ -0,0 +1,16 @@ +interface Ethernet1/1 + ip router ospf 100 area 1.1.1.1 secondaries none + ip router ospf multi-area 11.11.11.11 + ipv6 router ospfv3 200 area 2.2.2.2 + ipv6 router ospfv3 200 multi-area 21.0.0.0 + ipv6 router ospfv3 300 multi-area 50.50.50.50 + ipv6 router ospfv3 multi-area 16.10.10.10 +interface Ethernet1/2 + ip ospf authentication + ip ospf authentication key-chain test-1 + ip ospf message-digest-key 10 md5 3 abc01d272be25d29 + ip ospf cost 100 + ospfv3 network broadcast + ospfv3 shutdown +interface Ethernet1/3 + ip ospf authentication-key 7 12090404011C03162E \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/gathered.yaml new file mode 100644 index 00000000..15eeb759 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/gathered.yaml @@ -0,0 +1,25 @@ +--- +- debug: + msg: START nxos_ospf_interfaces gathered integration tests on connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _setup.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather OSPF interfaces facts using gathered + register: result + cisco.nxos.nxos_ospf_interfaces: + state: gathered + + - name: Assert that facts were correctly generated + assert: + that: + - result["gathered"][0] == merged["after"][0] + - result["gathered"][1] == merged["after"][1] + - result["gathered"][2] == merged["after"][2] + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/merged.yaml new file mode 100644 index 00000000..69c37f06 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/merged.yaml @@ -0,0 +1,89 @@ +--- +- debug: + msg: Start nxos_ospf_interfaces merged integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _setup.yaml + +- block: + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospf_interfaces: &id001 + config: + - name: "{{ nxos_int1 }}" + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.11 + - afi: ipv6 + processes: + - process_id: "200" + area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + - process_id: "300" + multi_areas: + - 50.50.50.50 + multi_areas: + - 16.10.10.10 + - name: "{{ nxos_int2 }}" + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: "{{ nxos_int3 }}" + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + state: merged + register: result + + - name: Assert that before dicts were correctly generated + assert: + that: + - result["before"][0] == merged["before"][0] + - result["before"][1] == merged["before"][1] + - result["before"][2] == merged["before"][2] + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['commands']) |length\ + \ == 0 }}" + + - name: Assert that after dicts were correctly generated + assert: + that: + - "{{ result['after'][0] == merged['after'][0] }}" + - "{{ result['after'][1] == merged['after'][1] }}" + - "{{ result['after'][2] == merged['after'][2] }}" + + - name: Merge the provided configuration with the existing running configuration + (IDEMPOTENT) + cisco.nxos.nxos_ospf_interfaces: *id001 + register: result + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/overridden.yaml new file mode 100644 index 00000000..da49c0db --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/overridden.yaml @@ -0,0 +1,59 @@ +--- +- debug: + msg: Start nxos_ospf_interfaces overridden integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _setup.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Overridde all OSPF interfaces configuration with provided configuration + cisco.nxos.nxos_ospf_interfaces: &id003 + config: + - name: Ethernet1/1 + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + state: overridden + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - result["before"][0] == merged["after"][0] + - result["before"][1] == merged["after"][1] + - result["before"][2] == merged["after"][2] + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ overridden['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - result['after'][0] == overridden['after'][0] + - result['after'][1] == overridden['after'][1] + - result['after'][2] == overridden['after'][2] + + - name: Overridde all OSPF interfaces configuration with provided configuration + (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospf_interfaces: *id003 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/parsed.yaml new file mode 100644 index 00000000..90d3185a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/parsed.yaml @@ -0,0 +1,14 @@ +--- +- debug: + msg: START nxos_ospf_interfaces parsed integration tests on connection={{ ansible_connection }} + +- name: Parse externally provided OSPF interfaces config + register: result + cisco.nxos.nxos_ospf_interfaces: + running_config: "{{ lookup('file', './fixtures/parsed.cfg') }}" + state: parsed + +- name: Assert that config was correctly parsed + assert: + that: + - "{{ merged['after'] | symmetric_difference(result['parsed']) |length == 0 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/rendered.yaml new file mode 100644 index 00000000..5218998a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/rendered.yaml @@ -0,0 +1,58 @@ +--- +- debug: + msg: START nxos_ospf_interfaces rendered integration tests on connection={{ ansible_connection }} + +- name: Render platform specific configuration lines with state rendered (without connecting to the device) + cisco.nxos.nxos_ospf_interfaces: + config: + - name: "{{ nxos_int1 }}" + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.11 + - afi: ipv6 + processes: + - process_id: "200" + area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + - process_id: "300" + multi_areas: + - 50.50.50.50 + multi_areas: + - 16.10.10.10 + - name: "{{ nxos_int2 }}" + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: "{{ nxos_int3 }}" + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + state: rendered + register: result + +- name: Assert that correct set of commands were rendered + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['rendered']) |length\ + \ == 0 }}" + - result.changed == False diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/replaced.yaml new file mode 100644 index 00000000..474fb887 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/tests/common/replaced.yaml @@ -0,0 +1,61 @@ +--- +- debug: + msg: Start nxos_ospf_interfaces replaced integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _setup.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Replace OSPF configurations of listed interfaces with provided configurations + cisco.nxos.nxos_ospf_interfaces: &id002 + config: + - name: "{{ nxos_int1 }}" + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + - name: "{{ nxos_int3 }}" + state: replaced + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - result["before"][0] == merged["after"][0] + - result["before"][1] == merged["after"][1] + - result["before"][2] == merged["after"][2] + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ replaced['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - result['after'][0] == replaced['after'][0] + - result['after'][1] == replaced['after'][1] + - result['after'][2] == replaced['after'][2] + + - name: Replace OSPF configurations of listed interfaces with provided configurations + (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospf_interfaces: *id002 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/vars/main.yml new file mode 100644 index 00000000..b1540343 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_interfaces/vars/main.yml @@ -0,0 +1,153 @@ +--- +merged: + before: + - name: "{{ nxos_int1 }}" + - name: "{{ nxos_int2 }}" + - name: "{{ nxos_int3 }}" + commands: + - "interface {{ nxos_int1 }}" + - "ip router ospf 100 area 1.1.1.1 secondaries none" + - "ip router ospf multi-area 11.11.11.11" + - "ipv6 router ospfv3 200 area 2.2.2.2" + - "ipv6 router ospfv3 200 multi-area 21.0.0.0" + - "ipv6 router ospfv3 300 multi-area 50.50.50.50" + - "ipv6 router ospfv3 multi-area 16.10.10.10" + - "interface {{ nxos_int2 }}" + - "ip ospf authentication" + - "ip ospf authentication key-chain test-1" + - "ip ospf message-digest-key 10 md5 3 abc01d272be25d29" + - "ip ospf cost 100" + - "ospfv3 network broadcast" + - "ospfv3 shutdown" + - "interface {{ nxos_int3 }}" + - "ip ospf authentication-key 7 12090404011C03162E" + after: + - name: "{{ nxos_int1 }}" + address_family: + - afi: ipv4 + multi_areas: + - 11.11.11.11 + processes: + - area: + area_id: 1.1.1.1 + secondaries: false + process_id: "100" + - afi: ipv6 + multi_areas: + - 16.10.10.10 + processes: + - area: + area_id: 2.2.2.2 + multi_areas: + - 21.0.0.0 + process_id: "200" + - multi_areas: + - 50.50.50.50 + process_id: "300" + - name: "{{ nxos_int2 }}" + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: "{{ nxos_int3 }}" + address_family: + - afi: ipv4 + authentication_key: + encryption: 7 + key: 12090404011C03162E + +replaced: + commands: + - "interface {{ nxos_int1 }}" + - "no ip router ospf multi-area 11.11.11.11" + - "ip router ospf multi-area 11.11.11.12" + - "no ipv6 router ospfv3 200 area 2.2.2.2" + - "no ipv6 router ospfv3 200 multi-area 21.0.0.0" + - "no ipv6 router ospfv3 300 multi-area 50.50.50.50" + - "no ipv6 router ospfv3 multi-area 16.10.10.10" + - "interface {{ nxos_int3 }}" + - "no ip ospf authentication-key 7 12090404011C03162E" + after: + - name: "{{ nxos_int1 }}" + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + - name: "{{ nxos_int2 }}" + address_family: + - afi: ipv4 + authentication: + enable: True + key_chain: test-1 + message_digest_key: + key_id: 10 + encryption: 3 + key: abc01d272be25d29 + cost: 100 + - afi: ipv6 + network: broadcast + shutdown: True + - name: "{{ nxos_int3 }}" +overridden: + commands: + - "interface {{ nxos_int1 }}" + - "no ip router ospf multi-area 11.11.11.11" + - "ip router ospf multi-area 11.11.11.12" + - "no ipv6 router ospfv3 200 area 2.2.2.2" + - "no ipv6 router ospfv3 200 multi-area 21.0.0.0" + - "no ipv6 router ospfv3 300 multi-area 50.50.50.50" + - "no ipv6 router ospfv3 multi-area 16.10.10.10" + - "interface {{ nxos_int2 }}" + - "no ip ospf authentication" + - "no ip ospf authentication key-chain test-1" + - "no ip ospf message-digest-key 10 md5 3 abc01d272be25d29" + - "no ip ospf cost 100" + - "no ospfv3 network broadcast" + - "no ospfv3 shutdown" + - "interface {{ nxos_int3 }}" + - "no ip ospf authentication-key 7 12090404011C03162E" + after: + - name: "{{ nxos_int1 }}" + address_family: + - afi: ipv4 + processes: + - process_id: "100" + area: + area_id: 1.1.1.1 + secondaries: False + multi_areas: + - 11.11.11.12 + - name: "{{ nxos_int2 }}" + - name: "{{ nxos_int3 }}" +deleted: + commands: + - "interface {{ nxos_int1 }}" + - "no ip router ospf 100 area 1.1.1.1 secondaries none" + - "no ip router ospf multi-area 11.11.11.11" + - "no ipv6 router ospfv3 200 area 2.2.2.2" + - "no ipv6 router ospfv3 200 multi-area 21.0.0.0" + - "no ipv6 router ospfv3 300 multi-area 50.50.50.50" + - "no ipv6 router ospfv3 multi-area 16.10.10.10" + - "interface {{ nxos_int2 }}" + - "no ip ospf authentication" + - "no ip ospf authentication key-chain test-1" + - "no ip ospf message-digest-key 10 md5 3 abc01d272be25d29" + - "no ip ospf cost 100" + - "no ospfv3 network broadcast" + - "no ospfv3 shutdown" + - "interface {{ nxos_int3 }}" + - "no ip ospf authentication-key 7 12090404011C03162E" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tests/common/sanity.yaml new file mode 100644 index 00000000..61921d09 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospf_vrf/tests/common/sanity.yaml @@ -0,0 +1,139 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_ospf_vrf sanity test" + +- set_fact: def_met_default="default" + when: imagetag is not search("I7") + +- name: 'Setup: disable features for initial cleanup' + loop: + - ospf + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- name: Enable features + loop: + - ospf + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: enabled + +- block: + + - name: Configure ospf vrf + register: result + cisco.nxos.nxos_ospf_vrf: &id001 + ospf: 1 + router_id: 192.0.2.1 + timer_throttle_spf_start: 50 + timer_throttle_spf_hold: 1000 + timer_throttle_spf_max: 2000 + timer_throttle_lsa_start: 60 + timer_throttle_lsa_hold: 1100 + timer_throttle_lsa_max: 3000 + vrf: test + bfd: enable + passive_interface: true + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf_vrf: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure ospf vrf + register: result + cisco.nxos.nxos_ospf_vrf: &id003 + ospf: 2 + auto_cost: 5000 + timer_throttle_spf_hold: 1100 + timer_throttle_lsa_hold: 2220 + timer_throttle_lsa_max: 2222 + default_metric: 1000 + log_adjacency: log + vrf: default + bfd: disable + passive_interface: true + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf_vrf: *id003 + + - assert: *id004 + + - name: Configure ospf vrf + register: result + cisco.nxos.nxos_ospf_vrf: &id005 + ospf: 2 + auto_cost: default + default_metric: '{{def_met_default|default(omit)}}' + log_adjacency: default + timer_throttle_spf_hold: default + passive_interface: false + vrf: default + state: present + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf_vrf: *id005 + + - assert: *id004 + + - name: Unconfigure ospf vrf + register: result + cisco.nxos.nxos_ospf_vrf: &id006 + ospf: 2 + vrf: default + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf_vrf: *id006 + + - assert: *id004 + when: def_met_default is defined + + - name: Unconfigure ospf vrf + register: result + cisco.nxos.nxos_ospf_vrf: &id007 + ospf: 1 + vrf: test + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_ospf_vrf: *id007 + + - assert: *id004 + when: def_met_default is defined + always: + + - name: Disable features + loop: + - ospf + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_ospf_vrf sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/meta/main.yml new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/main.yaml new file mode 100644 index 00000000..58efe95c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/main.yaml @@ -0,0 +1,24 @@ +--- +- name: Enable OSPF feature + cisco.nxos.nxos_feature: + feature: ospf + vars: + ansible_connection: ansible.netcommon.network_cli + +- block: + + - include: cli.yaml + tags: + - cli.yaml + + - include: nxapi.yaml + tags: + - nxapi + + always: + - name: Disable OSPF feature + cisco.nxos.nxos_feature: + feature: ospf + state: disabled + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_populate_config.yaml new file mode 100644 index 00000000..8550fe93 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_populate_config.yaml @@ -0,0 +1,26 @@ +- name: Setup + cisco.nxos.nxos_config: + lines: + - "router ospf 102" + - " router-id 198.51.100.1" + - " redistribute eigrp 120 route-map rmap_1" + - " redistribute direct route-map ospf102-direct-connect" + - " area 0.0.0.100 filter-list route-map rmap_1 in" + - " area 0.0.0.100 filter-list route-map rmap_2 out" + - " area 0.0.0.100 range 192.0.2.0/24 not-advertise" + - " area 0.0.0.100 range 203.0.113.0/24 cost 120" + - " area 0.0.0.101 authentication message-digest" + - " vrf zone1" + - " router-id 198.51.100.129" + - " summary-address 203.0.113.64/26 tag 121" + - " summary-address 192.0.2.128/25" + - " redistribute static route-map zone1-static-connect" + - " area 0.0.0.102 nssa no-summary default-information-originate" + - " area 0.0.0.103 nssa no-summary" + - " area 0.0.0.103 nssa translate type7 always" + - " vrf zone2" + - " auto-cost reference-bandwidth 45 Gbps" + - "router ospf 100" + - " router-id 203.0.113.20" + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_remove_config.yaml new file mode 100644 index 00000000..e214e052 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/_remove_config.yaml @@ -0,0 +1,9 @@ +- name: Remove pre-existing OSPF processes + cisco.nxos.nxos_config: + lines: + - no router ospf 100 + - no router ospf 102 + - no router ospf 104 + ignore_errors: True + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/deleted.yaml new file mode 100644 index 00000000..de7aaee7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/deleted.yaml @@ -0,0 +1,93 @@ +--- +- debug: + msg: Start nxos_ospfv2 deleted integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Delete a single OSPF process + cisco.nxos.nxos_ospfv2: &id005 + config: + processes: + - process_id: 102 + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - '"no router ospf 102" in result.commands' + - result.commands|length == 1 + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ deleted['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Delete a single OSPF process (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv2: *id005 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ deleted['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - include_tasks: _populate_config.yaml + + - name: Delete all OSPF processes from the device + cisco.nxos.nxos_ospfv2: &id007 + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - '"no router ospf 100" in result.commands' + - '"no router ospf 102" in result.commands' + - result.commands|length == 2 + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ result['after'] == {} }}" + + - name: Delete all OSPF processes from the device (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv2: *id007 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ result['before'] == {} }}" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/fixtures/parsed.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/fixtures/parsed.cfg new file mode 100644 index 00000000..5d04c80f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/fixtures/parsed.cfg @@ -0,0 +1,21 @@ +router ospf 100 + router-id 203.0.113.20 +router ospf 102 + router-id 198.51.100.1 + redistribute direct route-map ospf102-direct-connect + redistribute eigrp 120 route-map rmap_1 + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 range 192.0.2.0/24 not-advertise + area 0.0.0.100 range 203.0.113.0/24 cost 120 + area 0.0.0.101 authentication message-digest + vrf zone1 + router-id 198.51.100.129 + area 0.0.0.102 nssa no-summary default-information-originate + area 0.0.0.103 nssa no-summary + area 0.0.0.103 nssa translate type7 always + redistribute static route-map zone1-static-connect + summary-address 192.0.2.128/25 + summary-address 203.0.113.64/26 tag 121 + vrf zone2 + auto-cost reference-bandwidth 45 Gbps \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/gathered.yaml new file mode 100644 index 00000000..d9b2ab19 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/gathered.yaml @@ -0,0 +1,21 @@ +--- +- debug: + msg: START nxos_ospfv2 gathered integration tests on connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather OSPFv2 facts using gathered + register: result + cisco.nxos.nxos_ospfv2: + state: gathered + + - name: Assert that facts were correctly generated + assert: + that: "{{ merged['after']['processes'] | symmetric_difference(result['gathered']['processes']) |length\ + \ == 0 }}" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/merged.yaml new file mode 100644 index 00000000..32904387 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/merged.yaml @@ -0,0 +1,92 @@ +--- +- debug: + msg: Start nxos_ospfv2 merged integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- block: + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv2: &id001 + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 192.0.2.0/24 + not_advertise: True + - prefix: 203.0.113.0/24 + cost: 120 + - area_id: 0.0.0.101 + authentication: + message_digest: True + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: static + route_map: zone1-static-connect + summary_address: + - prefix: 203.0.113.64/26 + tag: 121 + - prefix: 192.0.2.128/25 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + - area_id: 0.0.0.103 + nssa: + no_summary: True + translate: + type7: + always: True + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: merged + register: result + + - name: Assert that before dicts were correctly generated + assert: + that: "{{ result['before'] == {} }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['commands']) |length\ + \ == 0 }}" + + - name: Assert that after dicts were correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Merge the provided configuration with the existing running configuration + (IDEMPOTENT) + cisco.nxos.nxos_ospfv2: *id001 + register: result + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/overridden.yaml new file mode 100644 index 00000000..00735549 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/overridden.yaml @@ -0,0 +1,57 @@ +--- +- debug: + msg: Start nxos_ospfv2 overridden integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Overridde all OSPF configuration with provided configuration + cisco.nxos.nxos_ospfv2: &id003 + config: + processes: + - process_id: 104 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + shutdown: True + state: overridden + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ overridden['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ overridden['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Overridde all OSPF configuration with provided configuration + (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv2: *id003 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ overridden['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/parsed.yaml new file mode 100644 index 00000000..a471a4f0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/parsed.yaml @@ -0,0 +1,14 @@ +--- +- debug: + msg: START nxos_ospfv2 parsed integration tests on connection={{ ansible_connection }} + +- name: Parse externally provided OSPFv2 config + register: result + cisco.nxos.nxos_ospfv2: + running_config: "{{ lookup('file', './fixtures/parsed.cfg') }}" + state: parsed + +- name: Assert that config was correctly parsed + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['parsed']['processes']) |length == 0 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/rendered.yaml new file mode 100644 index 00000000..32e15333 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/rendered.yaml @@ -0,0 +1,66 @@ +--- +- debug: + msg: START nxos_ospfv2 rendered integration tests on connection={{ ansible_connection }} + +- name: Render platform specific configuration lines with state rendered (without connecting to the device) + cisco.nxos.nxos_ospfv2: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 192.0.2.0/24 + not_advertise: True + - prefix: 203.0.113.0/24 + cost: 120 + - area_id: 0.0.0.101 + authentication: + message_digest: True + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: static + route_map: zone1-static-connect + summary_address: + - prefix: 203.0.113.64/26 + tag: 121 + - prefix: 192.0.2.128/25 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + - area_id: 0.0.0.103 + nssa: + no_summary: True + translate: + type7: + always: True + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: rendered + register: result + +- name: Assert that correct set of commands were rendered + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['rendered']) |length\ + \ == 0 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/replaced.yaml new file mode 100644 index 00000000..6aecb7fb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/tests/common/replaced.yaml @@ -0,0 +1,83 @@ +--- +- debug: + msg: Start nxos_ospfv2 replaced integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Replace device configurations of listed OSPF processes with provided configurations + cisco.nxos.nxos_ospfv2: &id002 + config: + processes: + - process_id: 102 + router_id: 198.51.100.1 + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_8 + direction: in + ranges: + - not_advertise: true + prefix: 192.0.2.0/24 + - area_id: 0.0.0.101 + stub: + no_summary: True + redistribute: + - protocol: eigrp + id: 130 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + redistribute: + - protocol: bgp + id: 65563 + route_map: zone1-bgp-connect + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + state: replaced + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ replaced['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ replaced['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Replace device configurations of listed OSPF processes with provided configurarions + (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv2: *id002 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ replaced['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/vars/main.yml new file mode 100644 index 00000000..6e537407 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv2/vars/main.yml @@ -0,0 +1,158 @@ +--- +merged: + commands: + - router ospf 102 + - router-id 198.51.100.1 + - redistribute eigrp 120 route-map rmap_1 + - redistribute direct route-map ospf102-direct-connect + - area 0.0.0.100 filter-list route-map rmap_1 in + - area 0.0.0.100 filter-list route-map rmap_2 out + - area 0.0.0.100 range 192.0.2.0/24 not-advertise + - area 0.0.0.100 range 203.0.113.0/24 cost 120 + - area 0.0.0.101 authentication message-digest + - vrf zone1 + - router-id 198.51.100.129 + - summary-address 203.0.113.64/26 tag 121 + - summary-address 192.0.2.128/25 + - redistribute static route-map zone1-static-connect + - area 0.0.0.102 nssa no-summary default-information-originate + - area 0.0.0.103 nssa no-summary + - area 0.0.0.103 nssa translate type7 always + - vrf zone2 + - auto-cost reference-bandwidth 45 Gbps + - router ospf 100 + - router-id 203.0.113.20 + after: + processes: + - process_id: '100' + router_id: 203.0.113.20 + - areas: + - area_id: 0.0.0.100 + filter_list: + - direction: out + route_map: rmap_2 + - direction: in + route_map: rmap_1 + ranges: + - not_advertise: true + prefix: 192.0.2.0/24 + - cost: 120 + prefix: 203.0.113.0/24 + - area_id: 0.0.0.101 + authentication: + message_digest: true + process_id: '102' + redistribute: + - protocol: direct + route_map: ospf102-direct-connect + - id: '120' + protocol: eigrp + route_map: rmap_1 + router_id: 198.51.100.1 + vrfs: + - areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: True + translate: + type7: + always: true + redistribute: + - protocol: static + route_map: zone1-static-connect + router_id: 198.51.100.129 + summary_address: + - prefix: 192.0.2.128/25 + - prefix: 203.0.113.64/26 + tag: 121 + vrf: zone1 + - auto_cost: + reference_bandwidth: 45 + unit: Gbps + vrf: zone2 + +replaced: + commands: + - router ospf 102 + - redistribute eigrp 130 route-map rmap_1 + - no redistribute eigrp 120 route-map rmap_1 + - area 0.0.0.100 filter-list route-map rmap_8 in + - no area 0.0.0.100 filter-list route-map rmap_2 out + - no area 0.0.0.100 range 203.0.113.0/24 + - no area 0.0.0.101 authentication + - area 0.0.0.101 stub no-summary + - vrf zone1 + - no summary-address 203.0.113.64/26 tag 121 + - no summary-address 192.0.2.128/25 + - redistribute bgp 65563 route-map zone1-bgp-connect + - no redistribute static route-map zone1-static-connect + - no area 0.0.0.103 nssa + - no area 0.0.0.103 nssa translate type7 always + - no vrf zone2 + after: + processes: + - process_id: '100' + router_id: 203.0.113.20 + - areas: + - area_id: 0.0.0.101 + stub: + no_summary: true + - area_id: 0.0.0.100 + filter_list: + - direction: in + route_map: rmap_8 + ranges: + - not_advertise: true + prefix: 192.0.2.0/24 + process_id: '102' + redistribute: + - protocol: direct + route_map: ospf102-direct-connect + - id: '130' + protocol: eigrp + route_map: rmap_1 + router_id: 198.51.100.1 + vrfs: + - areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + redistribute: + - id: '65563' + protocol: bgp + route_map: zone1-bgp-connect + router_id: 198.51.100.129 + vrf: zone1 +overridden: + commands: + - no router ospf 100 + - router ospf 104 + - router-id 203.0.113.20 + - router ospf 102 + - shutdown + - no redistribute direct route-map ospf102-direct-connect + - no redistribute eigrp 120 route-map rmap_1 + - no area 0.0.0.100 filter-list route-map rmap_2 out + - no area 0.0.0.100 filter-list route-map rmap_1 in + - no area 0.0.0.100 range 192.0.2.0/24 + - no area 0.0.0.100 range 203.0.113.0/24 + - no area 0.0.0.101 authentication + - no vrf zone1 + - no vrf zone2 + after: + processes: + - process_id: '104' + router_id: 203.0.113.20 + - process_id: '102' + router_id: 198.51.100.1 + shutdown: True +deleted: + after: + processes: + - process_id: '100' + router_id: 203.0.113.20 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/meta/main.yml new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/main.yaml new file mode 100644 index 00000000..0193e5a7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/main.yaml @@ -0,0 +1,24 @@ +--- +- name: Enable OSPFv3 feature + cisco.nxos.nxos_feature: + feature: ospfv3 + vars: + ansible_connection: ansible.netcommon.network_cli + +- block: + + - include: cli.yaml + tags: + - cli.yaml + + - include: nxapi.yaml + tags: + - nxapi + + always: + - name: Disable OSPFv3 feature + cisco.nxos.nxos_feature: + feature: ospfv3 + state: disabled + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/nxapi.yaml new file mode 100644 index 00000000..e6144de9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_populate_config.yaml new file mode 100644 index 00000000..d4d838a8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_populate_config.yaml @@ -0,0 +1,23 @@ +- name: Setup + cisco.nxos.nxos_config: + lines: + - "router ospf 102" + - " router-id 198.51.100.1" + - " address-family ipv6 unicast" + - " redistribute eigrp 120 route-map rmap_1" + - " redistribute direct route-map ospf102-direct-connect" + - " area 0.0.0.100 filter-list route-map rmap_1 in" + - " area 0.0.0.100 filter-list route-map rmap_2 out" + - " area 0.0.0.100 range 2001:db2::/32 not-advertise" + - " area 0.0.0.100 range 2001:db3::/32 cost 120" + - " vrf zone1" + - " router-id 198.51.100.129" + - " area 0.0.0.102 nssa no-summary default-information-originate" + - " area 0.0.0.103 nssa no-summary" + - " area 0.0.0.103 nssa translate type7 always" + - " vrf zone2" + - " auto-cost reference-bandwidth 45 Gbps" + - "router ospf 100" + - " router-id 203.0.113.20" + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_remove_config.yaml new file mode 100644 index 00000000..655c5248 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/_remove_config.yaml @@ -0,0 +1,9 @@ +- name: Remove pre-existing OSPF processes + cisco.nxos.nxos_config: + lines: + - no router ospfv3 100 + - no router ospfv3 102 + - no router ospfv3 104 + ignore_errors: True + vars: + ansible_connection: ansible.netcommon.network_cli \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/deleted.yaml new file mode 100644 index 00000000..940ee366 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/deleted.yaml @@ -0,0 +1,93 @@ +--- +- debug: + msg: Start nxos_ospfv3 deleted integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Delete a single OSPF process + cisco.nxos.nxos_ospfv3: &id005 + config: + processes: + - process_id: 102 + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - '"no router ospfv3 102" in result.commands' + - result.commands|length == 1 + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ deleted['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Delete a single OSPF process (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv3: *id005 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ deleted['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - include_tasks: _populate_config.yaml + + - name: Delete all OSPFv3 processes from the device + cisco.nxos.nxos_ospfv3: &id007 + state: deleted + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - '"no router ospfv3 100" in result.commands' + - '"no router ospfv3 102" in result.commands' + - result.commands|length == 2 + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ result['after'] == {} }}" + + - name: Delete all OSPF processes from the device (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv3: *id007 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ result['before'] == {} }}" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/empty_config.yaml new file mode 100644 index 00000000..0f451d14 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_ospfv3 empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospfv3: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospfv3: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospfv3: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospfv3: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_ospfv3: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_ospfv3 empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/fixtures/parsed.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/fixtures/parsed.cfg new file mode 100644 index 00000000..16d2caab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/fixtures/parsed.cfg @@ -0,0 +1,18 @@ +router ospfv3 100 + router-id 203.0.113.20 +router ospfv3 102 + router-id 198.51.100.1 + address-family ipv6 unicast + redistribute direct route-map ospf102-direct-connect + redistribute eigrp 120 route-map rmap_1 + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 range 2001:db2::/32 not-advertise + area 0.0.0.100 range 2001:db3::/32 cost 120 + vrf zone1 + router-id 198.51.100.129 + area 0.0.0.102 nssa no-summary default-information-originate + area 0.0.0.103 nssa no-summary + area 0.0.0.103 nssa translate type7 always + vrf zone2 + auto-cost reference-bandwidth 45 Gbps \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/gathered.yaml new file mode 100644 index 00000000..7d2fd302 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/gathered.yaml @@ -0,0 +1,21 @@ +--- +- debug: + msg: START nxos_ospfv3 gathered integration tests on connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather OSPFv3 facts using gathered + register: result + cisco.nxos.nxos_ospfv3: + state: gathered + + - name: Assert that facts were correctly generated + assert: + that: "{{ merged['after']['processes'] | symmetric_difference(result['gathered']['processes']) |length\ + \ == 0 }}" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/merged.yaml new file mode 100644 index 00000000..7dca04ce --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/merged.yaml @@ -0,0 +1,85 @@ +--- +- debug: + msg: Start nxos_ospfv3 merged integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- block: + - name: Merge the provided configuration with the exisiting running configuration + cisco.nxos.nxos_ospfv3: &id001 + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 2001:db2::/32 + not_advertise: True + - prefix: 2001:db3::/32 + cost: 120 + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + - area_id: 0.0.0.103 + nssa: + no_summary: True + translate: + type7: + always: True + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: merged + register: result + + - name: Assert that before dicts were correctly generated + assert: + that: "{{ result['before'] == {} }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['commands']) |length\ + \ == 0 }}" + + - name: Assert that after dicts were correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Merge the provided configuration with the existing running configuration + (IDEMPOTENT) + cisco.nxos.nxos_ospfv3: *id001 + register: result + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/overridden.yaml new file mode 100644 index 00000000..c6780225 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/overridden.yaml @@ -0,0 +1,57 @@ +--- +- debug: + msg: Start nxos_ospfv3 overridden integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Overridde all OSPFv3 configuration with provided configuration + cisco.nxos.nxos_ospfv3: &id003 + config: + processes: + - process_id: 104 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + shutdown: True + state: overridden + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ overridden['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ overridden['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Overridde all OSPF configuration with provided configuration + (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv3: *id003 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ overridden['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/parsed.yaml new file mode 100644 index 00000000..6f4918b4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/parsed.yaml @@ -0,0 +1,14 @@ +--- +- debug: + msg: START nxos_ospfv3 parsed integration tests on connection={{ ansible_connection }} + +- name: Parse externally provided OSPFv3 config + register: result + cisco.nxos.nxos_ospfv3: + running_config: "{{ lookup('file', './fixtures/parsed.cfg') }}" + state: parsed + +- name: Assert that config was correctly parsed + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['parsed']['processes']) |length == 0 }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/rendered.yaml new file mode 100644 index 00000000..576a823e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/rendered.yaml @@ -0,0 +1,60 @@ +--- +- debug: + msg: START nxos_ospfv3 rendered integration tests on connection={{ ansible_connection }} + +- name: Render platform specific configuration lines with state rendered (without connecting to the device) + cisco.nxos.nxos_ospfv3: + config: + processes: + - process_id: 100 + router_id: 203.0.113.20 + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_1 + direction: in + - route_map: rmap_2 + direction: out + ranges: + - prefix: 2001:db2::/32 + not_advertise: True + - prefix: 2001:db3::/32 + cost: 120 + redistribute: + - protocol: eigrp + id: 120 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + - area_id: 0.0.0.103 + nssa: + no_summary: True + translate: + type7: + always: True + - vrf: zone2 + auto_cost: + reference_bandwidth: 45 + unit: Gbps + state: rendered + register: result + +- name: Assert that correct set of commands were rendered + assert: + that: + - "{{ merged['commands'] | symmetric_difference(result['rendered']) |length\ + \ == 0 }}" + - result.changed == False diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/replaced.yaml new file mode 100644 index 00000000..772bbc7b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/tests/common/replaced.yaml @@ -0,0 +1,79 @@ +--- +- debug: + msg: Start nxos_ospfv3 replaced integration tests connection={{ ansible_connection}} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Replace device configurations of listed OSPFv3 processes with provided configurations + cisco.nxos.nxos_ospfv3: &id002 + config: + processes: + - process_id: 102 + router_id: 198.51.100.1 + address_family: + afi: ipv6 + safi: unicast + areas: + - area_id: 0.0.0.100 + filter_list: + - route_map: rmap_8 + direction: in + ranges: + - not_advertise: true + prefix: 2001:db2::/32 + redistribute: + - protocol: eigrp + id: 130 + route_map: rmap_1 + - protocol: direct + route_map: ospf102-direct-connect + vrfs: + - vrf: zone1 + router_id: 198.51.100.129 + areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: True + no_summary: True + state: replaced + register: result + + - name: Assert that before dicts are correctly generated + assert: + that: + - "{{ merged['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + + - name: Assert that correct set of commands were generated + assert: + that: + - "{{ replaced['commands'] | symmetric_difference(result['commands'])\ + \ |length == 0 }}" + + - name: Assert that after dict is correctly generated + assert: + that: + - "{{ replaced['after']['processes'] | symmetric_difference(result['after']['processes']) |length\ + \ == 0 }}" + + - name: Replace device configurations of listed OSPF processes with provided configurarions + (IDEMPOTENT) + register: result + cisco.nxos.nxos_ospfv3: *id002 + + - name: Assert that task was idempotent + assert: + that: + - result['changed'] == false + - result.commands|length == 0 + + - name: Assert that before dict is correctly generated + assert: + that: + - "{{ replaced['after']['processes'] | symmetric_difference(result['before']['processes']) |length\ + \ == 0 }}" + always: + - include_tasks: _remove_config.yaml \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/vars/main.yml new file mode 100644 index 00000000..d161a584 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_ospfv3/vars/main.yml @@ -0,0 +1,142 @@ +--- +merged: + commands: + - router ospfv3 102 + - router-id 198.51.100.1 + - address-family ipv6 unicast + - redistribute eigrp 120 route-map rmap_1 + - redistribute direct route-map ospf102-direct-connect + - area 0.0.0.100 filter-list route-map rmap_1 in + - area 0.0.0.100 filter-list route-map rmap_2 out + - area 0.0.0.100 range 2001:db2::/32 not-advertise + - area 0.0.0.100 range 2001:db3::/32 cost 120 + - vrf zone1 + - router-id 198.51.100.129 + - area 0.0.0.102 nssa no-summary default-information-originate + - area 0.0.0.103 nssa no-summary + - area 0.0.0.103 nssa translate type7 always + - vrf zone2 + - auto-cost reference-bandwidth 45 Gbps + - router ospfv3 100 + - router-id 203.0.113.20 + after: + processes: + - process_id: '100' + router_id: 203.0.113.20 + - address_family: + afi: ipv6 + safi: unicast + redistribute: + - protocol: direct + route_map: ospf102-direct-connect + - id: '120' + protocol: eigrp + route_map: rmap_1 + areas: + - area_id: 0.0.0.100 + filter_list: + - direction: out + route_map: rmap_2 + - direction: in + route_map: rmap_1 + ranges: + - not_advertise: true + prefix: 2001:db2::/32 + - cost: 120 + prefix: 2001:db3::/32 + process_id: '102' + router_id: 198.51.100.1 + vrfs: + - areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + - area_id: 0.0.0.103 + nssa: + no_summary: True + translate: + type7: + always: true + router_id: 198.51.100.129 + vrf: zone1 + - auto_cost: + reference_bandwidth: 45 + unit: Gbps + vrf: zone2 + +replaced: + commands: + - router ospfv3 102 + - address-family ipv6 unicast + - redistribute eigrp 130 route-map rmap_1 + - no redistribute eigrp 120 route-map rmap_1 + - area 0.0.0.100 filter-list route-map rmap_8 in + - no area 0.0.0.100 filter-list route-map rmap_2 out + - no area 0.0.0.100 range 2001:db3::/32 + - vrf zone1 + - no area 0.0.0.103 nssa + - no area 0.0.0.103 nssa translate type7 always + - no vrf zone2 + after: + processes: + - process_id: '100' + router_id: 203.0.113.20 + - address_family: + afi: ipv6 + areas: + - area_id: 0.0.0.100 + filter_list: + - direction: in + route_map: rmap_8 + ranges: + - not_advertise: true + prefix: 2001:db2::/32 + redistribute: + - protocol: direct + route_map: ospf102-direct-connect + - id: "130" + protocol: eigrp + route_map: rmap_1 + safi: unicast + process_id: '102' + router_id: 198.51.100.1 + vrfs: + - areas: + - area_id: 0.0.0.102 + nssa: + default_information_originate: true + no_summary: true + router_id: 198.51.100.129 + vrf: zone1 +overridden: + commands: + - no router ospfv3 100 + - router ospfv3 104 + - router-id 203.0.113.20 + - router ospfv3 102 + - shutdown + - address-family ipv6 unicast + - no redistribute direct route-map ospf102-direct-connect + - no redistribute eigrp 120 route-map rmap_1 + - no area 0.0.0.100 filter-list route-map rmap_2 out + - no area 0.0.0.100 filter-list route-map rmap_1 in + - no area 0.0.0.100 range 2001:db2::/32 + - no area 0.0.0.100 range 2001:db3::/32 + - no vrf zone1 + - no vrf zone2 + after: + processes: + - process_id: '104' + router_id: 203.0.113.20 + - process_id: '102' + router_id: 198.51.100.1 + shutdown: True + address_family: + afi: ipv6 + safi: unicast +deleted: + after: + processes: + - process_id: '100' + router_id: 203.0.113.20 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/cleanup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/cleanup.yaml new file mode 100644 index 00000000..0fba16a7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/cleanup.yaml @@ -0,0 +1,24 @@ +--- +- name: Unconfigure VDC setting limit-resource module-type f3 + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; no limit-resource module-type f3 + match: none + +- name: Previous command is asynchronous and can take a while. Allow time for it + to complete + pause: + seconds: 45 + +- name: Configure VDC setting allocate interface unallocated-interfaces + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; allocate interface unallocated-interfaces + match: none + +- name: Previous command is asynchronous can take a while. Allow time for it to + complete + pause: + seconds: 45 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/setup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/setup.yaml new file mode 100644 index 00000000..dec5a9b7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tasks/platform/n7k/setup.yaml @@ -0,0 +1,39 @@ +--- +- name: Get default vdc id + register: vdcout + cisco.nxos.nxos_command: + commands: + - show vdc current-vdc | json + +- set_fact: vdcid="{{ vdcout.stdout_lines[0].name }}" + +- name: Configure VDC setting limit-resource module-type f3 + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; limit-resource module-type f3 + match: none + +- name: Previous command is asynchronous and can take a while. Allow time for it + to complete + pause: + seconds: 45 + +- name: Configure VDC setting allocate interface unallocated-interfaces + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; allocate interface unallocated-interfaces + match: none + +- name: Previous command is asynchronous and can take a while. Allow time for it + to complete + pause: + seconds: 45 + +- name: Configure Additional N7K requiste features + cisco.nxos.nxos_config: + commands: + - feature-set fabric + - feature fabric forwarding + match: none diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tests/common/sanity.yaml new file mode 100644 index 00000000..01b63160 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_overlay_global/tests/common/sanity.yaml @@ -0,0 +1,97 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_overlay_global sanity + test" + +- set_fact: overlay_global_supported="false" + +- set_fact: overlay_global_supported="true" + when: platform is search("N35NG|N7K|^N9K$") or ( platform is match("N9k-F") and + imagetag is version('F3', 'ne')) + +- debug: msg="Platform {{ platform }} running Image version {{ image_version }} + supports nxos_overlay_global" + when: overlay_global_supported + +- block: + + - name: Enable nv overlay evpn + cisco.nxos.nxos_evpn_global: + nv_overlay_evpn: true + + - name: Apply N7K specific setup config + include: tasks/platform/n7k/setup.yaml + when: platform is match('N7K') + + - name: Configure Additional N7K requiste features + when: platform is match('N7K') + cisco.nxos.nxos_config: + commands: + - feature-set fabric + - feature fabric forwarding + match: none + + - name: Remove possibly existing mac + ignore_errors: true + cisco.nxos.nxos_overlay_global: + anycast_gateway_mac: default + when: overlay_global_supported + +- block: + + - name: Configure overlay global + register: result + cisco.nxos.nxos_overlay_global: &id001 + anycast_gateway_mac: b.b.b + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_overlay_global: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Update anycast gateway mac + register: result + cisco.nxos.nxos_overlay_global: &id003 + anycast_gateway_mac: a.a.a + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_overlay_global: *id003 + + - assert: *id004 + + - name: Remove anycast gateway mac + register: result + cisco.nxos.nxos_overlay_global: &id005 + anycast_gateway_mac: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_overlay_global: *id005 + + - assert: *id004 + when: overlay_global_supported + always: + + - name: Apply N7K specific cleanup config + include: tasks/platform/n7k/cleanup.yaml + when: platform is match('N7K') + + - name: Disable nv overlay evpn + ignore_errors: true + when: overlay_global_supported + cisco.nxos.nxos_evpn_global: + nv_overlay_evpn: false + + - debug: msg="END connection={{ ansible_connection }} nxos_overlay_global sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tests/common/sanity.yaml new file mode 100644 index 00000000..4e24a2ba --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim/tests/common/sanity.yaml @@ -0,0 +1,85 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_pim sanity test" + +- name: 'Setup: Disable features' + ignore_errors: true + loop: + - pim + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- name: 'Setup: Enable features' + loop: + - pim + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: enabled + +- name: 'Setup: Configure ssm_range none' + cisco.nxos.nxos_pim: &id005 + ssm_range: none + +- block: + + - name: Initial config from none + register: result + cisco.nxos.nxos_pim: &id001 + bfd: enable + ssm_range: + - 239.128.1.0/24 + - 224.0.0.0/8 + + - assert: &id002 + that: + - result.changed == true + + - name: Initial config idempotence + register: result + cisco.nxos.nxos_pim: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure ssm_range default + register: result + cisco.nxos.nxos_pim: &id003 + bfd: disable + ssm_range: default + + - assert: *id002 + + - name: ssm_range default idempotence + register: result + cisco.nxos.nxos_pim: *id003 + + - assert: *id004 + + - name: Configure ssm_range none + register: result + cisco.nxos.nxos_pim: *id005 + + - assert: *id002 + + - meta: end_play + + - name: ssm_range none idempotence + register: result + cisco.nxos.nxos_pim: *id005 + + - assert: *id004 + always: + + - name: 'Teardown: Disable features' + ignore_errors: true + loop: + - pim + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_pim sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..9283842c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_interface/tests/common/sanity.yaml @@ -0,0 +1,197 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_pim_interface sanity + test" + +- name: 'Setup: Disable features' + loop: + - pim + - bfd + ignore_errors: true + cisco.nxos.nxos_feature: &id011 + feature: '{{ item }}' + state: disabled + +- name: 'Setup: Enable features' + loop: + - pim + - bfd + cisco.nxos.nxos_feature: + feature: '{{ item }}' + state: enabled + +- set_fact: testint="{{ nxos_int1 }}" + +- name: 'Setup: Put interface {{ testint }} into a default state' + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - default interface {{ testint }} + +- name: Ensure {{testint}} is layer3 + cisco.nxos.nxos_interface: + interface: '{{ testint }}' + mode: layer3 + description: Configured by Ansible - Layer3 + admin_state: up + state: present + +- block: + + - name: Configure nxos_pim_interface state absent + cisco.nxos.nxos_pim_interface: &id010 + interface: '{{ testint }}' + state: absent + + - name: configure jp policy and type + register: result + cisco.nxos.nxos_pim_interface: &id001 + interface: '{{ testint }}' + jp_policy_in: JPIN + jp_policy_out: JPOUT + jp_type_in: routemap + jp_type_out: routemap + sparse: true + border: true + + - assert: &id002 + that: + - result.changed == true + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: configure neighbor policy and rm + register: result + cisco.nxos.nxos_pim_interface: &id003 + interface: '{{ testint }}' + neighbor_policy: NPR + neighbor_type: routemap + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id003 + + - assert: *id004 + + - pause: + seconds: 5 + + - name: configure neighbor policy and prefix + register: result + cisco.nxos.nxos_pim_interface: &id005 + interface: '{{ testint }}' + neighbor_policy: NPPF + neighbor_type: prefix + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id005 + + - assert: *id004 + + - name: configure hello_auth_key + register: result + cisco.nxos.nxos_pim_interface: + interface: '{{ testint }}' + hello_auth_key: password1 + + - assert: *id002 + + - name: configure pim other params + register: result + cisco.nxos.nxos_pim_interface: &id006 + interface: '{{ testint }}' + dr_prio: 10 + hello_interval: 40 + sparse: true + border: true + bfd: enable + state: present + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id006 + + - assert: *id004 + + - name: configure negative + register: result + cisco.nxos.nxos_pim_interface: &id007 + interface: '{{ testint }}' + sparse: false + border: false + bfd: disable + state: present + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id007 + + - assert: *id004 + + - pause: + seconds: 5 + + - name: configure state default + register: result + cisco.nxos.nxos_pim_interface: &id008 + interface: '{{ testint }}' + state: default + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id008 + + - assert: *id004 + + - name: configure border + register: result + cisco.nxos.nxos_pim_interface: &id009 + interface: '{{ testint }}' + border: true + state: present + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id009 + + - assert: *id004 + + - name: configure state absent + register: result + cisco.nxos.nxos_pim_interface: *id010 + + - assert: *id002 + + - name: Check idempotence + register: result + cisco.nxos.nxos_pim_interface: *id010 + + - assert: *id004 + always: + + - name: Disable feature PIM + loop: + - pim + - bfd + cisco.nxos.nxos_feature: *id011 + +- debug: msg="END connection={{ ansible_connection }} nxos_pim_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tests/common/configure.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tests/common/configure.yaml new file mode 100644 index 00000000..d8afa496 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_pim_rp_address/tests/common/configure.yaml @@ -0,0 +1,220 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_pim_rp_address sanity" + +- block: + + - set_fact: bidir_true="true" + + - set_fact: bidir_false="false" + when: platform is not search('N3L') + +- block: + + - set_fact: pim_prefix_list="pim_prefix_list" + + - set_fact: pim_route_map="pim_route_map" + when: platform is not search('N3L|N7K') + +- block: + + - name: Disable feature PIM + cisco.nxos.nxos_feature: &id014 + feature: pim + state: disabled + + - name: Enable feature PIM + cisco.nxos.nxos_feature: + feature: pim + state: enabled + + - name: 1.0 Configure rp_address + group_list + register: result + cisco.nxos.nxos_pim_rp_address: &id001 + rp_address: 10.1.1.1 + group_list: 224.0.0.0/8 + bidir: '{{ bidir_true|default(omit) }}' + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: 1.0 Idempotence rp_address + group_list + register: result + cisco.nxos.nxos_pim_rp_address: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: 1.1 Configure rp_address + group_list (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: &id003 + rp_address: 10.1.1.1 + group_list: 224.0.0.0/8 + bidir: false + state: present + + - assert: *id002 + + - name: 1.1 Idempotence rp_address + group_list (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: *id003 + + - assert: *id004 + + - name: 1.2 Configure rp_address (bidir_true) + register: result + cisco.nxos.nxos_pim_rp_address: &id005 + rp_address: 10.1.1.1 + bidir: true + state: present + + - assert: *id002 + + - name: 1.2 Idempotence rp_address (bidir_true) + register: result + cisco.nxos.nxos_pim_rp_address: *id005 + + - assert: *id004 + + - name: 1.3 Configure rp_address (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: &id006 + rp_address: 10.1.1.1 + bidir: false + state: present + + - assert: *id002 + + - name: 1.3 Idempotence rp_address (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: *id006 + + - assert: *id004 + when: bidir_true is defined + + - name: 1.4 Remove rp_address + group_list + register: result + cisco.nxos.nxos_pim_rp_address: &id007 + rp_address: 10.1.1.1 + group_list: 224.0.0.0/8 + state: absent + + - assert: *id002 + + - name: 1.4 Idempotence remove rp_address + group_list + register: result + cisco.nxos.nxos_pim_rp_address: *id007 + + - assert: *id004 + + - name: 2.0 Configure rp_address + prefix_list (bidir_true) + register: result + cisco.nxos.nxos_pim_rp_address: &id008 + rp_address: 10.1.1.2 + prefix_list: '{{ pim_prefix_list|default(omit) }}' + bidir: '{{ bidir_true|default(omit) }}' + state: present + + - assert: *id002 + + - name: 2.0 Idempotence rp_address + prefix_list (bidir_true) + register: result + cisco.nxos.nxos_pim_rp_address: *id008 + + - assert: *id004 + + - block: + + - name: 2.1 Configure rp_address + prefix_list (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: &id009 + rp_address: 10.1.1.2 + prefix_list: '{{ pim_prefix_list|default(omit) }}' + bidir: '{{ bidir_false|default(omit) }}' + state: present + + - assert: *id002 + + - name: 2.1 Idempotence rp_address + prefix_list (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: *id009 + + - assert: *id004 + when: bidir_false is defined + + - name: 2.2 Remove rp_address + prefix_list (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: &id010 + rp_address: 10.1.1.2 + prefix_list: '{{ pim_prefix_list|default(omit)}}' + bidir: '{{ bidir_false|default(omit)}}' + state: absent + + - assert: *id002 + + - name: 2.2 Idempotence remove rp_address + prefix_list (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: *id010 + + - assert: *id004 + + - name: 3.0 Configure rp_address + route_map + (bidir_true) + register: result + cisco.nxos.nxos_pim_rp_address: &id011 + rp_address: 10.1.1.3 + route_map: '{{ pim_route_map|default(omit)}}' + bidir: '{{ bidir_true|default(omit) }}' + state: present + + - assert: *id002 + + - name: 3.0 Idempotence rp_address + route_map + (bidir_true) + register: result + cisco.nxos.nxos_pim_rp_address: *id011 + + - assert: *id004 + + - block: + + - name: 3.1 Configure rp_address + route_map (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: &id012 + rp_address: 10.1.1.3 + route_map: '{{ pim_route_map|default(omit)}}' + bidir: '{{ bidir_false|default(omit)}}' + state: present + + - assert: *id002 + + - name: 3.1 Idempotence rp_address + route_map + register: result + cisco.nxos.nxos_pim_rp_address: *id012 + + - assert: *id004 + when: bidir_false is defined + + - name: 3.2 Remove rp_address + route_map (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: &id013 + rp_address: 10.1.1.3 + route_map: '{{ pim_route_map|default(omit)}}' + bidir: '{{ bidir_false|default(omit)}}' + state: absent + + - assert: *id002 + + - name: 3.2 Idempotence remove rp_address + route_map (bidir_false) + register: result + cisco.nxos.nxos_pim_rp_address: *id013 + + - assert: *id004 + always: + + - name: Disable feature PIM + cisco.nxos.nxos_feature: *id014 + +- debug: msg="END connection={{ ansible_connection }} nxos_pim_rp_address sanity" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/main.yaml new file mode 100644 index 00000000..9b16323e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/main.yaml @@ -0,0 +1,6 @@ +--- +- include: cli.yaml + tags: cli + +- include: nxapi.yaml + tags: nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/nxapi.yaml new file mode 100644 index 00000000..92fa58ea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tasks/nxapi.yaml @@ -0,0 +1,29 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run + tags: nxapi_httpapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tests/common/sanity.yaml new file mode 100644 index 00000000..29ec19c5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_reboot/tests/common/sanity.yaml @@ -0,0 +1,24 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_reboot sanity test" + +- debug: msg="***WARNING*** Remove meta end_play to verify this module ***WARNING***" + +- meta: end_play + +- block: + + - name: Reboot Switch + ignore_errors: true + cisco.nxos.nxos_reboot: + confirm: true + always: + + - name: Wait for device to come back up + wait_for: + port: 22 + state: started + timeout: 600 + delay: 60 + host: '{{ inventory_hostname }}' + + - debug: msg="END connection={{ ansible_connection }} nxos_reboot sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tests/common/sanity.yaml new file mode 100644 index 00000000..5fef9ab7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rollback/tests/common/sanity.yaml @@ -0,0 +1,24 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_rollback sanity test" + +- name: delete existing checkpoint file + ignore_errors: true + cisco.nxos.nxos_config: &id001 + commands: + - terminal dont-ask + - delete backup.cfg + match: none + +- name: Create checkpoint file + cisco.nxos.nxos_rollback: + checkpoint_file: backup.cfg + +- name: rollback to the previously created checkpoint file + cisco.nxos.nxos_rollback: + rollback_to: backup.cfg + +- name: cleanup checkpoint file + ignore_errors: true + cisco.nxos.nxos_config: *id001 + +- debug: msg="END connection={{ ansible_connection }} nxos_rollback sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tests/common/sanity.yaml new file mode 100644 index 00000000..991ca7d5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_rpm/tests/common/sanity.yaml @@ -0,0 +1,155 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_rpm sanity test" + +- set_fact: smu_run="false" + +- set_fact: smu_run="true" + when: ((platform is search('N9K')) and (imagetag and (imagetag is version_compare('I2', + 'ge')))) + +- set_fact: sdk_run="false" + +- set_fact: sdk_run="true" + when: ((platform is search('N9K')) and (imagetag and (imagetag is version_compare('I6', + 'ge')))) + +- debug: msg="***WARNING*** Remove meta end_play to verify this module ***WARNING***" + +- meta: end_play + +- block: + + - name: Install smu RPM + register: result + cisco.nxos.nxos_rpm: &id001 + pkg: nxos.sample-n9k_ALL-1.0.0-7.0.3.I6.1.lib32_n9000.rpm + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_rpm: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove smu RPM + register: result + cisco.nxos.nxos_rpm: &id003 + pkg: nxos.sample-n9k_ALL-1.0.0-7.0.3.I6.1.lib32_n9000.rpm + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_rpm: *id003 + + - assert: *id004 + when: smu_run + +- block: + + - name: Install nxsdk RPM(aggregate) + register: result + cisco.nxos.nxos_rpm: &id005 + aggregate: + + - pkg: healthMonitor-1.0-1.5.0.x86_64.rpm + file_system: bootflash + + - pkg: customCliApp-1.0-1.0.0.x86_64.rpm + + - assert: &id006 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_rpm: *id005 + + - assert: &id008 + that: + - result.changed == false + + - name: Remove nxsdk RPM(aggregate) + register: result + cisco.nxos.nxos_rpm: &id007 + aggregate: + + - pkg: healthMonitor-1.0-1.5.0.x86_64.rpm + + - pkg: customCliApp-1.0-1.0.0.x86_64.rpm + state: absent + + - assert: *id006 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_rpm: *id007 + + - assert: *id008 + when: sdk_run + +- block: + + - name: Install reload smu RPM + register: result + cisco.nxos.nxos_rpm: &id009 + pkg: nxos.CSCve91311-n9k_ALL-1.0.0-7.0.3.I6.1.lib32_n9000.rpm + + - assert: *id002 + + - name: Wait for device to come back up + wait_for: + port: 22 + state: started + timeout: 600 + delay: 60 + host: '{{ inventory_hostname_short }}' + + - name: Continue with install reload smu RPM + register: result + cisco.nxos.nxos_rpm: *id009 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_rpm: *id009 + + - assert: *id004 + + - name: Remove reload smu RPM + register: result + cisco.nxos.nxos_rpm: &id010 + pkg: nxos.CSCve91311-n9k_ALL-1.0.0-7.0.3.I6.1.lib32_n9000.rpm + state: absent + + - assert: *id002 + + - name: Wait for device to come back up + wait_for: + port: 22 + state: started + timeout: 600 + delay: 60 + host: '{{ inventory_hostname_short }}' + + - name: Continue with remove reload smu RPM + register: result + cisco.nxos.nxos_rpm: *id010 + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_rpm: *id010 + + - assert: *id004 + when: smu_run + +- debug: msg="END connection={{ ansible_connection }} nxos_rpm sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/defaults/main.yaml new file mode 100644 index 00000000..9ef5ba51 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: "*" +test_items: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/meta/main.yml new file mode 100644 index 00000000..ae741cbd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/cli.yaml new file mode 100644 index 00000000..e0f56372 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/cli.yaml @@ -0,0 +1,33 @@ +--- +- name: collect common test cases + find: + paths: "{{ role_path }}/tests/common" + patterns: "{{ testcase }}.yaml" + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: "{{ role_path }}/tests/cli" + patterns: "{{ testcase }}.yaml" + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: "{{ test_cases.files }} + {{ cli_cases.files }}" + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=network_cli) + include: "{{ test_case_to_run }} ansible_connection=network_cli connection={{ cli }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run + +- name: run test cases (connection=local) + include: "{{ test_case_to_run }} ansible_connection=local connection={{ cli }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/main.yaml new file mode 100644 index 00000000..b165a5f6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/main.yaml @@ -0,0 +1,14 @@ +--- +# Some of the tests in this suite change the hostname to switch. +# This block/always ensures the hostname gets changed back to +# the correct name. +- block: + - { include: cli.yaml, tags: ['cli'] } + - { include: nxapi.yaml, tags: ['nxapi'] } + + always: + - name: "Change hostname back to {{ inventory_hostname_short }}" + nxos_config: + lines: + - "hostname {{ inventory_hostname_short }}" + match: none diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/nxapi.yaml new file mode 100644 index 00000000..04c99602 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tasks/nxapi.yaml @@ -0,0 +1,33 @@ +--- +- name: collect common test cases + find: + paths: "{{ role_path }}/tests/common" + patterns: "{{ testcase }}.yaml" + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: "{{ role_path }}/tests/nxapi" + patterns: "{{ testcase }}.yaml" + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: "{{ test_cases.files }} + {{ nxapi_cases.files }}" + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=httpapi) + include: "{{ test_case_to_run }} ansible_connection=httpapi connection={{ nxapi }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run + +- name: run test cases (connection=local) + include: "{{ test_case_to_run }} ansible_connection=local connection={{ nxapi }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/cli/misc_tests.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/cli/misc_tests.yaml new file mode 100644 index 00000000..2acabe30 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/cli/misc_tests.yaml @@ -0,0 +1,10 @@ +--- +- debug: msg="START cli/misc_tests.yaml on connection={{ ansible_connection }}" + +- block: + - name: Test that provider values are properly ignored + cisco.nxos.nxos_command: + commands: show version + provider: "{{ nxapi }}" + + when: "ansible_connection != 'local'" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_config.yaml new file mode 100644 index 00000000..81c6015b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_config.yaml @@ -0,0 +1,160 @@ +--- +# nxos_config -> NetworkConfig, dumps +# nxos_static_route -> CustomNetworkConfig + +# hit NetworkConfig +# Select interface for test +- debug: msg="START connection={{ ansible_connection }} common/common_config.yaml" +- debug: msg="Using provider={{ connection.transport }}" + when: ansible_connection == "local" + +- set_fact: intname="{{ nxos_int1 }}" + +- name: setup + cisco.nxos.nxos_config: + commands: + - no description + - no shutdown + parents: + - "interface {{ intname }}" + match: none + provider: "{{ connection }}" + +- name: collect any backup files + find: &backups + paths: "{{ role_path }}/backup" + pattern: "{{ inventory_hostname_short }}_config*" + connection: local + register: backup_files + +- name: delete backup files + file: + path: "{{ item.path }}" + state: absent + with_items: "{{backup_files.files|default([])}}" + +- name: configure device with config + cisco.nxos.nxos_config: + commands: + - description this is a test + - shutdown + parents: + - "interface {{ intname }}" + backup: yes + provider: "{{ connection }}" + register: result + +- assert: + that: + - "result.changed == true" + - "result.updates is defined" + +- name: collect any backup files + find: *backups + connection: local + register: backup_files + +- assert: + that: + - "backup_files.files is defined" + +# hit block/sublevel sections +- name: setup + cisco.nxos.nxos_config: &clear + lines: no ip access-list test + provider: "{{ connection }}" + match: none + ignore_errors: yes + +# hit NetworkConfig._diff_exact +- name: configure sub level command using block replace - exact + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + replace: block + provider: "{{ connection }}" + match: exact + register: result + +- assert: + that: + - "result.changed == true" + - "'ip access-list test' in result.updates" + - "'10 permit ip 192.0.2.1/32 any log' in result.updates" + - "'20 permit ip 192.0.2.2/32 any log' in result.updates" + - "'30 permit ip 192.0.2.3/32 any log' in result.updates" + - "'40 permit ip 192.0.2.4/32 any log' in result.updates" + +# hit NetworkConfig._diff_strict +- name: configure sub level command using block replace strict + cisco.nxos.nxos_config: + lines: + - 10 permit ip 192.0.2.1/32 any log + - 20 permit ip 192.0.2.2/32 any log + - 30 permit ip 192.0.2.3/32 any log + - 40 permit ip 192.0.2.4/32 any log + parents: ip access-list test + replace: block + provider: "{{ connection }}" + match: strict + register: result + +- name: teardown + nxos_config: *clear + +# hit CustomNetworkConfig +- block: + - name: create static route + cisco.nxos.nxos_static_route: &configure + prefix: "192.168.20.64/24" + next_hop: "192.0.2.3" + route_name: testing + pref: 100 + tag: 5500 + vrf: testing + provider: "{{ connection }}" + register: result + + - assert: &true + that: + - "result.changed == true" + + - name: remove static route + cisco.nxos.nxos_static_route: &remove + prefix: "192.168.20.64/24" + next_hop: "192.0.2.3" + route_name: testing + pref: 100 + tag: 5500 + vrf: testing + state: absent + provider: "{{ connection }}" + register: result + + - assert: *true + + always: + - name: remove static route + cisco.nxos.nxos_static_route: + prefix: "192.168.20.64/24" + next_hop: "192.0.2.3" + route_name: testing + pref: 100 + tag: 5500 + vrf: testing + state: absent + provider: "{{ connection }}" + ignore_errors: yes + + - name: remove static route aggregate + cisco.nxos.nxos_static_route: + aggregate: + - { prefix: "192.168.22.64/24", next_hop: "192.0.2.3" } + - { prefix: "192.168.24.64/24", next_hop: "192.0.2.3" } + state: absent + provider: "{{ connection }}" + ignore_errors: yes diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_utils.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_utils.yaml new file mode 100644 index 00000000..03a71119 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/common_utils.yaml @@ -0,0 +1,102 @@ +--- +# nxos_command -> ComplexList +# nxos_config -> to_list +# nxos_interface -> conditional, remove_default_spec + +- debug: msg="START connection={{ ansible_connection }} common/common_utils.yaml" +- debug: msg="Using provider={{ connection.transport }}" + when: ansible_connection == "local" + +# hit ComplexList +- name: test contains operator + cisco.nxos.nxos_command: + commands: + - show version + provider: "{{ connection }}" + +# hit to_list() +- name: setup + cisco.nxos.nxos_config: + lines: hostname switch + provider: "{{ connection }}" + match: none + +- name: configure top level command + cisco.nxos.nxos_config: + lines: hostname foo + provider: "{{ connection }}" + register: result + +- assert: + that: + - "result.changed == true" + - "'hostname foo' in result.updates" + +- name: setup + cisco.nxos.nxos_config: + lines: hostname switch + provider: "{{ connection }}" + match: none + +# hit conditional() +- set_fact: testint1="{{ nxos_int1 }}" +- set_fact: testint2="{{ nxos_int2 }}" + +- name: "Setup: Put interfaces into a default state" + cisco.nxos.nxos_config: + lines: + - "default interface {{ testint1 }}" + - "default interface {{ testint2 }}" + provider: "{{ connection }}" + ignore_errors: yes + + register: result + +- name: Check intent arguments + cisco.nxos.nxos_interface: + name: "{{ testint2 }}" + admin_state: up + tx_rate: ge(0) + rx_rate: ge(0) + provider: "{{ connection }}" + register: result + +- assert: + that: + - "result.failed == false" + +- name: Check intent arguments (failed condition) + cisco.nxos.nxos_interface: + name: "{{ testint2 }}" + admin_state: down + tx_rate: gt(0) + rx_rate: lt(0) + provider: "{{ connection }}" + ignore_errors: yes + register: result + +- assert: + that: + - "result.failed == true" + - "'tx_rate gt(0)' in result.failed_conditions" + - "'rx_rate lt(0)' in result.failed_conditions" + +- name: aggregate definition of interface + cisco.nxos.nxos_interface: + aggregate: + - { name: "{{ testint1 }}", description: "Test aggregation on first interface" } + - { name: "{{ testint2 }}", mode: layer3 } + provider: "{{ connection }}" + register: result + +- assert: + that: + - "result.changed == true" + +- name: "TearDown: Put interfaces into a default state" + cisco.nxos.nxos_config: + lines: + - "default interface {{ testint1 }}" + - "default interface {{ testint2 }}" + provider: "{{ connection }}" + ignore_errors: yes diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/misc_tests.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/misc_tests.yaml new file mode 100644 index 00000000..4fd84d62 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_smoke/tests/common/misc_tests.yaml @@ -0,0 +1,30 @@ +--- +- debug: msg="START connection={{ ansible_connection }} common/misc_tests.yaml" +- debug: msg="Using provider={{ connection.transport }}" + when: ansible_connection == "local" + +- name: hit conditional for lists of 10 or more commands + cisco.nxos.nxos_command: + commands: + - show hostname + - show hostname + - show hostname + - show hostname + - show hostname + - show hostname + - show hostname + - show hostname + - show hostname + - show hostname + provider: "{{ connection }}" + register: result + +- assert: + that: + - result.stdout|length == 10 + +- name: combine with provider + cisco.nxos.nxos_command: + commands: + - show hostname + provider: "{{ connection | combine({'timeout': 500}) }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tests/common/sanity.yaml new file mode 100644 index 00000000..80c077e4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snapshot/tests/common/sanity.yaml @@ -0,0 +1,129 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_snapshot sanity test" + +- set_fact: snapshot_run="true" + +- set_fact: snapshot_run="false" + when: titanium and (ansible_connection is match('nxapi')) + +- set_fact: snapshot_run="false" + when: platform is match('N35') + +- set_fact: add_sec="true" + +- set_fact: add_sec="false" + when: imagetag is search("D1") + +- block: + + - name: create snapshot + register: result + cisco.nxos.nxos_snapshot: &id001 + action: create + snapshot_name: test_snapshot1 + description: Ansible + save_snapshot_locally: true + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_snapshot: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: Add section + register: result + cisco.nxos.nxos_snapshot: &id003 + action: add + section: myshow + show_command: show ip interface brief + row_id: ROW_intf + element_key1: intf-name + element_key2: intf-name + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_snapshot: *id003 + + - assert: *id004 + when: add_sec + + - name: create another snapshot + register: result + cisco.nxos.nxos_snapshot: &id005 + action: create + snapshot_name: test_snapshot2 + description: row + section: myshow + show_command: show ip interface brief + row_id: ROW_intf + element_key1: intf-name + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_snapshot: *id005 + + - assert: *id004 + + - name: compare snapshots + cisco.nxos.nxos_snapshot: + action: compare + snapshot1: test_snapshot1 + snapshot2: test_snapshot2 + comparison_results_file: compare_snapshots.txt + compare_option: summary + path: . + + - name: delete snapshot + register: result + cisco.nxos.nxos_snapshot: &id006 + snapshot_name: test_snapshot2 + action: delete + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_snapshot: *id006 + + - assert: *id004 + + - name: delete all snapshots + register: result + cisco.nxos.nxos_snapshot: &id007 + action: delete_all + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_snapshot: *id007 + + - assert: *id004 + when: snapshot_run + always: + + - name: delete all sections + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - snapshot section delete myshow + match: none + + - name: delete all snapshots + ignore_errors: true + cisco.nxos.nxos_snapshot: + action: delete_all + +- debug: msg="END connection={{ ansible_connection }} nxos_snapshot sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tests/common/sanity.yaml new file mode 100644 index 00000000..e6e4c8ea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_community/tests/common/sanity.yaml @@ -0,0 +1,163 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_community sanity + test" + +- name: Setup - Remove snmp_community if configured - 1 + ignore_errors: true + cisco.nxos.nxos_snmp_community: &id005 + community: TESTING7 + group: network-operator + state: absent + +- name: Setup - Remove snmp_community if configured - 2 + ignore_errors: true + cisco.nxos.nxos_snmp_community: &id010 + community: TEST + group: network-operator + state: absent + +- block: + + - name: Configure snmp_community group + register: result + cisco.nxos.nxos_snmp_community: &id001 + community: TESTING7 + group: network-operator + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Change snmp_community group + register: result + cisco.nxos.nxos_snmp_community: &id003 + community: TESTING7 + group: network-admin + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id003 + + - assert: *id004 + + - name: Remove snmp_community + register: result + cisco.nxos.nxos_snmp_community: *id005 + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id005 + + - assert: *id004 + + - name: Configure snmp_community access read-only + register: result + cisco.nxos.nxos_snmp_community: &id006 + community: TESTING7 + access: ro + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id006 + + - assert: *id004 + + - name: Remove snmp_community + register: result + cisco.nxos.nxos_snmp_community: *id005 + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id005 + + - assert: *id004 + + - name: Configure snmp_community access read-write + register: result + cisco.nxos.nxos_snmp_community: &id007 + community: TESTING7 + access: rw + acl: ansible_acl + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id007 + + - assert: *id004 + + - name: Change acl + register: result + cisco.nxos.nxos_snmp_community: &id008 + community: TESTING7 + access: rw + acl: new_acl + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id008 + + - assert: *id004 + + - name: Remove acl + register: result + cisco.nxos.nxos_snmp_community: &id009 + community: TESTING7 + access: rw + acl: default + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_community: *id009 + + - assert: *id004 + + - name: Add partial match community + register: result + cisco.nxos.nxos_snmp_community: + community: TEST + access: rw + acl: default + state: present + + - assert: + that: + - result.changed == True + - "'snmp-server community TEST group network-admin' in result.commands" + always: + + - name: Cleanup + cisco.nxos.nxos_snmp_community: *id005 + + - name: Cleanup + cisco.nxos.nxos_snmp_community: *id010 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_community sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tests/common/sanity.yaml new file mode 100644 index 00000000..251ede91 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_contact/tests/common/sanity.yaml @@ -0,0 +1,61 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_community sanity + test" + +- name: Setup - Remove snmp_contact if configured + cisco.nxos.nxos_snmp_contact: &id005 + contact: Test + state: absent + +- block: + + - name: Configure snmp contact + register: result + cisco.nxos.nxos_snmp_contact: &id001 + contact: Testing + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_contact: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Change snmp contact + register: result + cisco.nxos.nxos_snmp_contact: &id003 + contact: Test + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_contact: *id003 + + - assert: *id004 + + - name: Remove snmp contact + register: result + cisco.nxos.nxos_snmp_contact: *id005 + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_contact: *id005 + + - assert: *id004 + always: + + - name: Cleanup + cisco.nxos.nxos_snmp_contact: *id005 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_community sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v1_trap.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v1_trap.yaml new file mode 100644 index 00000000..8f0d0fd3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v1_trap.yaml @@ -0,0 +1,125 @@ +--- +- set_fact: snmp_type="trap" + +- set_fact: snmp_version="v1" + +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" + +- set_fact: intname="{{ nxos_int1 }}" + when: platform is not search('N5K|N6K') + +- name: Setup - Remove snmp_host if configured + ignore_errors: true + cisco.nxos.nxos_snmp_host: &id007 + snmp_host: 192.0.2.3 + community: TESTING + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + udp: 222 + state: absent + +- block: + + - name: Configure snmp host + register: result + cisco.nxos.nxos_snmp_host: &id001 + snmp_host: 192.0.2.3 + community: TESTING + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + udp: 222 + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: Add another vrf to filter + register: result + cisco.nxos.nxos_snmp_host: &id003 + snmp_host: 192.0.2.3 + vrf_filter: default + udp: 222 + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id003 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: remove some configuration + register: result + cisco.nxos.nxos_snmp_host: &id005 + snmp_host: 192.0.2.3 + udp: 222 + src_intf: '{{ intname|default(omit) }}' + vrf: management + vrf_filter: management + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id005 + + - assert: *id004 + + - block: + + - name: remove some more configuration + register: result + cisco.nxos.nxos_snmp_host: &id006 + snmp_host: 192.0.2.3 + udp: 222 + vrf_filter: default + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id006 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id002 + + - name: Cleanup Idempotence + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id004 + always: + + - name: Cleanup + cisco.nxos.nxos_snmp_host: *id007 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v2_inform.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v2_inform.yaml new file mode 100644 index 00000000..423fa6cb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v2_inform.yaml @@ -0,0 +1,125 @@ +--- +- set_fact: snmp_type="inform" + +- set_fact: snmp_version="v2c" + +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" + +- set_fact: intname="{{ nxos_int1 }}" + when: platform is not search('N5K|N6K') + +- name: Setup - Remove snmp_host if configured + ignore_errors: true + cisco.nxos.nxos_snmp_host: &id007 + snmp_host: 192.0.2.3 + community: TESTING + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + udp: 222 + state: absent + +- block: + + - name: Configure snmp host + register: result + cisco.nxos.nxos_snmp_host: &id001 + snmp_host: 192.0.2.3 + community: TESTING + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + udp: 222 + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: Add another vrf to filter + register: result + cisco.nxos.nxos_snmp_host: &id003 + snmp_host: 192.0.2.3 + vrf_filter: default + udp: 222 + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id003 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: remove some configuration + register: result + cisco.nxos.nxos_snmp_host: &id005 + snmp_host: 192.0.2.3 + udp: 222 + src_intf: '{{ intname|default(omit) }}' + vrf: management + vrf_filter: management + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id005 + + - assert: *id004 + + - block: + + - name: remove some more configuration + register: result + cisco.nxos.nxos_snmp_host: &id006 + snmp_host: 192.0.2.3 + udp: 222 + vrf_filter: default + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id006 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id002 + + - name: Cleanup Idempotence + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id004 + always: + + - name: Cleanup + cisco.nxos.nxos_snmp_host: *id007 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_inform.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_inform.yaml new file mode 100644 index 00000000..0f7d0c70 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_inform.yaml @@ -0,0 +1,131 @@ +--- +- set_fact: snmp_type="inform" + +- set_fact: snmp_version="v3" + +- set_fact: snmp_auth="priv" + +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" + +- set_fact: intname="{{ nxos_int1 }}" + when: platform is not search('N5K|N6K') + +- set_fact: run="true" + +- set_fact: run="false" + when: platform is match('N35') + +- name: Setup - Remove snmp_host if configured + ignore_errors: true + cisco.nxos.nxos_snmp_host: &id007 + snmp_host: 192.0.2.3 + community: TESTING + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + v3: '{{ snmp_auth }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + state: absent + +- block: + + - name: Configure snmp host + register: result + cisco.nxos.nxos_snmp_host: &id001 + snmp_host: 192.0.2.3 + community: TESTING + v3: '{{ snmp_auth|default(omit) }}' + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: Add another vrf to filter + register: result + cisco.nxos.nxos_snmp_host: &id003 + snmp_host: 192.0.2.3 + vrf_filter: default + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id003 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: remove some configuration + register: result + cisco.nxos.nxos_snmp_host: &id005 + snmp_host: 192.0.2.3 + src_intf: '{{ intname|default(omit) }}' + vrf: management + vrf_filter: management + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id005 + + - assert: *id004 + + - block: + + - name: remove some more configuration + register: result + cisco.nxos.nxos_snmp_host: &id006 + snmp_host: 192.0.2.3 + vrf_filter: default + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id006 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id002 + + - name: Cleanup Idempotence + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id004 + when: run + always: + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_trap.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_trap.yaml new file mode 100644 index 00000000..12eaf77f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_host/tests/common/sanity_snmp_v3_trap.yaml @@ -0,0 +1,130 @@ +--- +- set_fact: snmp_type="trap" + +- set_fact: snmp_version="v3" + +- set_fact: snmp_auth="priv" + +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" + +- set_fact: intname="{{ nxos_int1 }}" + when: platform is not search('N5K|N6K') + +- name: Setup - Remove snmp_host if configured + ignore_errors: true + cisco.nxos.nxos_snmp_host: &id007 + snmp_host: 192.0.2.3 + community: TESTING + udp: 222 + v3: '{{ snmp_auth|default(omit) }}' + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + state: absent + +- block: + + - name: Configure snmp host + register: result + cisco.nxos.nxos_snmp_host: &id001 + snmp_host: 192.0.2.3 + community: TESTING + udp: 222 + v3: '{{ snmp_auth|default(omit) }}' + version: '{{ snmp_version }}' + snmp_type: '{{ snmp_type }}' + vrf: management + vrf_filter: management + src_intf: '{{ intname|default(omit) }}' + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: Add another vrf to filter + register: result + cisco.nxos.nxos_snmp_host: &id003 + snmp_host: 192.0.2.3 + udp: 222 + vrf_filter: default + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id003 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: remove some configuration + register: result + cisco.nxos.nxos_snmp_host: &id005 + snmp_host: 192.0.2.3 + udp: 222 + src_intf: '{{ intname|default(omit) }}' + vrf: management + vrf_filter: management + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id005 + + - assert: *id004 + + - block: + + - name: remove some more configuration + register: result + cisco.nxos.nxos_snmp_host: &id006 + snmp_host: 192.0.2.3 + udp: 222 + vrf_filter: default + state: absent + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_host: *id006 + + - assert: *id004 + when: platform is not search('N35|N5K|N6K') + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id002 + + - name: Cleanup Idempotence + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - assert: *id004 + always: + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_host: *id007 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_host {{ snmp_type + }} {{ snmp_version }} sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tests/common/sanity.yaml new file mode 100644 index 00000000..487bcd38 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_location/tests/common/sanity.yaml @@ -0,0 +1,62 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_location sanity + test" + +- name: Setup - Remove snmp_location if configured + cisco.nxos.nxos_snmp_location: &id005 + location: Test + state: absent + +- block: + + - name: Configure snmp location + register: result + cisco.nxos.nxos_snmp_location: &id001 + location: Testing + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_location: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Change snmp location + register: result + cisco.nxos.nxos_snmp_location: &id003 + location: Test + state: present + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_location: *id003 + + - assert: *id004 + + - name: remove snmp location + register: result + cisco.nxos.nxos_snmp_location: *id005 + + - assert: *id002 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_snmp_location: *id005 + + - assert: *id004 + always: + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_location: *id005 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_location sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tests/common/sanity.yaml new file mode 100644 index 00000000..85ac8a05 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_traps/tests/common/sanity.yaml @@ -0,0 +1,77 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_traps sanity test" + +- name: Setup - Remove snmp_traps if configured + cisco.nxos.nxos_snmp_traps: &id006 + group: all + state: disabled + +- block: + + - name: Configure one snmp trap group + register: result + cisco.nxos.nxos_snmp_traps: &id001 + group: bridge + state: enabled + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_traps: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove snmp trap group + register: result + cisco.nxos.nxos_snmp_traps: &id003 + group: bridge + state: disabled + + - assert: *id002 + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_traps: *id003 + + - assert: *id004 + + - name: Configure all snmp trap groups + register: result + cisco.nxos.nxos_snmp_traps: &id005 + group: all + state: enabled + + - assert: *id002 + + - block: + + - name: Idempotence Check + register: result + cisco.nxos.nxos_snmp_traps: *id005 + + - assert: *id004 + when: imagetag is not search("I2|I7|D1") + + - name: Cleanup + register: result + cisco.nxos.nxos_snmp_traps: *id006 + + - assert: *id002 + + - name: Cleanup Idempotence + register: result + cisco.nxos.nxos_snmp_traps: *id006 + + - assert: *id004 + always: + + - name: Cleanup + cisco.nxos.nxos_snmp_traps: *id006 + + - debug: msg="END connection={{ ansible_connection }} nxos_snmp_traps sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tests/common/sanity.yaml new file mode 100644 index 00000000..63af96d7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_snmp_user/tests/common/sanity.yaml @@ -0,0 +1,109 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_snmp_user sanity test" + +- set_fact: delete_last_user_allowed='true' + +- set_fact: delete_last_user_allowed='false' + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- set_fact: delete_last_user_allowed='false' + when: platform is search('N5K|N6K|N9K-F') + +- name: Remove snmp user + ignore_errors: true + when: platform is not search('N5K|N6K|N9K-F') + cisco.nxos.nxos_snmp_user: &id006 + user: ntc + state: absent + +- name: Remove user workaround + ignore_errors: true + when: platform is search('N5K|N6K|N9K-F') + cisco.nxos.nxos_user: &id007 + name: ntc + state: absent + +- pause: + seconds: 5 + +- block: + + - name: Create snmp user + register: result + cisco.nxos.nxos_snmp_user: + user: ntc + group: network-operator + authentication: md5 + pwd: N$tOpe%1 + privacy: HelloU$er1 + encrypt: true + + - assert: &id001 + that: + - result.changed == true + + - name: Add another group to user + register: result + cisco.nxos.nxos_snmp_user: &id002 + user: ntc + group: network-admin + + - assert: *id001 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_snmp_user: *id002 + + - assert: &id004 + that: + - result.changed == false + + - name: Remove group from user + register: result + cisco.nxos.nxos_snmp_user: &id003 + user: ntc + group: network-admin + state: absent + + - assert: *id001 + + - pause: + seconds: 5 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_snmp_user: *id003 + + - assert: *id004 + + - block: + + - name: delete snmp user + register: result + cisco.nxos.nxos_snmp_user: &id005 + user: ntc + group: network-operator + state: absent + + - assert: *id001 + + - pause: + seconds: 5 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_snmp_user: *id005 + + - assert: *id004 + when: delete_last_user_allowed + always: + + - name: delete snmp user + when: platform is not search('N5K|N6K|N9K-F') + cisco.nxos.nxos_snmp_user: *id006 + + - name: remove user workaround + when: platform is search('N5K|N6K|N9K-F') + cisco.nxos.nxos_user: *id007 + +- debug: msg="END connection={{ ansible_connection }} nxos_snmp_user sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/defaults/main.yaml new file mode 100644 index 00000000..e69126b0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/defaults/main.yaml @@ -0,0 +1,5 @@ +--- +testcase: '*' +vrfs: +- default +- myvrf diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tests/common/sanity.yaml new file mode 100644 index 00000000..cccaa916 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_route/tests/common/sanity.yaml @@ -0,0 +1,211 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_static_route sanity + test" + +- set_fact: test_track_feature="true" + +- name: configure track + register: cmd_result + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - track 1 ip sla 1 + +- debug: msg="cmd result {{ cmd_result }}" + +- set_fact: test_track_feature="false" + when: cmd_result.failed + +- debug: msg="Test Track Feature {{ test_track_feature }}" + +- name: Setup and teardown, remove test routes if present + with_items: '{{ vrfs }}' + ignore_errors: true + cisco.nxos.nxos_static_route: &id009 + aggregate: + + - prefix: 192.168.1.164/32 + next_hop: 192.0.2.3 + + - prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + + - prefix: 192.168.22.64/24 + next_hop: 192.0.2.3 + + - prefix: 192.168.24.64/24 + next_hop: 192.0.2.3 + vrf: '{{ item }}' + state: absent + +- name: Setup noise routes to ensure testing while non-test routes present + with_items: '{{ vrfs }}' + cisco.nxos.nxos_static_route: + prefix: 192.168.1.164/32 + next_hop: 192.0.2.3 + vrf: '{{ item }}' + state: present + +- block: + + - name: create static route + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_static_route: &id001 + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: testing + pref: 100 + tag: 5500 + vrf: '{{ item }}' + + - assert: &id002 + that: + - result.changed == true + + - name: Conf static Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_static_route: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: change static route + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_static_route: &id003 + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: default + pref: 10 + tag: default + vrf: '{{ item }}' + + - assert: *id002 + + - name: Change Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_static_route: *id003 + + - assert: *id004 + + - name: configure static route with track + with_items: '{{ vrfs }}' + register: result + when: test_track_feature + cisco.nxos.nxos_static_route: &id005 + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: default + pref: 10 + tag: default + track: 1 + vrf: '{{ item }}' + + - assert: *id002 + when: test_track_feature + + - name: Config track Idempotence + with_items: '{{ vrfs }}' + register: result + when: test_track_feature + cisco.nxos.nxos_static_route: *id005 + + - assert: *id004 + when: test_track_feature + + - name: configure static route with not configured track + with_items: '{{ vrfs }}' + register: result + ignore_errors: true + when: test_track_feature + cisco.nxos.nxos_static_route: + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: default + pref: 10 + tag: default + track: 2 + vrf: '{{ item }}' + + - assert: + that: + - result.failed == True + when: test_track_feature + + - name: remove static route + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_static_route: &id006 + prefix: 192.168.20.64/24 + next_hop: 192.0.2.3 + route_name: testing + pref: 100 + vrf: '{{ item }}' + state: absent + + - assert: *id002 + + - name: Remove Idempotence + with_items: '{{ vrfs }}' + register: result + cisco.nxos.nxos_static_route: *id006 + + - assert: *id004 + + - name: configure static route(aggregate) + register: result + cisco.nxos.nxos_static_route: &id007 + aggregate: + + - prefix: 192.168.22.64/24 + next_hop: 192.0.2.3 + + - prefix: 192.168.24.64/24 + next_hop: 192.0.2.3 + + - assert: *id002 + + - name: configure static route aggregate(Idempotence) + register: result + cisco.nxos.nxos_static_route: *id007 + + - assert: *id004 + + - name: remove static route aggregate + register: result + cisco.nxos.nxos_static_route: &id008 + aggregate: + + - prefix: 192.168.22.64/24 + next_hop: 192.0.2.3 + + - prefix: 192.168.24.64/24 + next_hop: 192.0.2.3 + state: absent + + - assert: *id002 + + - name: remove static route aggregate(Idempotence) + register: result + cisco.nxos.nxos_static_route: *id008 + + - assert: *id004 + always: + + - name: remove track + ignore_errors: true + when: test_track_feature + cisco.nxos.nxos_config: + lines: + - no track 1 + + - name: teardown test routes + with_items: '{{ vrfs }}' + ignore_errors: true + cisco.nxos.nxos_static_route: *id009 + +- debug: msg="END connection={{ ansible_connection }} nxos_static_route sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/defaults/main.yaml new file mode 100644 index 00000000..871ea460 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: "[^_].*" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/meta/main.yml new file mode 100644 index 00000000..ae741cbd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/cli.yaml new file mode 100644 index 00000000..4b1a0153 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: "{{ role_path }}/tests/common" + patterns: "{{ testcase }}.yml" + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: "{{ role_path }}/tests/cli" + patterns: "{{ testcase }}.yaml" + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: "{{ test_cases.files }} + {{ cli_cases.files }}" + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: "{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/main.yaml new file mode 100644 index 00000000..415c99d8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tasks/main.yaml @@ -0,0 +1,2 @@ +--- +- { include: cli.yaml, tags: ['cli'] } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_populate_config.yaml new file mode 100644 index 00000000..d0a8d79a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_populate_config.yaml @@ -0,0 +1,11 @@ +--- +- name: Populate config + cisco.nxos.nxos_config: + lines: + - "ip route 192.0.2.16/28 192.0.2.24 name new_route" + - "ip route 192.0.2.80/28 192.0.2.26 tag 12" + - "vrf context trial_vrf" + - " ip route 192.0.2.64/28 192.0.2.22 tag 4" + - " ip route 192.0.2.64/28 192.0.2.23 name merged_route 1" + - "interface {{ nxos_int2 }}" + - " no switchport" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_remove_config.yaml new file mode 100644 index 00000000..2af46721 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/_remove_config.yaml @@ -0,0 +1,15 @@ +--- +- name: Remove config + cisco.nxos.nxos_config: + lines: + - "no ip route 192.0.2.16/28 192.0.2.24 name new_route" + - "no ip route 192.0.2.80/28 192.0.2.26 tag 12" + - "no ip route 192.0.2.44/30 192.0.2.55 tag 1 1" + - "no ip route 192.0.2.16/28 192.0.2.23 name replaced_route1 3" + - "no ip route 192.0.2.16/28 {{ nxos_int2 }} 192.0.2.45 vrf destinationVRF name replaced_route2" + - "no ip route 192.0.2.36/30 192.0.2.32 name test_route1 tag 14" + - "no ip route 192.0.2.36/30 192.0.2.48 name test_route2 2" + - "no vrf context trial_vrf" + - "default interface {{ nxos_int2 }}" + ignore_errors: yes + #error is thrown if we deleted trial_vrf when it is not present already. ignore_errors circumvents it diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/deleted.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/deleted.yml new file mode 100644 index 00000000..2b66a2ee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/deleted.yml @@ -0,0 +1,81 @@ +--- +- debug: + msg: "Start nxos_static_routes deleted integration tests connection = {{ ansible_connection }}" + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather static_routes facts + cisco.nxos.nxos_facts: &facts + gather_subset: + - "!all" + - "!min" + gather_network_resources: static_routes + + - name: Delete all routes based on VRF + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + state: deleted + register: result + + - assert: + that: + - "result.changed == true" + - "'vrf context trial_vrf' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.22 tag 4' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.23 name merged_route 1' in result.commands" + - "result.commands | length == 3" + + - include_tasks: _populate_config.yaml + + - name: Delete routes based on AFI in a VRF + cisco.nxos.nxos_static_routes: + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + state: deleted + register: result + + - assert: + that: + - "result.changed == true" + - "'vrf context trial_vrf' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.22 tag 4' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.23 name merged_route 1' in result.commands" + - "result.commands | length == 3" + + - include_tasks: _remove_config.yaml + + - include_tasks: _populate_config.yaml + + - name: Deleted (All routes) + cisco.nxos.nxos_static_routes: &deleted + state: deleted + register: result + + - name: Gather static_routes post facts + cisco.nxos.nxos_facts: *facts + + - assert: + that: + - "'vrf context trial_vrf' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.22 tag 4' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.23 name merged_route 1' in result.commands" + - "'vrf context default' in result.commands" + - "'no ip route 192.0.2.16/28 192.0.2.24 name new_route' in result.commands" + - "'no ip route 192.0.2.80/28 192.0.2.26 tag 12' in result.commands" + - "result.changed == true" + - "result.commands | length == 6" + + - name: Idempotence - deleted + cisco.nxos.nxos_static_routes: *deleted + register: result + + - assert: + that: + - "result.changed == false" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/gathered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/gathered.yml new file mode 100644 index 00000000..05e87d81 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/gathered.yml @@ -0,0 +1,34 @@ +--- +- debug: + msg: "Start nxos_static_routes gathered tests connection={{ ansible_connection }}" + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather static_routes facts + cisco.nxos.nxos_facts: &facts + gather_subset: + - "!all" + - "!min" + gather_network_resources: static_routes + + - name: Gathered + cisco.nxos.nxos_static_routes: &gathered + state: gathered + register: result + + - assert: + that: + - "result.changed == false" + - "ansible_facts.network_resources.static_routes == result.gathered" + + - name: Idempotence - Gathered + cisco.nxos.nxos_static_routes: *gathered + register: result + + - assert: + that: + - "result.changed == false" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/merged.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/merged.yml new file mode 100644 index 00000000..e8ec880b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/merged.yml @@ -0,0 +1,61 @@ +--- +- debug: + msg: "Start nxos_static_routes merged integration tests connection={{ansible_connection}}" + +- include_tasks: _populate_config.yaml + +- include_tasks: _remove_config.yaml + +- block: + - name: Merged + cisco.nxos.nxos_static_routes: &merged + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.64/28 + next_hops: + - forward_router_address: 192.0.2.22 + tag: 4 + + - forward_router_address: 192.0.2.23 + route_name: merged_route + admin_distance: 1 + + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.24 + route_name: new_route + + - dest: 192.0.2.80/28 + next_hops: + - forward_router_address: 192.0.2.26 + tag: 12 + state: merged + register: result + + - assert: + that: + - "result.changed == true" + - "'vrf context default' in result.commands" + - "'ip route 192.0.2.16/28 192.0.2.24 name new_route' in result.commands" + - "'ip route 192.0.2.80/28 192.0.2.26 tag 12' in result.commands" + - "'vrf context trial_vrf' in result.commands" + - "'ip route 192.0.2.64/28 192.0.2.22 tag 4' in result.commands" + - "'ip route 192.0.2.64/28 192.0.2.23 name merged_route 1' in result.commands" + - "result.commands | length == 6" + + - name: Idempotence - Merged + cisco.nxos.nxos_static_routes: *merged + register: result + + - assert: + that: + - "result.changed == false" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/overridden.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/overridden.yml new file mode 100644 index 00000000..2a007d7b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/overridden.yml @@ -0,0 +1,60 @@ +--- +- debug: + msg: "Start nxos_static_routes overridden tests connection={{ ansible_connection }}" + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather static_routes facts + cisco.nxos.nxos_facts: &facts + gather_subset: + - "!all" + - "!min" + gather_network_resources: static_routes + + - name: Overridden + cisco.nxos.nxos_static_routes: &overridden + config: + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.23 + route_name: overridden_route1 + admin_distance: 3 + + - forward_router_address: 192.0.2.45 + route_name: overridden_route2 + dest_vrf: destinationVRF + interface: "{{ nxos_int2 }}" + + state: overridden + register: result + + - assert: + that: + - "result.changed == true" + - "'vrf context trial_vrf' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.22 tag 4' in result.commands" + - "'no ip route 192.0.2.64/28 192.0.2.23 name merged_route 1' in result.commands" + - "'ip route 192.0.2.16/28 192.0.2.23 name overridden_route1 3' in result.commands" + - "'ip route 192.0.2.16/28 {{ nxos_int2 }} 192.0.2.45 vrf destinationVRF name overridden_route2' in result.commands" + - "'vrf context default' in result.commands" + - "'no ip route 192.0.2.16/28 192.0.2.24 name new_route' in result.commands" + - "'no ip route 192.0.2.80/28 192.0.2.26 tag 12' in result.commands" + - "result.commands | length == 8" + + - name: Idempotence - overridden + cisco.nxos.nxos_static_routes: *overridden + register: result + + - assert: + that: + - "result.changed == false" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/parsed.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/parsed.yml new file mode 100644 index 00000000..1cfe07af --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/parsed.yml @@ -0,0 +1,26 @@ +--- +- debug: + msg: "Start nxos_static_routes parsed tests connection={{ ansible_connection }}" + +- name: Parsed + cisco.nxos.nxos_static_routes: &parsed + running_config: | + ip route 192.0.2.16/28 192.0.2.24 name new_route + ip route 192.0.2.80/28 192.0.2.26 tag 12 + vrf context trial_vrf + ip route 192.0.2.64/28 192.0.2.22 tag 4 + ip route 192.0.2.64/28 192.0.2.23 name merged_route 1 + state: parsed + register: result + +- assert: + that: + - "result.changed == false" + - "result.parsed == parsed" + +- name: Idempotence - Parsed + cisco.nxos.nxos_static_routes: *parsed + register: result + +- assert: + that: "result.changed == false" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rendered.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rendered.yml new file mode 100644 index 00000000..05098874 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rendered.yml @@ -0,0 +1,49 @@ +--- +- debug: + msg: "Start nxos_static_routes rendered tests connection={{ ansible_connection }}" + +- name: Rendered + nxos_static_routes: &rendered + config: + - vrf: trial_vrf + address_families: + - afi: ipv6 + routes: + - dest: 2001:db8:12::/32 + next_hops: + - forward_router_address: 2001:db8::1001 + route_name: rendered_route + admin_distance: 3 + + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.24 + route_name: new_route + + - dest: 192.0.2.80/28 + next_hops: + - forward_router_address: 192.0.2.26 + tag: 12 + state: rendered + register: result + +- assert: + that: + - "result.changed == false" + - "'vrf context default' in result.rendered" + - "'ip route 192.0.2.16/28 192.0.2.24 name new_route' in result.rendered" + - "'ip route 192.0.2.80/28 192.0.2.26 tag 12' in result.rendered" + - "'vrf context trial_vrf' in result.rendered" + - "'ipv6 route 2001:db8:12::/32 2001:db8::1001 name rendered_route 3' in result.rendered" + - "result.rendered | length == 5" + +- name: Idempotence - Rendered + nxos_static_routes: *rendered + register: result + +- assert: + that: + - "result.changed == false" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/replaced.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/replaced.yml new file mode 100644 index 00000000..c50b0e96 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/replaced.yml @@ -0,0 +1,52 @@ +--- +- debug: + msg: "Start nxos_static_routes replaced integration tests connection = {{ansible_connection}}" + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather static_routes post facts + cisco.nxos.nxos_facts: + gather_subset: + - "!all" + - "!min" + gather_network_resources: static_routes + + - name: Replaced + cisco.nxos.nxos_static_routes: &replaced + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.16/28 + next_hops: + - forward_router_address: 192.0.2.23 + route_name: replaced_route1 + admin_distance: 3 + + - forward_router_address: 192.0.2.45 + route_name: replaced_route2 + dest_vrf: destinationVRF + interface: "{{ nxos_int2 }}" + state: replaced + register: result + + - assert: + that: + - "result.changed == true" + - "'vrf context default' in result.commands" + - "'no ip route 192.0.2.16/28 192.0.2.24 name new_route' in result.commands" + - "'ip route 192.0.2.16/28 192.0.2.23 name replaced_route1 3' in result.commands" + - "'ip route 192.0.2.16/28 {{ nxos_int2 }} 192.0.2.45 vrf destinationVRF name replaced_route2' in result.commands" + - "result.commands | length == 4" + + - name: Idempotence - Replaced + cisco.nxos.nxos_static_routes: *replaced + register: result + + - assert: + that: + - "result.changed == false" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rtt.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rtt.yml new file mode 100644 index 00000000..a844a6b1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/tests/common/rtt.yml @@ -0,0 +1,80 @@ +--- +- debug: + msg: "Start nxos_static_routes round trip integration tests on connection={{ ansible_connection }}" + +- block: + - include_tasks: _remove_config.yaml + + - name: Apply the provided configuration(base config) + cisco.nxos.nxos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.36/30 + next_hops: + - forward_router_address: 192.0.2.32 + route_name: test_route1 + tag: 14 + + - forward_router_address: 192.0.2.48 + route_name: test_route2 + admin_distance: 2 + + - vrf: trial_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.32/30 + next_hops: + - forward_router_address: 192.0.2.105 + dest_vrf: test_dest_vrf + state: merged + register: base_config + + - name: Gather interfaces facts + cisco.nxos.nxos_facts: + gather_subset: + - "!all" + - "!min" + gather_network_resources: + - static_routes + + - name: Apply provided configuration(this will be reverted) + cisco.nxos.nxos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.44/30 + next_hops: + - forward_router_address: 192.0.2.55 + tag: 1 + admin_distance: 1 + state: overridden + register: result + + - name: Assert that changes are applied + assert: + that: + - "result.changed == true" + - "'vrf context default' in result.commands" + - "'no ip route 192.0.2.36/30 192.0.2.32 name test_route1 tag 14' in result.commands" + - "'no ip route 192.0.2.36/30 192.0.2.48 name test_route2 2'" + - "'ip route 192.0.2.44/30 192.0.2.55 tag 1 1' in result.commands" + - "'vrf context trial_vrf' in result.commands" + - "'no ip route 192.0.2.32/30 192.0.2.105 vrf test_dest_vrf' in result.commands" + - "result.commands | length == 6" + + - name: Revert back to base configuration + cisco.nxos.nxos_static_routes: + config: "{{ ansible_facts['network_resources']['static_routes'] }}" + state: overridden + register: revert + + - assert: + that: + - " base_config['after'] | symmetric_difference(revert['after']) | length == 0" + + always: + - include_tasks: _remove_config.yaml diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/vars/main.yml new file mode 100644 index 00000000..b0c6d454 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_static_routes/vars/main.yml @@ -0,0 +1,53 @@ +"parsed": + [ + { + "address_families": + [ + { + "afi": "ipv4", + "routes": + [ + { + "dest": "192.0.2.64/28", + "next_hops": + [ + { "forward_router_address": "192.0.2.22", "tag": 4 }, + { + "admin_distance": 1, + "forward_router_address": "192.0.2.23", + "route_name": "merged_route", + }, + ], + }, + ], + }, + ], + "vrf": "trial_vrf", + }, + { + "address_families": + [ + { + "afi": "ipv4", + "routes": + [ + { + "dest": "192.0.2.16/28", + "next_hops": + [ + { + "forward_router_address": "192.0.2.24", + "route_name": "new_route", + }, + ], + }, + { + "dest": "192.0.2.80/28", + "next_hops": + [{ "forward_router_address": "192.0.2.26", "tag": 12 }], + }, + ], + }, + ], + }, + ] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/net_system.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/net_system.yaml new file mode 100644 index 00000000..ac99912d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/net_system.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START nxos cli/net_system.yaml on connection={{ ansible_connection + }}" + +- name: setup + cisco.nxos.nxos_config: + lines: + - no ip domain-list ansible.com + - no ip domain-list redhat.com + match: none + +- name: configure domain_list using platform agnostic module + register: result + ansible.netcommon.net_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == true + - "'ip domain-list ansible.com' in result.commands" + - "'ip domain-list redhat.com' in result.commands" + +- name: setup + cisco.nxos.nxos_config: + lines: + - no ip domain-list ansible.com + - no ip domain-list redhat.com + match: none + +- debug: msg="END nxos cli/net_system.yaml on connection={{ ansible_connection }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_list.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_list.yaml new file mode 100644 index 00000000..c5e0655b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_list.yaml @@ -0,0 +1,112 @@ +--- +- debug: msg="START cli/set_domain_list.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: + - no ip domain-list ansible.com + - no ip domain-list redhat.com + match: none + +- name: configure domain_list + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == true + - "'ip domain-list ansible.com' in result.commands" + - "'ip domain-list redhat.com' in result.commands" + +- name: verify domain_list + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == false + +- name: remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + +- assert: + that: + - result.changed == true + - "'no ip domain-list redhat.com' in result.commands" + +- name: verify remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + +- assert: + that: + - result.changed == false + +- name: add one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == true + - "'ip domain-list redhat.com' in result.commands" + +- name: verify add one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == false + +- name: add and remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - eng.ansible.com + +- assert: + that: + - result.changed == true + - "'no ip domain-list redhat.com' in result.commands" + - "'ip domain-list eng.ansible.com' in result.commands" + - result.commands|length == 2 + +- name: verify add and remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - eng.ansible.com + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: + - no ip domain-list ansible.com + - no ip domain-list redhat.com + - no ip domain-list eng.ansible.com + match: none + +- debug: msg="END cli/set_domain_search.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_name.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_name.yaml new file mode 100644 index 00000000..aecce57c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_domain_name.yaml @@ -0,0 +1,32 @@ +--- +- debug: msg="START cli/set_domain_name.yaml" + +- name: setup + cisco.nxos.nxos_config: + lines: no ip domain-name eng.ansible.com + match: none + +- name: configure domain_name + register: result + cisco.nxos.nxos_system: + domain_name: eng.ansible.com + +- assert: + that: + - result.changed == true + +- name: verify domain_name + register: result + cisco.nxos.nxos_system: + domain_name: eng.ansible.com + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip domain-name eng.ansible.com + match: none + +- debug: msg="END cli/set_domain_name.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_name_servers.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_name_servers.yaml new file mode 100644 index 00000000..542c7ac8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/cli/set_name_servers.yaml @@ -0,0 +1,73 @@ +--- +- debug: msg="START cli/set_name_servers.yaml" + +- name: setup + cisco.nxos.nxos_config: &id002 + lines: + - no ip name-server 192.0.2.1 + - no ip name-server 192.0.2.2 + - no ip name-server 192.0.2.3 + match: none + +- name: configure name_servers + register: result + cisco.nxos.nxos_system: + name_servers: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + +- assert: + that: + - result.changed == true + - "'ip name-server 192.0.2.1' in result.commands" + - "'ip name-server 192.0.2.2' in result.commands" + - "'ip name-server 192.0.2.3' in result.commands" + +- name: verify name_servers + register: result + cisco.nxos.nxos_system: + name_servers: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + +- assert: + that: + - result.changed == false + +- name: remove one + register: result + cisco.nxos.nxos_system: + name_servers: + - 192.0.2.1 + - 192.0.2.2 + +- assert: + that: + - result.changed == true + - result.commands|length == 1 + - "'no ip name-server 192.0.2.3' in result.commands" + +- name: default name server + register: result + cisco.nxos.nxos_system: &id001 + name_servers: default + +- assert: + that: + - result.changed == true + +- name: Idempotent check + register: result + cisco.nxos.nxos_system: *id001 + +- assert: + that: + - result.changed == false + +- name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id002 + +- debug: msg="END cli/set_name_servers.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/sanity.yaml new file mode 100644 index 00000000..4dd8e8fe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/sanity.yaml @@ -0,0 +1,131 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/sanity.yaml" + +- block: + + - name: remove configuration + register: result + ignore_errors: true + cisco.nxos.nxos_system: &id010 + state: absent + + - name: configure domain lookup + register: result + cisco.nxos.nxos_system: &id007 + domain_lookup: true + state: present + + - name: configure hostname and domain-name + register: result + cisco.nxos.nxos_system: &id001 + hostname: switch + domain_name: test.example.com + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: configure name servers + register: result + cisco.nxos.nxos_system: &id003 + name_servers: + - 8.8.8.8 + - 8.8.4.4 + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id003 + + - assert: *id004 + + - name: configure name servers with VRF support + register: result + cisco.nxos.nxos_system: &id005 + name_servers: + + - server: 8.8.8.8 + vrf: management + + - server: 8.8.4.4 + vrf: management + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id005 + + - assert: *id004 + + - name: configure domain lookup1 + register: result + cisco.nxos.nxos_system: &id006 + domain_lookup: false + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id006 + + - assert: *id004 + + - name: configure domain lookup2 + register: result + cisco.nxos.nxos_system: *id007 + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id007 + + - assert: *id004 + + - name: configure system mtu + register: result + cisco.nxos.nxos_system: &id008 + system_mtu: 3000 + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id008 + + - assert: *id004 + + - name: default configuration + register: result + cisco.nxos.nxos_system: &id009 + hostname: default + domain_name: default + name_servers: default + system_mtu: default + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_system: *id009 + + - assert: *id004 + always: + + - name: remove configuration + cisco.nxos.nxos_system: *id010 + + - name: Re-configure hostname + cisco.nxos.nxos_system: *id001 + + - debug: msg="END connection={{ ansible_connection }}/sanity.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/set_hostname.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/set_hostname.yaml new file mode 100644 index 00000000..6efd90e2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/common/set_hostname.yaml @@ -0,0 +1,35 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/set_hostname.yaml" + +- block: + + - name: setup + cisco.nxos.nxos_config: + lines: hostname switch + match: none + + - name: configure hostname + register: result + cisco.nxos.nxos_system: + hostname: foo + + - assert: + that: + - result.changed == true + + - name: verify hostname + register: result + cisco.nxos.nxos_system: + hostname: foo + + - assert: + that: + - result.changed == false + always: + + - name: teardown + cisco.nxos.nxos_config: + lines: hostname switch + match: none + + - debug: msg="END connection={{ ansible_connection }}/set_hostname.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/net_system.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/net_system.yaml new file mode 100644 index 00000000..77762020 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/net_system.yaml @@ -0,0 +1,34 @@ +--- +- debug: msg="START nxos nxapi/net_system.yaml on connection={{ ansible_connection + }}" + +- name: setup + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no ip domain-list ansible.com + - no ip domain-list redhat.com + match: none + +- name: configure domain_list using platform agnostic module + register: result + ansible.netcommon.net_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == true + - "'ip domain-list ansible.com' in result.commands" + - "'ip domain-list redhat.com' in result.commands" + +- name: setup + cisco.nxos.nxos_config: + lines: + - no ip domain-list ansible.com + - no ip domain-list redhat.com + match: none + +- debug: msg="END nxos nxapi/net_system.yaml on connection={{ ansible_connection + }}" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_list.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_list.yaml new file mode 100644 index 00000000..a035304e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_list.yaml @@ -0,0 +1,118 @@ +--- +- debug: msg="START nxapi/set_domain_list.yaml" + +- name: setup + ignore_errors: true + with_items: + - ansible.com + - redhat.com + cisco.nxos.nxos_config: + lines: + - no ip domain-list {{ item }} + match: none + +- name: configure domain_list + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == true + - "'ip domain-list ansible.com' in result.commands" + - "'ip domain-list redhat.com' in result.commands" + +- name: verify domain_list + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == false + +- name: remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + +- assert: + that: + - result.changed == true + - "'no ip domain-list redhat.com' in result.commands" + +- name: verify remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + +- assert: + that: + - result.changed == false + +- name: add one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == true + - "'ip domain-list redhat.com' in result.commands" + +- name: verify add one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - redhat.com + +- assert: + that: + - result.changed == false + +- name: add and remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - eng.ansible.com + +- assert: + that: + - result.changed == true + - "'no ip domain-list redhat.com' in result.commands" + - "'ip domain-list eng.ansible.com' in result.commands" + - result.commands|length == 2 + +- name: verify add and remove one entry + register: result + cisco.nxos.nxos_system: + domain_search: + - ansible.com + - eng.ansible.com + +- assert: + that: + - result.changed == false + +- name: teardown + ignore_errors: true + with_items: + - ansible.com + - redhat.com + - eng.ansible.com + cisco.nxos.nxos_config: + lines: + - no ip domain-list {{ item }} + match: none + +- debug: msg="END nxapi/set_domain_search.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_name.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_name.yaml new file mode 100644 index 00000000..4dd0ddc1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_domain_name.yaml @@ -0,0 +1,33 @@ +--- +- debug: msg="START nxapi/set_domain_name.yaml" + +- name: setup + ignore_errors: true + cisco.nxos.nxos_config: + lines: no ip domain-name eng.ansible.com + match: none + +- name: configure domain_name + register: result + cisco.nxos.nxos_system: + domain_name: eng.ansible.com + +- assert: + that: + - result.changed == true + +- name: verify domain_name + register: result + cisco.nxos.nxos_system: + domain_name: eng.ansible.com + +- assert: + that: + - result.changed == false + +- name: teardown + cisco.nxos.nxos_config: + lines: no ip domain-name eng.ansible.com + match: none + +- debug: msg="END nxapi/set_domain_name.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_name_servers.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_name_servers.yaml new file mode 100644 index 00000000..6ce15f89 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_system/tests/nxapi/set_name_servers.yaml @@ -0,0 +1,80 @@ +--- +- debug: msg="START nxapi/set_name_servers.yaml" + +- name: setup + ignore_errors: true + with_items: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + cisco.nxos.nxos_config: &id002 + lines: + - no ip name-server {{ item }} + match: none + +- name: configure name_servers + register: result + cisco.nxos.nxos_system: + name_servers: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + +- assert: + that: + - result.changed == true + - "'ip name-server 192.0.2.1' in result.commands" + - "'ip name-server 192.0.2.2' in result.commands" + - "'ip name-server 192.0.2.3' in result.commands" + +- name: verify name_servers + register: result + cisco.nxos.nxos_system: + name_servers: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + +- assert: + that: + - result.changed == false + +- name: remove one + register: result + cisco.nxos.nxos_system: + name_servers: + - 192.0.2.1 + - 192.0.2.2 + +- assert: + that: + - result.changed == true + - result.commands|length == 1 + - "'no ip name-server 192.0.2.3' in result.commands" + +- name: default name server + register: result + cisco.nxos.nxos_system: &id001 + name_servers: default + +- assert: + that: + - result.changed == true + +- name: Idempotent check + register: result + cisco.nxos.nxos_system: *id001 + +- assert: + that: + - result.changed == false + +- name: teardown + with_items: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + ignore_errors: true + cisco.nxos.nxos_config: *id002 + +- debug: msg="END nxapi/set_name_servers.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/cli.yaml new file mode 100644 index 00000000..1edbef6f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/cli.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/main.yaml new file mode 100644 index 00000000..30f9acf2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/main.yaml @@ -0,0 +1,16 @@ +--- +- set_fact: run_test="true" + +- set_fact: run_test="false" + when: platform is not search("N9K") + +- set_fact: run_test="false" + when: imagetag is search("I2|I3|I4|I5|I6") + +- include: cli.yaml + tags: cli + when: run_test + +- include: nxapi.yaml + tags: nxapi + when: run_test diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/nxapi.yaml new file mode 100644 index 00000000..7e21ea41 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tasks/nxapi.yaml @@ -0,0 +1,27 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/templates/populate_config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/templates/populate_config.cfg new file mode 100644 index 00000000..408324fe --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/templates/populate_config.cfg @@ -0,0 +1,38 @@ +telemetry + certificate test_cert host.example.com + destination-profile + use-vrf blue + use-compression gzip + destination-group 2 + ip address 192.168.0.1 port 50001 protocol gRPC encoding GPB + ip address 192.168.0.2 port 60001 protocol gRPC encoding GPB + destination-group 10 + ip address 192.168.0.1 port 50001 protocol gRPC encoding GPB + ip address 192.168.0.2 port 60001 protocol gRPC encoding GPB + ip address 192.168.1.1 port 55 protocol HTTP encoding JSON + ip address 192.168.1.2 port 100 protocol gRPC encoding GPB + destination-group 99 + sensor-group 2 + data-source NX-API + path "show bgp l2vpn evpn summary" depth unbounded query-condition foo filter-condition foo + sensor-group 8 + data-source NX-API + path "show ip bgp neighbors" depth 0 query-condition foo filter-condition foo + sensor-group 55 + data-source DME + path sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11] depth 0 query-condition foo filter-condition foo + path sys/ospf depth 0 query-condition foo filter-condition or(eq(ethpmPhysIf.operSt,"down"),eq(ethpmPhysIf.operSt,"up")) + sensor-group 77 + subscription 44 + dst-grp 2 + dst-grp 10 + snsr-grp 2 sample-interval 2000 + snsr-grp 8 sample-interval 2000 + subscription 55 + dst-grp 10 + snsr-grp 55 sample-interval 2000 + subscription 99 + dst-grp 2 + dst-grp 99 + snsr-grp 8 sample-interval 90000 + snsr-grp 77 sample-interval 2000 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/deleted.yaml new file mode 100644 index 00000000..21c0081d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/deleted.yaml @@ -0,0 +1,160 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_telemetry deleted sanity + test" + +- set_fact: source_interface="Loopback55" + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- set_fact: before_keys_length=6 + +- set_fact: before_keys_length=7 + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_feature: &id003 + feature: telemetry + state: disabled + +- name: Setup - Configure Telemetry + cisco.nxos.nxos_telemetry: + state: merged + config: + certificate: + key: /bootflash/server.key + hostname: localhost + compression: gzip + source_interface: '{{source_interface|default(omit)}}' + vrf: management + destination_groups: + + - id: 2 + destination: + ip: 192.168.0.1 + port: 50001 + protocol: grpc + encoding: gpb + + - id: 2 + destination: + ip: 192.168.0.2 + port: 60001 + protocol: gRPC + encoding: GPB + + - id: 10 + destination: + ip: 192.168.0.1 + port: 50001 + protocol: Grpc + encoding: gPB + + - id: 10 + destination: + ip: 192.168.0.2 + port: 60001 + protocol: gRPC + encoding: gpb + sensor_groups: + + - id: 8 + data_source: NX-API + path: + name: '"show bgp l2vpn evpn summary"' + depth: 0 + query_condition: foo + filter_condition: foo + + - id: 2 + data_source: NX-API + path: + name: '"show ip bgp neighbors"' + depth: unbounded + query_condition: foo + filter_condition: foo + + - id: 55 + data_source: DME + path: + name: sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11] + depth: 0 + query_condition: foo + filter_condition: foo + + - id: 55 + data_source: DME + path: + name: sys/ospf + depth: 0 + query_condition: foo + filter_condition: or(eq(ethpmPhysIf.operSt,"down"),eq(ethpmPhysIf.operSt,"up")) + subscriptions: + + - id: 44 + destination_group: 10 + sensor_group: + id: 8 + sample_interval: 2000 + + - id: 44 + destination_group: 2 + sensor_group: + id: 2 + sample_interval: 2000 + + - id: 55 + destination_group: 10 + sensor_group: + id: 55 + sample_interval: 2000 + +- block: + + - name: Gather Telemetry Facts Before Changes + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - telemetry + + - name: Telemetry - deleted + register: result + cisco.nxos.nxos_telemetry: &id002 + state: deleted + + - assert: + that: + - result.changed == true + - "'no telemetry' in result.commands" + - result.before|dict2items|length == {{ before_keys_length }} + + - assert: + that: + - (ansible_facts.network_resources.telemetry|dict2items)|symmetric_difference(result.before|dict2items)|length + == 0 + + - name: Gather Telemetry Facts After Changes + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - (ansible_facts.network_resources.telemetry|dict2items)|symmetric_difference(result.after|dict2items)|length + == 0 + + - name: Telemetry - deleted - idempotence + register: result + cisco.nxos.nxos_telemetry: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: Teardown + ignore_errors: true + cisco.nxos.nxos_feature: *id003 + + - debug: msg="END connection={{ ansible_connection }} nxos_telemetry deleted + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/merged.yaml new file mode 100644 index 00000000..6d22f6e9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/merged.yaml @@ -0,0 +1,309 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_telemetry merged sanity + test" + +- set_fact: source_interface="Loopback55" + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- set_fact: command_list_length=30 + +- set_fact: command_list_length=31 + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- name: Setup + ignore_errors: true + cisco.nxos.nxos_feature: &id004 + feature: telemetry + state: disabled + +- block: + + - name: Gather Telemetry Facts Before Changes + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - telemetry + + - name: Telemetry - merged + register: result + cisco.nxos.nxos_telemetry: &id002 + state: merged + config: + certificate: + key: /bootflash/server.key + hostname: localhost + compression: gzip + source_interface: '{{source_interface|default(omit)}}' + vrf: management + destination_groups: + + - id: 2 + destination: + ip: 192.168.0.1 + port: 50001 + protocol: grpc + encoding: gpb + + - id: 2 + destination: + ip: 192.168.0.2 + port: 60001 + protocol: gRPC + encoding: GPB + + - id: 10 + destination: + ip: 192.168.0.1 + port: 50001 + protocol: Grpc + encoding: gPB + + - id: 10 + destination: + ip: 192.168.0.2 + port: 60001 + protocol: gRPC + encoding: gpb + sensor_groups: + + - id: 8 + data_source: NX-API + path: + name: '"show bgp l2vpn evpn summary"' + depth: 0 + query_condition: foo + filter_condition: foo + + - id: 2 + data_source: NX-API + path: + name: '"show ip bgp neighbors"' + depth: unbounded + query_condition: foo + filter_condition: foo + + - id: 55 + data_source: DME + path: + name: sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11] + depth: 0 + query_condition: foo + filter_condition: foo + + - id: 55 + data_source: DME + path: + name: sys/ospf + depth: 0 + query_condition: foo + filter_condition: or(eq(ethpmPhysIf.operSt,"down"),eq(ethpmPhysIf.operSt,"up")) + subscriptions: + + - id: 44 + destination_group: 10 + sensor_group: + id: 8 + sample_interval: 2000 + + - id: 44 + destination_group: 2 + sensor_group: + id: 2 + sample_interval: 2000 + + - id: 55 + destination_group: 10 + sensor_group: + id: 55 + sample_interval: 2000 + + - assert: + that: + - result.changed == true + - result.before|length == 0 + - "'feature telemetry' in result.commands" + - "'telemetry' in result.commands" + - "'certificate /bootflash/server.key localhost' in result.commands" + - "'destination-profile' in result.commands" + - "'use-compression gzip' in result.commands" + - "'use-vrf management' in result.commands" + - "'destination-group 2' in result.commands" + - "'ip address 192.168.0.1 port 50001 protocol grpc encoding gpb' in result.commands" + - "'ip address 192.168.0.2 port 60001 protocol grpc encoding gpb' in result.commands" + - "'destination-group 10' in result.commands" + - "'ip address 192.168.0.1 port 50001 protocol grpc encoding gpb' in result.commands" + - "'ip address 192.168.0.2 port 60001 protocol grpc encoding gpb' in result.commands" + - "'sensor-group 8' in result.commands" + - "'data-source NX-API' in result.commands" + - result.commands is search("path .*show bgp l2vpn evpn summary.* depth + 0 query-condition foo filter-condition foo") + - "'sensor-group 2' in result.commands" + - "'data-source NX-API' in result.commands" + - result.commands is search("path .*show ip bgp neighbors.* depth unbounded + query-condition foo filter-condition foo") + - "'sensor-group 55' in result.commands" + - "'data-source DME' in result.commands" + - "'path sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11]\ + \ depth 0 query-condition foo filter-condition foo' in result.commands" + - "'path sys/ospf depth 0 query-condition foo filter-condition or(eq(ethpmPhysIf.operSt,\"\ + down\"),eq(ethpmPhysIf.operSt,\"up\"))' in result.commands" + - "'subscription 44' in result.commands" + - "'dst-grp 10' in result.commands" + - "'dst-grp 2' in result.commands" + - "'snsr-grp 8 sample-interval 2000' in result.commands" + - "'snsr-grp 2 sample-interval 2000' in result.commands" + - "'subscription 55' in result.commands" + - "'dst-grp 10' in result.commands" + - "'snsr-grp 55 sample-interval 2000' in result.commands" + - result.commands|length == {{ command_list_length }} + + - assert: + that: + - "'source-interface loopback55' in result.commands" + when: imagetag and (major_version is version_compare('9.1', 'ge')) + + - assert: + that: + - (ansible_facts.network_resources.telemetry|dict2items)|symmetric_difference(result.before|dict2items)|length + == 0 + + - name: Gather Telemetry Facts After Changes + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - (ansible_facts.network_resources.telemetry|dict2items)|symmetric_difference(result.after|dict2items)|length + == 0 + + - name: Telemetry - merged - idempotence + register: result + cisco.nxos.nxos_telemetry: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + + - name: Telemetry - change values + register: result + cisco.nxos.nxos_telemetry: &id003 + state: merged + config: + certificate: + key: /bootflash/local_server.key + hostname: localhost + compression: gzip + source_interface: '{{source_interface|default(omit)}}' + vrf: management + destination_groups: + + - id: 2 + destination: + ip: 192.168.0.1 + port: 50001 + protocol: grpc + encoding: gpb + + - id: 2 + destination: + ip: 192.168.0.2 + port: 60001 + protocol: gRPC + encoding: GPB + + - id: 10 + destination: + ip: 192.168.0.1 + port: 50001 + protocol: Grpc + encoding: gPB + + - id: 10 + destination: + ip: 192.168.0.2 + port: 60001 + protocol: gRPC + encoding: gpb + sensor_groups: + + - id: 8 + data_source: NX-API + path: + name: '"show bgp l2vpn evpn summary"' + depth: 0 + query_condition: foo + filter_condition: foo + + - id: 2 + data_source: NX-API + path: + name: '"show ip bgp neighbors"' + depth: unbounded + query_condition: foo + filter_condition: foo + + - id: 55 + data_source: DME + path: + name: sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11] + depth: 0 + query_condition: foo + filter_condition: foo + + - id: 55 + data_source: DME + path: + name: sys/ospf + depth: 0 + query_condition: foo + filter_condition: or(eq(ethpmPhysIf.operSt,"down"),eq(ethpmPhysIf.operSt,"up")) + subscriptions: + + - id: 44 + destination_group: 10 + sensor_group: + id: 8 + sample_interval: 1000 + + - id: 44 + destination_group: 2 + sensor_group: + id: 2 + sample_interval: 2000 + + - id: 55 + destination_group: 10 + sensor_group: + id: 55 + sample_interval: 2000 + + - set_fact: + test_list: + - telemetry + - certificate /bootflash/local_server.key localhost + - subscription 44 + - snsr-grp 8 sample-interval 1000 + + - assert: + that: + - result.changed == true + - test_list|symmetric_difference(result.commands)|length == 0 + + - name: Telemetry - change values - idempotent + register: result + cisco.nxos.nxos_telemetry: *id003 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: Teardown + ignore_errors: true + cisco.nxos.nxos_feature: *id004 + + - debug: msg="END connection={{ ansible_connection }} nxos_telemetry merged + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/replaced.yaml new file mode 100644 index 00000000..daa7e354 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_telemetry/tests/common/replaced.yaml @@ -0,0 +1,166 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_telemetry replaced + sanity test" + +- set_fact: source_interface="Loopback55" + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- set_fact: command_list_length=27 + +- set_fact: command_list_length=28 + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- set_fact: dict_facts_length=6 + +- set_fact: dict_facts_length=7 + when: imagetag and (major_version is version_compare('9.1', 'ge')) + +- name: Setup - disable feature telemetry + ignore_errors: true + cisco.nxos.nxos_feature: &id003 + feature: telemetry + state: disabled + +- name: Setup - enable feature telemetry + cisco.nxos.nxos_feature: + feature: telemetry + state: enabled + +- name: Setup - add initial telemetry config + cisco.nxos.nxos_config: + src: populate_config.cfg + +- name: Setup - add initial source-interface telemetry config + when: imagetag and (major_version is version_compare('9.1', 'ge')) + cisco.nxos.nxos_config: + lines: + - "telemetry" + - " destination-profile" + - " source-interface loopback55" + +- block: + + - name: Gather Telemetry Facts Before Changes + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - telemetry + + - name: Telemetry - replaced + register: result + cisco.nxos.nxos_telemetry: &id002 + state: replaced + config: + certificate: + key: /file_dir/new_server.key + hostname: newhost.example.com + vrf: management + compression: gzip + destination_groups: + + - id: 2 + destination: + ip: 192.168.0.1 + port: 65001 + protocol: grpc + encoding: gpb + + - id: 2 + destination: + ip: 192.168.0.3 + port: 55001 + protocol: grpc + encoding: gpb + sensor_groups: + + - id: 100 + data_source: NX-API + path: + name: '"show bgp l2vpn evpn summary"' + depth: unbounded + query_condition: foo + filter_condition: foo + subscriptions: + + - id: 99 + destination_group: 2 + sensor_group: + id: 100 + sample_interval: 2000 + + - assert: + that: + - result.changed == true + - result.before|length == {{ dict_facts_length }} + - result.before.certificate|length == 2 + - result.before.destination_groups|length == 7 + - result.before.sensor_groups|length == 8 + - result.before.subscriptions|length == 10 + - "'telemetry' in result.commands" + - "'no subscription 55' in result.commands" + - "'subscription 99' in result.commands" + - "'no dst-grp 99' in result.commands" + - "'no snsr-grp 8 sample-interval 90000' in result.commands" + - "'no snsr-grp 77 sample-interval 2000' in result.commands" + - "'no subscription 44' in result.commands" + - "'no sensor-group 55' in result.commands" + - "'no sensor-group 8' in result.commands" + - "'no sensor-group 2' in result.commands" + - "'no sensor-group 77' in result.commands" + - "'no destination-group 99' in result.commands" + - "'no destination-group 10' in result.commands" + - "'destination-group 2' in result.commands" + - "'no ip address 192.168.0.1 port 50001 protocol grpc encoding gpb' in\ + \ result.commands" + - "'no ip address 192.168.0.2 port 60001 protocol grpc encoding gpb' in\ + \ result.commands" + - "'destination-group 2' in result.commands" + - "'ip address 192.168.0.1 port 65001 protocol grpc encoding gpb' in result.commands" + - "'ip address 192.168.0.3 port 55001 protocol grpc encoding gpb' in result.commands" + - "'sensor-group 100' in result.commands" + - result.commands is search("path .*show bgp l2vpn evpn summary.* depth + unbounded query-condition foo filter-condition foo") + - "'data-source NX-API' in result.commands" + - "'subscription 99' in result.commands" + - "'snsr-grp 100 sample-interval 2000' in result.commands" + - "'certificate /file_dir/new_server.key newhost.example.com' in result.commands" + - "'destination-profile' in result.commands" + - "'use-vrf management' in result.commands" + - result.commands|length == {{ command_list_length }} + + - assert: + that: + - "'no source-interface loopback55' in result.commands" + when: imagetag and (major_version is version_compare('9.1', 'ge')) + + - assert: + that: + - (ansible_facts.network_resources.telemetry|dict2items)|symmetric_difference(result.before|dict2items)|length + == 0 + + - name: Gather Telemetry Facts After Changes + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - (ansible_facts.network_resources.telemetry|dict2items)|symmetric_difference(result.after|dict2items)|length + == 0 + + - name: Telemetry - replaced - idempotence + register: result + cisco.nxos.nxos_telemetry: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: Teardown + ignore_errors: true + cisco.nxos.nxos_feature: *id003 + + - debug: msg="END connection={{ ansible_connection }} nxos_telemetry replaced + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tests/common/sanity.yaml new file mode 100644 index 00000000..88f8c401 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld/tests/common/sanity.yaml @@ -0,0 +1,95 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_udld sanity test" + +- set_fact: udld_run="true" + +- set_fact: udld_run="false" + when: ((platform is search('N9K-F')) and (imagetag and (imagetag is version_compare('F3', + 'lt')))) + +- set_fact: udld_run="false" + when: titanium + +- block: + + - name: Enable feature udld + cisco.nxos.nxos_feature: + feature: udld + state: enabled + + - name: Configure udld + register: result + cisco.nxos.nxos_udld: &id001 + aggressive: enabled + msg_time: 20 + + - assert: &id002 + that: + - result.changed == true + + - name: Check Idempotence + register: result + cisco.nxos.nxos_udld: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Reset udld + cisco.nxos.nxos_udld: + reset: true + + - name: Configure udld2 + register: result + cisco.nxos.nxos_udld: &id003 + aggressive: disabled + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_udld: *id003 + + - assert: *id004 + + - name: Configure udld3 + register: result + cisco.nxos.nxos_udld: &id005 + msg_time: default + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_udld: *id005 + + - assert: *id004 + + - name: Configure udld again + register: result + cisco.nxos.nxos_udld: *id001 + + - assert: *id002 + + - name: Remove udld config + register: result + cisco.nxos.nxos_udld: &id006 + state: absent + + - assert: *id002 + + - name: Check Idempotence + register: result + cisco.nxos.nxos_udld: *id006 + + - assert: *id004 + when: udld_run + always: + + - name: Disable udld + ignore_errors: true + cisco.nxos.nxos_feature: + feature: udld + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_udld sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..ed1b46bc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_udld_interface/tests/common/sanity.yaml @@ -0,0 +1,113 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_udld_interface sanity + test" + +- set_fact: udld_run="true" + +- set_fact: udld_enable="true" + +- set_fact: udld_run="false" + when: ((platform is search('N9K-F')) and (imagetag and (imagetag is version_compare('F3', + 'lt')))) + +- set_fact: udld_run="false" + when: titanium + +- set_fact: udld_enable="false" + when: imagetag and (imagetag is version_compare('N1', 'eq')) + +- set_fact: intname="{{ nxos_int1 }}" + +- block: + + - name: Enable feature udld + cisco.nxos.nxos_feature: + feature: udld + state: enabled + + - name: put the interface into default state + cisco.nxos.nxos_config: + commands: + - default interface {{intname}} + match: none + + - name: ensure interface is configured to be in aggressive mode + register: result + cisco.nxos.nxos_udld_interface: &id001 + interface: '{{ intname }}' + mode: aggressive + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Conf1 Idempotence + register: result + cisco.nxos.nxos_udld_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - block: + + - name: ensure interface has mode enabled + register: result + cisco.nxos.nxos_udld_interface: &id003 + interface: '{{ intname }}' + mode: enabled + state: present + + - assert: *id002 + + - name: Conf2 Idempotence + register: result + cisco.nxos.nxos_udld_interface: *id003 + + - assert: *id004 + + - name: ensure interface has mode aggressive + register: result + cisco.nxos.nxos_udld_interface: *id001 + + - assert: *id002 + + - name: Conf1 Idempotence + register: result + cisco.nxos.nxos_udld_interface: *id001 + + - assert: *id004 + + - name: ensure interface has mode disabled + register: result + cisco.nxos.nxos_udld_interface: &id005 + interface: '{{ intname }}' + mode: disabled + state: present + + - assert: *id002 + + - name: Conf3 Idempotence + register: result + cisco.nxos.nxos_udld_interface: *id005 + + - assert: *id004 + when: udld_enable + + - name: Remove the config + cisco.nxos.nxos_udld_interface: + interface: '{{ intname }}' + mode: enabled + state: absent + when: udld_run + always: + + - name: Disable udld + ignore_errors: true + cisco.nxos.nxos_feature: + feature: udld + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_udld_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/meta/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/meta/main.yaml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/meta/main.yaml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/auth.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/auth.yaml new file mode 100644 index 00000000..b182282b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/auth.yaml @@ -0,0 +1,39 @@ +--- +- block: + + - name: Create user with password + cisco.nxos.nxos_user: + name: auth_user + role: network-operator + state: present + configured_password: pasS!123 + + - name: test login + expect: + command: ssh auth_user@{{ ansible_ssh_host }} -p {{ ansible_ssh_port|default(22) + }} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PubkeyAuthentication=no + show version + responses: + (?i)password: pasS!123 + + - name: test login with invalid password (should fail) + expect: + command: ssh auth_user@{{ ansible_ssh_host }} -p {{ ansible_ssh_port|default(22) + }} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PubkeyAuthentication=no + show version + responses: + (?i)password: badpass + ignore_errors: true + register: results + + - name: check that attempt failed + assert: + that: + - results.failed + always: + + - name: delete user + register: result + cisco.nxos.nxos_user: + name: auth_user + state: absent diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/basic.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/basic.yaml new file mode 100644 index 00000000..ce86b05d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/basic.yaml @@ -0,0 +1,143 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_user basic test" + +- name: Remove old entries of user + cisco.nxos.nxos_user: &rem + aggregate: + + - name: ansibletest1 + + - name: ansibletest2 + + - name: ansibletest3 + + - name: ansibletest_failed + + - name: ansibletest_warn + + - name: ansibletest_role + state: absent + +- name: Create user + register: result + cisco.nxos.nxos_user: + name: ansibletest1 + roles: network-operator + state: present + +- debug: msg="{{result}}" + +- assert: + that: + - result.changed == true + - '"username" in result.commands[0]' + - '"role network-operator" in result.commands[0]' + +- name: Collection of users + register: result + cisco.nxos.nxos_user: + aggregate: + + - name: ansibletest2 + + - name: ansibletest3 + state: present + roles: network-admin + +- assert: + that: + - result.changed == true + +- cisco.nxos.nxos_command: + commands: show password strength-check + register: pwd + +- set_fact: + pwdchck: "{{ True if pwd is search('enabled') else False }}" + +- name: Enable password check (if disabled by default) for failure test + cisco.nxos.nxos_config: &enable + lines: password strength-check + when: not pwdchck + +- name: Attempt to create user with weak password with pwd check enabled (SHOULD FAIL) + cisco.nxos.nxos_user: + name: ansibletest_failed + configured_password: abc + register: result + ignore_errors: True + +- assert: + that: + - result.failed == True + - result.msg is search('Wrong Password') + +- name: Disable password check (will be always enabled at this stage) for warnings test + cisco.nxos.nxos_config: + lines: no password strength-check + +- name: Attempt to create user with weak password without pwd check enabled (SHOULD WARN) + cisco.nxos.nxos_user: + name: ansibletest_warn + configured_password: abc + register: result + +- assert: + that: + - result.changed == True + - result.failed == False + - '"Minimum recommended length of 8 characters" in result.warnings[1]' + - '"Password should contain characters from at least three of the following classes:" in result.warnings[2]' + - '"it is WAY too short" in result.warnings[3]' + - '"Configuration accepted because password strength check is disabled" in result.warnings[4]' + +- name: Enable password check (if that was the default) + cisco.nxos.nxos_config: *enable + when: pwdchck + +- name: Create a custom role + cisco.nxos.nxos_config: + lines: + - role name customrole + +- name: Attempt to create a user with a valid custom role + cisco.nxos.nxos_user: + name: ansibletest_role + role: customrole + state: present + register: result + +- assert: + that: + - result.changed == True + - result.failed == False + - '"username ansibletest_role role customrole" in result.commands' + +- name: Attempt to create user with invalid role (should fail) + cisco.nxos.nxos_user: + name: ansibletest_role + role: invalid_role + state: present + register: result + ignore_errors: True + +- assert: + that: + - result.failed == True + - '"invalid role specified" in result.msg' + +- name: tearDown + register: result + cisco.nxos.nxos_user: *rem + +- assert: + that: + - result.changed == true + - '"no username" in result.commands[0]' + +- name: Delete custom role + cisco.nxos.nxos_config: + lines: + - no role name customrole + +- debug: msg="END connection={{ ansible_connection }} nxos_user basic test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/net_user.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/net_user.yaml new file mode 100644 index 00000000..fe86710b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/net_user.yaml @@ -0,0 +1,27 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos common/net_user.yaml" + +- name: Remove old entries of user - setup + ansible.netcommon.net_user: + name: ansibletest1 + state: absent + +- name: Create user with platform agnostic module + register: result + ansible.netcommon.net_user: + name: ansibletest1 + roles: network-operator + state: present + +- assert: + that: + - result.changed == true + - '"username" in result.commands[0]' + - '"role network-operator" in result.commands[0]' + +- name: teardown + ansible.netcommon.net_user: + name: ansibletest1 + state: absent + +- debug: msg="END connection={{ ansible_connection }} nxos common/net_user.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/sanity.yaml new file mode 100644 index 00000000..d48439b8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_user/tests/common/sanity.yaml @@ -0,0 +1,99 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_user parameter test" + +- set_fact: idem="true" + +- set_fact: idem="false" + when: ((platform is search('N7K')) and (imagetag and (imagetag is version_compare('D1', + 'eq')))) + +- block: + + - name: Create user + register: result + cisco.nxos.nxos_user: &id001 + name: netend + configured_password: Hello!23$ + update_password: on_create + roles: network-operator + state: present + + - assert: &id002 + that: + - result.changed == true + + - block: + + - name: conf idempotency + register: result + cisco.nxos.nxos_user: *id001 + + - assert: &id004 + that: + - result.changed == false + when: idem + + - name: Remove user + register: result + cisco.nxos.nxos_user: &id003 + name: netend + state: absent + + - assert: *id002 + + - name: remove idempotency + register: result + cisco.nxos.nxos_user: *id003 + + - assert: *id004 + + - debug: msg="skipping sshkey test as the key needs to be created on the server + first" + + - name: Collection of users + register: result + cisco.nxos.nxos_user: &id005 + users: + + - name: test1 + + - name: test2 + configured_password: Hello!23$ + update_password: on_create + state: present + roles: + - network-admin + - network-operator + + - assert: *id002 + + - block: + + - name: users idempotency + register: result + cisco.nxos.nxos_user: *id005 + + - assert: *id004 + when: idem + + - name: tearDown + register: result + cisco.nxos.nxos_user: &id006 + name: '{{ ansible_user }}' + purge: true + + - assert: *id002 + + - name: teardown idempotency + register: result + cisco.nxos.nxos_user: *id006 + + - assert: *id004 + always: + + - name: tearDown + register: result + ignore_errors: true + cisco.nxos.nxos_user: *id006 + +- debug: msg="END connection={{ ansible_connection }} nxos_user parameter test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/agg.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/agg.yaml new file mode 100644 index 00000000..dedc1b61 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/agg.yaml @@ -0,0 +1,123 @@ +--- +- debug: msg="START connection={{ ansible_connection }}/agg.yaml" + +- name: setup - remove vlan used in test + ignore_errors: true + cisco.nxos.nxos_config: &id005 + lines: + - no vlan 102 + - no vlan 103 + - no vlan 104 + +- name: configure vlan with aggregate + register: result + cisco.nxos.nxos_vlan: &id001 + aggregate: + + - name: app02 + vlan_id: 102 + + - name: app03 + vlan_id: 103 + vlan_state: active + admin_state: up + +- assert: + that: + - result.changed == true + - '"vlan 102" in result.commands' + - '"vlan 103" in result.commands' + - '"no shutdown" in result.commands' + - '"state active" in result.commands' + +- name: conf1 - Idempotence + register: result + cisco.nxos.nxos_vlan: *id001 + +- assert: + that: + - result.changed == false + +- name: change property of existing vlan - admin_state down + register: result + cisco.nxos.nxos_vlan: &id002 + aggregate: + + - name: app02 + vlan_id: 102 + + - name: app03 + vlan_id: 103 + vlan_state: active + admin_state: down + +- assert: + that: + - result.changed == true + - '"vlan 102" in result.commands' + - '"vlan 103" in result.commands' + - '"shutdown" in result.commands' + +- name: conf2 - Idempotence + register: result + cisco.nxos.nxos_vlan: *id002 + +- assert: + that: + - result.changed == false + +- name: purge + register: result + cisco.nxos.nxos_vlan: &id003 + vlan_id: 1 + purge: true + +- assert: + that: + - result.changed == true + - '"no vlan 102" in result.commands' + - '"no vlan 103" in result.commands' + +- name: purge - Idempotence + register: result + cisco.nxos.nxos_vlan: *id003 + +- assert: + that: + - result.changed == false + +- name: setup for purge test with aggregate add + cisco.nxos.nxos_vlan: + vlan_id: 104 + purge: true + +- name: purge 104 with aggregate add 102-103 + register: result + cisco.nxos.nxos_vlan: &id004 + aggregate: + + - vlan_id: 102 + + - vlan_id: 103 + purge: true + +- assert: + that: + - result.changed == true + - '"vlan 102" in result.commands' + - '"vlan 103" in result.commands' + - '"no vlan 104" in result.commands' + +- name: purge_add - Idempotence + register: result + cisco.nxos.nxos_vlan: *id004 + +- assert: + that: + - result.changed == false + +- name: teardown + ignore_errors: true + cisco.nxos.nxos_config: *id005 + +- debug: msg="END connection={{ ansible_connection }}/agg.yaml" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/interface.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/interface.yaml new file mode 100644 index 00000000..2191cc77 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/interface.yaml @@ -0,0 +1,125 @@ +--- +- set_fact: testint1="{{ nxos_int1 }}" + +- set_fact: testint2="{{ nxos_int2 }}" + +- name: setup - remove vlan used in test + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vlan 100 + +- name: setup - remove vlan from interfaces used in test(part1) + cisco.nxos.nxos_config: + lines: + - no switchport access vlan 100 + parents: switchport + before: interface {{ testint1 }} + +- name: setup - remove vlan from interfaces used in test(part2) + cisco.nxos.nxos_config: + lines: + - no switchport access vlan 100 + parents: switchport + before: interface {{ testint2 }} + +- name: create vlan + cisco.nxos.nxos_vlan: + vlan_id: 100 + +- name: Add interfaces to vlan and check intent (config + intent) + register: result + cisco.nxos.nxos_vlan: &id001 + vlan_id: 100 + interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + associated_interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + +- assert: + that: + - result.changed == true + - '"interface {{ testint1 }}" in result.commands' + - '"switchport" in result.commands' + - '"switchport mode access" in result.commands' + - '"switchport access vlan 100" in result.commands' + - '"interface {{ testint2 }}" in result.commands' + - '"switchport" in result.commands' + - '"switchport mode access" in result.commands' + - '"switchport access vlan 100" in result.commands' + +- name: Add interfaces to vlan(idempotence) + register: result + cisco.nxos.nxos_vlan: *id001 + +- assert: + that: + - result.changed == false + +- name: Check interfaces intent + register: result + cisco.nxos.nxos_vlan: + vlan_id: 100 + associated_interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + +- assert: + that: + - result.failed == false + +- name: Check interfaces intent fail + register: result + ignore_errors: true + cisco.nxos.nxos_vlan: + vlan_id: 100 + associated_interfaces: + - test + +- assert: + that: + - result.failed == True + +- name: Remove interface from vlan + register: result + cisco.nxos.nxos_vlan: &id002 + vlan_id: 100 + interfaces: + - '{{ testint2 }}' + +- assert: + that: + - result.changed == true + - '"interface {{ testint1 }}" in result.commands' + - '"switchport" in result.commands' + - '"switchport mode access" in result.commands' + - '"no switchport access vlan 100" in result.commands' + +- name: Remove interface from vlan(idempotence) + register: result + cisco.nxos.nxos_vlan: *id002 + +- assert: + that: + - result.changed == false + +- name: teardown(part1) + cisco.nxos.nxos_config: + lines: + - no vlan 100 + +- name: teardown - remove vlan from interfaces used in test(part1) + cisco.nxos.nxos_config: + lines: + - no switchport access vlan 100 + parents: switchport + before: interface {{ testint1 }} + +- name: teardown - remove vlan from interfaces used in test(part2) + cisco.nxos.nxos_config: + lines: + - no switchport access vlan 100 + parents: switchport + before: interface {{ testint2 }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/sanity.yaml new file mode 100644 index 00000000..82799b1b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlan/tests/common/sanity.yaml @@ -0,0 +1,226 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vlan sanity test" + +- set_fact: testint1="{{ nxos_int1 }}" + +- set_fact: testint2="{{ nxos_int2 }}" + +- block: + + - name: Install and Enable FabricPath feature set + when: platform is search('N5K|N7K') + cisco.nxos.nxos_config: + lines: + - install feature-set fabricpath + - feature-set fabricpath + + - name: Enable feature vn segment + when: platform is search('N9K') + cisco.nxos.nxos_config: + commands: + - feature vn-segment-vlan-based + match: none + + - name: vlan teardown + ignore_errors: true + cisco.nxos.nxos_vlan: &id013 + vlan_range: 2-200 + state: absent + + - name: Ensure a range of VLANs are present on the switch + register: result + cisco.nxos.nxos_vlan: &id001 + vlan_range: 2-10,20,50,55-60,100-150 + + - assert: &id002 + that: + - result.changed == true + + - name: Vlan Idempotence + register: result + cisco.nxos.nxos_vlan: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state + register: result + when: platform is search('N9K') + cisco.nxos.nxos_vlan: &id003 + vlan_id: 50 + vlan_state: suspend + admin_state: down + name: WEB + mapped_vni: 5555 + + - assert: *id002 + when: platform is search('N9K') + + - name: web1 Idempotence + register: result + when: platform is search('N9K') + cisco.nxos.nxos_vlan: *id003 + + - assert: *id004 + when: platform is search('N9K') + + - name: change name and vni to default + register: result + when: platform is search('N9K') + cisco.nxos.nxos_vlan: &id005 + vlan_id: 50 + vlan_state: active + admin_state: up + name: default + mapped_vni: default + + - assert: *id002 + when: platform is search('N9K') + + - name: web2 Idempotence + register: result + when: platform is search('N9K') + cisco.nxos.nxos_vlan: *id005 + + - assert: *id004 + when: platform is search('N9K') + + - name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state + register: result + when: platform is search('N3K|N7K') + cisco.nxos.nxos_vlan: &id006 + vlan_id: 50 + vlan_state: suspend + admin_state: down + name: WEB + + - assert: *id002 + when: platform is search('N3K|N7K') + + - name: web3 Idempotence + register: result + when: platform is search('N3K|N7K') + cisco.nxos.nxos_vlan: *id006 + + - assert: *id004 + when: platform is search('N3K|N7K') + + - name: Change name to default + register: result + when: platform is search('N3K|N7K') + cisco.nxos.nxos_vlan: &id007 + vlan_id: 50 + vlan_state: active + admin_state: up + name: default + + - assert: *id002 + when: platform is search('N3K|N7K') + + - name: web4 Idempotence + register: result + when: platform is search('N3K|N7K') + cisco.nxos.nxos_vlan: *id007 + + - assert: *id004 + when: platform is search('N3K|N7K') + + - name: Change mode + register: result + when: platform is search('N5K|N7K') + cisco.nxos.nxos_vlan: &id008 + vlan_id: 50 + mode: fabricpath + + - assert: *id002 + when: platform is search('N5K|N7K') + + - name: mode1 Idempotence + register: result + when: platform is search('N5K|N7K') + cisco.nxos.nxos_vlan: *id008 + + - assert: *id004 + when: platform is search('N5K|N7K') + + - name: Change mode again + register: result + when: platform is search('N5K|N7K') + cisco.nxos.nxos_vlan: &id009 + vlan_id: 50 + mode: ce + + - assert: *id002 + when: platform is search('N5K|N7K') + + - name: mode2 Idempotence + register: result + when: platform is search('N5K|N7K') + cisco.nxos.nxos_vlan: *id009 + + - assert: *id004 + when: platform is search('N5K|N7K') + + - name: Ensure VLAN is NOT on the device + register: result + cisco.nxos.nxos_vlan: &id010 + vlan_id: 50 + state: absent + + - assert: *id002 + + - name: no vlan Idempotence + register: result + cisco.nxos.nxos_vlan: *id010 + + - assert: *id004 + + - name: Add interfaces to vlan + register: result + cisco.nxos.nxos_vlan: &id011 + vlan_id: 101 + vlan_state: suspend + interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + + - assert: *id002 + + - name: Addint idempotence + register: result + cisco.nxos.nxos_vlan: *id011 + + - assert: *id004 + + - name: Remove interfaces from vlan + register: result + cisco.nxos.nxos_vlan: &id012 + vlan_id: 101 + interfaces: default + + - assert: *id002 + + - name: Remint idempotence + register: result + cisco.nxos.nxos_vlan: *id012 + + - assert: *id004 + always: + + - name: Remove int from vlan + ignore_errors: true + cisco.nxos.nxos_vlan: *id012 + + - name: vlan teardown final + ignore_errors: true + cisco.nxos.nxos_vlan: *id013 + + - name: Disable feature vn segement + ignore_errors: true + when: platform is search('N9K') + cisco.nxos.nxos_feature: + feature: vn-segment-vlan-based + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vlan sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/defaults/main.yaml new file mode 100644 index 00000000..2a2672be --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '[^_].*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/fixtures/parsed.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/fixtures/parsed.cfg new file mode 100644 index 00000000..8d3631d2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/fixtures/parsed.cfg @@ -0,0 +1,67 @@ +{ + "TABLE_vlanbrief": { + "ROW_vlanbrief": [ + { + "vlanshowbr-vlanid": "1", + "vlanshowbr-vlanid-utf": "1", + "vlanshowbr-vlanname": "default", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { + "vlanshowbr-vlanid": "5", + "vlanshowbr-vlanid-utf": "5", + "vlanshowbr-vlanname": "vlan5", + "vlanshowbr-vlanstate": "suspend", + "vlanshowbr-shutstate": "noshutdown" + }, + { + "vlanshowbr-vlanid": "6", + "vlanshowbr-vlanid-utf": "6", + "vlanshowbr-vlanname": "VLAN0006", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { + "vlanshowbr-vlanid": "7", + "vlanshowbr-vlanid-utf": "7", + "vlanshowbr-vlanname": "vlan7", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + } + ] + }, + "TABLE_mtuinfo": { + "ROW_mtuinfo": [ + { + "vlanshowinfo-vlanid": "1", + "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" + }, + { + "vlanshowinfo-vlanid": "5", + "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" + }, + { + "vlanshowinfo-vlanid": "6", + "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" + }, + { + "vlanshowinfo-vlanid": "7", + "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" + } + ] + } +} + + +vlan 1,5-7 +vlan 5 + state suspend + name vlan5 +vlan 7 + name vlan7 + vn-segment 100 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/meta/main.yml new file mode 100644 index 00000000..23d65c7e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/meta/main.yml @@ -0,0 +1,2 @@ +--- +dependencies: [] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/cli.yaml new file mode 100644 index 00000000..073787b3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + use_regex: True + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_populate_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_populate_config.yaml new file mode 100644 index 00000000..47adc63a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_populate_config.yaml @@ -0,0 +1,13 @@ +- name: Populate config + cisco.nxos.nxos_config: + lines: + - "feature vn-segment-vlan-based" + - "vlan 5" + - "name vlan5" + - "state suspend" + - "vlan 6" + - "state active" + - "vlan 7" + - "name vlan7" + - "vn-segment 190" + - "shutdown" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_remove_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_remove_config.yaml new file mode 100644 index 00000000..9dba2816 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/_remove_config.yaml @@ -0,0 +1,6 @@ +- name: Remove Config + cisco.nxos.nxos_config: + lines: + - "no vlan 2-100" + - "no feature vn-segment-vlan-based" + ignore_errors: True diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/deleted.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/deleted.yaml new file mode 100644 index 00000000..d0daa3b9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/deleted.yaml @@ -0,0 +1,53 @@ +--- +- debug: + msg: Start nxos_vlans deleted integration tests connection={{ ansible_connection + }} + +- name: setup + cisco.nxos.nxos_config: + lines: + - "no vlan 2-100" + - "vlan 5" + - "vlan 6" + +- block: + + - name: Gather vlans facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: vlans + + - name: deleted + register: result + cisco.nxos.nxos_vlans: &id001 + config: + - vlan_id: 5 + - vlan_id: 6 + state: deleted + + - assert: + that: + - result.before|length == ansible_facts.network_resources.vlans|length + - result.after|length == 1 + - result.changed == true + - "'no vlan 5' in result.commands" + - "'no vlan 6' in result.commands" + - result.commands|length == 2 + + - name: Idempotence - deleted + register: result + cisco.nxos.nxos_vlans: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: + lines: + - "no vlan 5" + - "no vlan 6" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/empty_config.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/empty_config.yaml new file mode 100644 index 00000000..11680d9c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/empty_config.yaml @@ -0,0 +1,62 @@ +--- +- debug: + msg: START nxos_vlans empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_vlans: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_vlans: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_vlans: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_vlans: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' + + +- name: Parsed with empty config should give appropriate error message + register: result + ignore_errors: true + cisco.nxos.nxos_vlans: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- debug: + msg: END nxos_vlans empty_config integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/gathered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/gathered.yaml new file mode 100644 index 00000000..ce7474c6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: + msg: START nxos_vlans gathered integration tests on connection={{ ansible_connection + }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + + - name: Gather vlans facts from the device using nxos_vlans + register: result + cisco.nxos.nxos_vlans: + state: gathered + + - assert: + that: "{{ result['gathered'] | symmetric_difference(gathered)\ + \ |length == 0 }}" + always: + + - include_tasks: _remove_config.yaml + + - debug: + msg: END nxos_vlans gathered integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/merged.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/merged.yaml new file mode 100644 index 00000000..8a2669e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/merged.yaml @@ -0,0 +1,60 @@ +--- +- debug: + msg: Start nxos_vlans merged integration tests connection={{ ansible_connection + }} + +- name: setup + cisco.nxos.nxos_config: &id002 + lines: + - "no vlan 2-100" + +- block: + + - name: Merged + register: result + cisco.nxos.nxos_vlans: &id001 + config: + + - vlan_id: 5 + name: vlan5 + + - vlan_id: 6 + name: vlan6 + state: suspend + state: merged + + - assert: + that: + - result.changed == true + # default vlan + - result.before|length == 1 + - "'vlan 5' in result.commands" + - "'name vlan5' in result.commands" + - "'vlan 6' in result.commands" + - "'name vlan6' in result.commands" + - "'state suspend' in result.commands" + - result.commands|length == 5 + + - name: Gather vlans facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: vlans + + - assert: + that: + - result.after|length == ansible_facts.network_resources.vlans|length + + - name: Idempotence - Merged + register: result + cisco.nxos.nxos_vlans: *id001 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/overridden.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/overridden.yaml new file mode 100644 index 00000000..2f8a1c65 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/overridden.yaml @@ -0,0 +1,71 @@ +--- +- debug: + msg: Start nxos_vlans overridden integration tests connection={{ ansible_connection + }} + +- name: setup1 + cisco.nxos.nxos_config: &id003 + lines: + - "no vlan 2-100" + +- block: + + - name: setup + cisco.nxos.nxos_config: + lines: + - "vlan 5" + - " name test-vlan5" + - " state suspend" + - "vlan 6" + + - name: Gather vlans facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: vlans + + - name: Set default vlan (vlan1) config and config to revert + set_fact: + default_vlan: "{{ ansible_facts.network_resources.vlans|selectattr('vlan_id', 'equalto', 1)|list }}" + config_to_override: + - vlan_id: 9 + name: test-vlan9 + enabled: false + + - name: Overridden + register: result + cisco.nxos.nxos_vlans: &id002 + config: "{{ default_vlan + config_to_override }}" + state: overridden + + - assert: + that: + - result.before|length == ansible_facts.network_resources.vlans|length + - result.changed == true + - "'no vlan 5' in result.commands" + - "'no vlan 6' in result.commands" + - "'vlan 9' in result.commands" + - "'name test-vlan9' in result.commands" + - "'shutdown' in result.commands" + - result.commands|length == 5 + + - name: Gather vlans post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - result.after|length == ansible_facts.network_resources.vlans|length + + - name: Idempotence - Overridden + register: result + cisco.nxos.nxos_vlans: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/parsed.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/parsed.yaml new file mode 100644 index 00000000..928a48db --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/parsed.yaml @@ -0,0 +1,19 @@ +--- +- debug: + msg: START nxos_vlans parsed integration tests on connection={{ ansible_connection + }} + +- block: + - name: Use parsed state to convert externally supplied config to structured format + register: result + cisco.nxos.nxos_vlans: + running_config: "{{ lookup('file', '{{ role_path }}/fixtures/parsed.cfg') }}" + state: parsed + + - assert: + that: "{{ parsed | symmetric_difference(result['parsed']) |length==0\ + \ }}" + +- debug: + msg: END nxos_vlans parsed integration tests on connection={{ ansible_connection + }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rendered.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rendered.yaml new file mode 100644 index 00000000..077480b8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rendered.yaml @@ -0,0 +1,44 @@ +--- +- debug: + msg: START nxos_vlans rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- name: Gather pre facts + cisco.nxos.nxos_facts: + gather_subset: ['!all', '!min'] + gather_network_resources: "vlans" + +- block: + - name: Use rendered state to convert task input to device specific commands + register: result + cisco.nxos.nxos_vlans: + config: + - vlan_id: 5 + name: vlan5 + mapped_vni: 100 + + - vlan_id: 6 + name: vlan6 + state: suspend + state: rendered + + - assert: + that: "{{ rendered | symmetric_difference(result['rendered'])\ + \ |length==0 }}" + + - name: Gather vlans facts from the device and assert that its empty + register: result + cisco.nxos.nxos_vlans: + state: gathered + + - name: Make sure that rendered task actually did not make any changes to the + device + assert: + that: "{{ result['gathered'] == ansible_facts['network_resources']['vlans'] }}" + always: + + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_vlans rendered integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/replaced.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/replaced.yaml new file mode 100644 index 00000000..d7905671 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/replaced.yaml @@ -0,0 +1,64 @@ +--- +- debug: + msg: Start nxos_vlans replaced integration tests connection={{ ansible_connection + }} + +- name: setup1 + cisco.nxos.nxos_config: &id003 + lines: + - "no vlan 2-100" + +- block: + + - name: setup2 + cisco.nxos.nxos_config: + lines: + - "vlan 5" + - " name test-vlan5" + - "vlan 6" + - " name test-vlan6" + + - name: Gather vlans facts + cisco.nxos.nxos_facts: &id001 + gather_subset: + - '!all' + - '!min' + gather_network_resources: vlans + + - name: Replaced + register: result + cisco.nxos.nxos_vlans: &id002 + config: + + - vlan_id: 6 + state: suspend + state: replaced + + - assert: + that: + - result.before|length == ansible_facts.network_resources.vlans|length + - result.changed == true + - "'vlan 6' in result.commands" + - "'no name' in result.commands" + - "'state suspend' in result.commands" + - result.commands|length == 3 + + - name: Gather vlans post facts + cisco.nxos.nxos_facts: *id001 + + - assert: + that: + - result.after|length == ansible_facts.network_resources.vlans|length + + - name: Idempotence - Replaced + register: result + cisco.nxos.nxos_vlans: *id002 + + - assert: + that: + - result.changed == false + - result.commands|length == 0 + always: + + - name: teardown + cisco.nxos.nxos_config: *id003 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rtt.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rtt.yaml new file mode 100644 index 00000000..ed328717 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/tests/common/rtt.yaml @@ -0,0 +1,65 @@ +--- +- debug: + msg: START nxos_vlans round trip integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: Apply the provided configuration (Base config) + register: base_config + cisco.nxos.nxos_vlans: + config: + - vlan_id: 2 + name: test-vlan2 + enabled: false + - vlan_id: 4 + name: test-vlan3 + enabled: true + state: active + state: merged + tags: base_config + + - name: Gather VLANs facts + cisco.nxos.nxos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - 'vlans' + + - name: Set default vlan (vlan1) config and config to revert + set_fact: + default_vlan: "{{ ansible_facts.network_resources.vlans|selectattr('vlan_id', 'equalto', 1)|list }}" + config_to_revert: + - vlan_id: 3 + name: test-vlan3 + enabled: true + state: suspend + - vlan_id: 5 + name: test-vlan5 + enabled: false + + - name: Apply the provided configuration (config to be reverted) + register: result + cisco.nxos.nxos_vlans: + config: "{{ config_to_revert + default_vlan }}" + state: overridden + + - assert: + that: + - result.changed == true + + - name: Revert back to base config using facts round trip + register: revert + cisco.nxos.nxos_vlans: + config: "{{ ansible_facts['network_resources']['vlans'] }}" + state: overridden + + - assert: + that: + - base_config['after'] == revert['after'] + always: + - include_tasks: _remove_config.yaml + +- debug: + msg: END nxos_vlans round trip integration tests on connection={{ ansible_connection }} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/vars/main.yml new file mode 100644 index 00000000..bb73df45 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vlans/vars/main.yml @@ -0,0 +1,57 @@ +gathered: + - vlan_id: 1 + enabled: True + mode: "ce" + state: active + name: default + + - vlan_id: 5 + enabled: True + mode: "ce" + name: "vlan5" + state: suspend + + - vlan_id: 6 + enabled: True + mode: "ce" + state: active + + - vlan_id: 7 + enabled: False + mode: "ce" + name: "vlan7" + state: active + mapped_vni: 190 + +parsed: + - vlan_id: 1 + enabled: True + mode: "ce" + state: active + name: default + + - vlan_id: 5 + enabled: True + mode: "ce" + name: "vlan5" + state: suspend + + - vlan_id: 6 + enabled: True + mode: "ce" + state: active + + - vlan_id: 7 + enabled: True + mode: "ce" + name: "vlan7" + state: active + mapped_vni: 100 + +rendered: + - vlan 5 + - name vlan5 + - vn-segment 100 + - vlan 6 + - name vlan6 + - state suspend diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tests/common/sanity.yaml new file mode 100644 index 00000000..476cc301 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc/tests/common/sanity.yaml @@ -0,0 +1,181 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vpc sanity test" + +- block: + + - set_fact: delay_restore_orphan_port=25 + + - set_fact: def_delay_restore_orphan_port=default + when: platform is not search("N35|N5K|N6K") + +- block: + + - name: disable vpc for initial vpc config cleanup + cisco.nxos.nxos_feature: + feature: vpc + state: disabled + + - name: enable feature vpc + cisco.nxos.nxos_feature: + feature: vpc + state: enabled + + - name: Ensure ntc VRF exists on switch + cisco.nxos.nxos_vrf: + vrf: ntc + + - name: Configure vpc + register: result + cisco.nxos.nxos_vpc: &id001 + state: present + domain: 100 + pkl_dest: 192.168.100.4 + pkl_src: 10.1.100.20 + pkl_vrf: ntc + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vpc: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure vpc1 + register: result + cisco.nxos.nxos_vpc: &id003 + state: present + domain: 100 + role_priority: 500 + system_priority: 2000 + peer_gw: true + delay_restore: 5 + delay_restore_interface_vlan: 15 + delay_restore_orphan_port: '{{ delay_restore_orphan_port|default(omit) }}' + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vpc: *id003 + + - assert: *id004 + + - block: + + - set_fact: def_auto_recovery=False + + - set_fact: def_auto_recovery=True + when: platform is search("N7K") + + - name: auto-recovery from default to non-default + register: result + cisco.nxos.nxos_vpc: &id005 + domain: 100 + auto_recovery: '{{ not def_auto_recovery }}' + + - assert: *id002 + + - name: Conf Idempotence auto-recovery def-to-non-def + register: result + cisco.nxos.nxos_vpc: *id005 + + - assert: *id004 + + - name: auto-recovery from non-default to default + register: result + cisco.nxos.nxos_vpc: &id006 + domain: 100 + auto_recovery: '{{ def_auto_recovery }}' + + - assert: *id002 + + - name: Conf Idempotence auto-recovery non-def-to-def + register: result + cisco.nxos.nxos_vpc: *id006 + + - assert: *id004 + when: platform is search("N35|N7K|N3K-F|N9K-F") + + - name: Configure auto-recovery reload-delay + register: result + cisco.nxos.nxos_vpc: &id007 + domain: 100 + auto_recovery_reload_delay: 242 + + - assert: *id002 + + - name: Conf Idempotence auto-recovery reload-delay + register: result + cisco.nxos.nxos_vpc: *id007 + + - assert: *id004 + + - name: Configure vpc2 + register: result + cisco.nxos.nxos_vpc: &id008 + state: present + domain: 100 + role_priority: default + system_priority: default + peer_gw: true + delay_restore: default + delay_restore_interface_vlan: default + delay_restore_orphan_port: '{{ def_delay_restore_orphan_port|default(omit) + }}' + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vpc: *id008 + + - assert: *id004 + + - name: Configure vpc3 + register: result + cisco.nxos.nxos_vpc: &id009 + state: present + domain: 100 + peer_gw: false + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vpc: *id009 + + - assert: *id004 + + - name: remove vpc + register: result + cisco.nxos.nxos_vpc: &id010 + state: absent + domain: 100 + + - assert: *id002 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vpc: *id010 + + - assert: *id004 + always: + + - name: remove vrf + ignore_errors: true + cisco.nxos.nxos_vrf: + vrf: ntc + state: absent + + - name: disable feature vpc + ignore_errors: true + cisco.nxos.nxos_feature: + feature: vpc + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vpc sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..64c00a89 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vpc_interface/tests/common/sanity.yaml @@ -0,0 +1,140 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vpc_interface sanity + test" + +- block: + + - name: enable feature vpc + cisco.nxos.nxos_feature: + feature: vpc + state: enabled + + - name: create port-channel10 + cisco.nxos.nxos_config: + commands: + - interface port-channel10 + - switchport + match: none + + - name: create port-channel11 + cisco.nxos.nxos_config: + commands: + - interface port-channel11 + - switchport + match: none + + - name: configure vpc + cisco.nxos.nxos_vpc: + state: present + domain: 100 + role_priority: 32667 + system_priority: 2000 + pkl_dest: 192.168.100.4 + pkl_src: 10.1.100.20 + peer_gw: true + auto_recovery: false + + - name: Configure vpc port channel + register: result + cisco.nxos.nxos_vpc_interface: &id001 + portchannel: 10 + vpc: 10 + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vpc_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure vpc port channel + register: result + when: image_version != "7.0(3)I5(1)" + cisco.nxos.nxos_vpc_interface: &id003 + portchannel: 11 + peer_link: true + + - assert: *id002 + when: image_version != "7.0(3)I5(1)" + + - name: Conf Idempotence + register: result + when: image_version != "7.0(3)I5(1)" + cisco.nxos.nxos_vpc_interface: *id003 + + - assert: *id004 + when: image_version != "7.0(3)I5(1)" + + - name: Configure vpc port channel + register: result + when: image_version != "7.0(3)I5(1)" + cisco.nxos.nxos_vpc_interface: &id005 + portchannel: 11 + peer_link: false + + - assert: *id002 + when: image_version != "7.0(3)I5(1)" + + - name: Conf Idempotence + register: result + when: image_version != "7.0(3)I5(1)" + cisco.nxos.nxos_vpc_interface: *id005 + + - assert: *id004 + when: image_version != "7.0(3)I5(1)" + + - name: remove vpc port channel + register: result + cisco.nxos.nxos_vpc_interface: &id006 + portchannel: 10 + vpc: 10 + state: absent + + - assert: *id002 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vpc_interface: *id006 + + - assert: *id004 + always: + + - name: remove vpc + ignore_errors: true + cisco.nxos.nxos_vpc: + state: absent + domain: 100 + role_priority: 32667 + system_priority: 2000 + pkl_dest: 192.168.100.4 + pkl_src: 10.1.100.20 + peer_gw: true + auto_recovery: false + + - name: remove vpc port channel + ignore_errors: true + cisco.nxos.nxos_vpc_interface: + portchannel: 10 + vpc: 10 + state: absent + + - name: remove port channel + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no interface port-channel10 + - no interface port-channel11 + match: none + + - name: disable feature vpc + cisco.nxos.nxos_feature: + feature: vpc + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vpc_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/intent.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/intent.yaml new file mode 100644 index 00000000..2aeaeb56 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/intent.yaml @@ -0,0 +1,196 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vrf intent & aggregate + test" + +- set_fact: testint1="{{ nxos_int1 }}" + +- set_fact: testint2="{{ nxos_int2 }}" + +- name: setup - remove vrf from interfaces used in test(part1) + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf member test1 + parents: no switchport + before: interface {{ testint1 }} + +- name: setup - remove vrf from interfaces used in test(part2) + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf member test1 + parents: no switchport + before: interface {{ testint2 }} + +- name: setup - delete VRF test1 used in test + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf context test1 + +- name: setup - remove VRF test2 used in test + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf context test2 + +- name: aggregate definitions of VRFs + register: result + cisco.nxos.nxos_vrf: &id001 + aggregate: + + - name: test1 + description: Configured by Ansible + + - name: test2 + description: Testing + admin_state: down + +- assert: + that: + - result.changed == true + - '"vrf context test1" in result.commands' + - '"description Configured by Ansible" in result.commands' + - '"no shutdown" in result.commands' + - '"vrf context test2" in result.commands' + - '"description Testing" in result.commands' + - '"shutdown" in result.commands' + +- name: aggregate definitions of VRFs(Idempotence) + register: result + cisco.nxos.nxos_vrf: *id001 + +- assert: + that: + - result.changed == false + +- name: Assign interfaces to VRF (Config + intent) + register: result + cisco.nxos.nxos_vrf: &id002 + name: test1 + interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + associated_interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + +- assert: + that: + - result.changed == true + - result.failed == false + - '"interface {{ testint1 }}" in result.commands' + - '"vrf member test1" in result.commands' + - '"interface {{ testint2 }}" in result.commands' + - '"vrf member test1" in result.commands' + +- name: Assign interfaces to vrf(Idempotence) + register: result + cisco.nxos.nxos_vrf: *id002 + +- assert: + that: + - result.changed == false + +- name: Check interfaces assigned to VRF (intent) + register: result + cisco.nxos.nxos_vrf: + name: test1 + associated_interfaces: + - '{{ testint1 }}' + - '{{ testint2 }}' + +- assert: + that: + - result.failed == false + +- name: Assign interfaces to VRF (intent fail) + register: result + ignore_errors: true + cisco.nxos.nxos_vrf: + name: test1 + associated_interfaces: + - test + +- assert: + that: + - result.failed == True + +- name: Remove interface from vrf + register: result + cisco.nxos.nxos_vrf: &id003 + name: test1 + interfaces: + - '{{ testint2 }}' + +- assert: + that: + - result.changed == true + - '"interface {{ testint1 }}" in result.commands' + - '"no vrf member test1" in result.commands' + +- name: Remove interface from vrf(idempotence) + register: result + cisco.nxos.nxos_vrf: *id003 + +- assert: + that: + - result.changed == false + +- name: Delete VRFs + register: result + cisco.nxos.nxos_vrf: &id004 + aggregate: + + - name: test1 + description: Configured by Ansible + + - name: test2 + description: Testing + admin_state: down + state: absent + +- assert: + that: + - result.changed == true + - '"no vrf context test1" in result.commands' + - '"no vrf context test2" in result.commands' + +- name: Delete VRFs(Idempotence) + register: result + cisco.nxos.nxos_vrf: *id004 + +- assert: + that: + - result.changed == false + +- name: setup - remove vrf from interfaces used in test(part1) + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf member test1 + parents: no switchport + before: interface {{ testint1 }} + +- name: setup - remove vrf from interfaces used in test(part2) + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf member test1 + parents: no switchport + before: interface {{ testint2 }} + +- name: setup - delete VRF test1 used in test + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf context test1 + +- name: setup - remove VRF test2 used in test + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - no vrf context test2 + +- debug: msg="END connection={{ ansible_connection }} nxos_vrf intent & aggregate + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/sanity.yaml new file mode 100644 index 00000000..41ea526e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf/tests/common/sanity.yaml @@ -0,0 +1,112 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vrf sanity test" + +- set_fact: intname1="{{ nxos_int1 }}" + +- set_fact: intname2="{{ nxos_int2 }}" + +- set_fact: rdnd="1:2" + when: (platform is not match("N35|N7K")) and ((imagetag != 'I2')) + +- set_fact: rdd="default" + when: (platform is not match("N35|N7K")) and ((imagetag != 'I2')) + +- set_fact: vnind="5000" + when: platform is not match("N35|N7K|N3L") + +- set_fact: vnid="default" + when: platform is not match("N35|N7K|N3L") + +- name: Enable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- name: 'Setup: Enable nv overlay evpn' + ignore_errors: true + when: platform is match("N5K|N6K") + cisco.nxos.nxos_config: + commands: + - nv overlay evpn + provider: '{{ connection }}' + +- block: + + - name: Ensure ntc VRF exists on switch + register: result + cisco.nxos.nxos_vrf: &id001 + vrf: ntc + admin_state: down + description: testing + vni: '{{vnind|default(omit)}}' + rd: '{{rdnd|default(omit)}}' + interfaces: + - '{{ intname1 }}' + - '{{ intname2 }}' + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf: *id001 + + - assert: &id004 + that: + - result.changed == false + + - pause: + seconds: 30 + + - name: Remove config + register: result + cisco.nxos.nxos_vrf: &id003 + vrf: ntc + admin_state: up + vni: '{{vnid|default(omit)}}' + rd: '{{rdd|default(omit)}}' + interfaces: default + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf: *id003 + + - assert: *id004 + + - name: Ensure ntc VRF does not exist on switch + register: result + cisco.nxos.nxos_vrf: &id005 + vrf: ntc + state: absent + + - assert: *id002 + + - pause: + seconds: 30 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vrf: *id005 + + - assert: *id004 + always: + + - name: 'Setup: Disable nv overlay evpn' + ignore_errors: true + when: platform is match("N5K|N6K") + cisco.nxos.nxos_config: + commands: + - no nv overlay evpn + provider: '{{ connection }}' + + - name: Disable feature BGP + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + + - debug: msg="END connection={{ ansible_connection }} nxos_vrf sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tests/common/sanity.yaml new file mode 100644 index 00000000..238fbeb3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_af/tests/common/sanity.yaml @@ -0,0 +1,146 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vrf_af sanity test" + +- name: Configure feature bgp + cisco.nxos.nxos_feature: + feature: bgp + state: enabled + +- name: Configure feature nv overlay + ignore_errors: true + cisco.nxos.nxos_config: + commands: feature nv overlay + +- name: Configure nv overlay evpn + ignore_errors: true + cisco.nxos.nxos_config: + commands: nv overlay evpn + +- block: + + - name: Configure vrf af ipv4 + register: result + cisco.nxos.nxos_vrf_af: &id001 + vrf: ansible + afi: ipv4 + route_target_both_auto_evpn: true + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf_af: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Configure vrf af ipv6 + register: result + cisco.nxos.nxos_vrf_af: &id003 + vrf: ansible + afi: ipv6 + route_target_both_auto_evpn: true + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf_af: *id003 + + - assert: *id004 + + - name: Remove router target4 + register: result + cisco.nxos.nxos_vrf_af: &id005 + vrf: ansible + afi: ipv4 + route_target_both_auto_evpn: false + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf_af: *id005 + + - assert: *id004 + + - name: Remove router target6 + register: result + cisco.nxos.nxos_vrf_af: &id006 + vrf: ansible + afi: ipv6 + route_target_both_auto_evpn: false + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf_af: *id006 + + - assert: *id004 + + - name: Remove vrf af v6 + register: result + cisco.nxos.nxos_vrf_af: &id007 + vrf: ansible + afi: ipv6 + route_target_both_auto_evpn: true + state: absent + + - assert: *id002 + + - pause: + seconds: 30 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vrf_af: *id007 + + - assert: *id004 + + - name: Remove vrf af v4 + register: result + cisco.nxos.nxos_vrf_af: &id008 + vrf: ansible + afi: ipv4 + route_target_both_auto_evpn: true + state: absent + + - assert: *id002 + + - pause: + seconds: 30 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vrf_af: *id008 + + - assert: *id004 + when: not platform is search("N35|N3L") + always: + + - name: Remove vrf + ignore_errors: true + cisco.nxos.nxos_config: + commands: no vrf context ansible + + - name: Remove nv overlay evpn + ignore_errors: true + cisco.nxos.nxos_config: + commands: no nv overlay evpn + + - name: Remove feature nv overlay + ignore_errors: true + cisco.nxos.nxos_config: + commands: no feature nv overlay + + - name: Remove feature bgp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: bgp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vrf_af sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tests/common/sanity.yaml new file mode 100644 index 00000000..cd87e87c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrf_interface/tests/common/sanity.yaml @@ -0,0 +1,59 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vrf_interface sanity + test" + +- set_fact: intname="{{ nxos_int1 }}" + +- block: + + - name: put interface in L3 + cisco.nxos.nxos_config: + commands: + - no switchport + parents: + - interface {{ intname }} + match: none + + - name: Ensure vrf ntc exists on interface + register: result + cisco.nxos.nxos_vrf_interface: &id001 + vrf: ntc + interface: '{{ intname }}' + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrf_interface: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Ensure ntc VRF does not exist on interface + register: result + cisco.nxos.nxos_vrf_interface: &id003 + vrf: ntc + interface: '{{ intname }}' + state: absent + + - assert: *id002 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vrf_interface: *id003 + + - assert: *id004 + always: + + - name: put interface in default mode + ignore_errors: true + cisco.nxos.nxos_config: + lines: default interface {{ intname }} + match: none + +- debug: msg="END connection={{ ansible_connection }} nxos_vrf_interface sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tests/common/sanity.yaml new file mode 100644 index 00000000..744209da --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vrrp/tests/common/sanity.yaml @@ -0,0 +1,133 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vrrp sanity test" + +- block: + + - name: Enable interface-vlan + cisco.nxos.nxos_feature: + feature: interface-vlan + state: enabled + + - name: Enable vrrp + cisco.nxos.nxos_feature: + feature: vrrp + state: enabled + + - name: create int vlan 10 + cisco.nxos.nxos_config: + commands: int vlan 10 + + - name: Ensure vrrp group 100 and vip 10.1.100.1 is on vlan10 + register: result + cisco.nxos.nxos_vrrp: &id001 + interface: vlan10 + group: 100 + vip: 10.1.100.1 + admin_state: no shutdown + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrrp: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: Ensure vrrp group 100 is default + register: result + cisco.nxos.nxos_vrrp: &id003 + interface: vlan10 + group: 100 + vip: default + admin_state: default + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vrrp: *id003 + + - assert: *id004 + + - name: Ensure removal of the vrrp group config + register: result + cisco.nxos.nxos_vrrp: &id005 + interface: vlan10 + group: 100 + state: absent + + - assert: *id002 + + - pause: + seconds: 30 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vrrp: *id005 + + - assert: *id004 + + - pause: + seconds: 30 + + - name: Re-config with more params + register: result + cisco.nxos.nxos_vrrp: &id006 + interface: vlan10 + group: 100 + vip: 10.1.100.1 + preempt: false + interval: 10 + priority: 130 + authentication: AUTHKEY + + - assert: *id002 + + - name: Reconfig Idempotence + register: result + cisco.nxos.nxos_vrrp: *id006 + + - assert: *id004 + + - name: Re-config with defaults + register: result + cisco.nxos.nxos_vrrp: &id007 + interface: vlan10 + group: 100 + vip: default + preempt: true + interval: default + priority: default + authentication: default + + - assert: *id002 + + - name: Reconfig Idempotence + register: result + cisco.nxos.nxos_vrrp: *id007 + + - assert: *id004 + always: + + - name: remove vrrp + ignore_errors: true + cisco.nxos.nxos_vrrp: *id005 + + - name: Disable interface-vlan + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no feature interface-vlan + match: none + + - name: Disable vrrp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: vrrp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vrrp sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/meta/main.yml new file mode 100644 index 00000000..91da2a75 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/meta/main.yml @@ -0,0 +1,2 @@ +--- +... diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/main.yaml new file mode 100644 index 00000000..d7c416ee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tasks/main.yaml @@ -0,0 +1,18 @@ +--- +- name: Check platform type and skip if not MDS + register: result + cisco.nxos.nxos_command: + commands: show version | grep MDS + +- name: Set skip_test flag to false + set_fact: + skip_test=False + +- name: Set skip_test flag to true if not MDS + set_fact: + skip_test=True + when: result.stdout[0] is not search('MDS') + +- include: cli.yaml + tags: cli + when: not skip_test diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tests/common/sanity.yaml new file mode 100644 index 00000000..de512b18 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/tests/common/sanity.yaml @@ -0,0 +1,65 @@ +--- +- debug: msg="START nxos_vsan sanity test with connection={{ ansible_connection + }} " + +- debug: msg="Using vsans {{ vsan1 }}, {{ vsan2 }} for running this sanity test, + please make sure these are not used in the setup, these will be deleted after + the tests" + +- block: + + - name: Setup - Remove vsan if configured + ignore_errors: true + cisco.nxos.nxos_vsan: &id002 + vsan: + + - id: '{{ vsan1 | int }}' + remove: true + + - id: '{{ vsan2 | int }}' + remove: true + + - name: Configure vsan + register: result + cisco.nxos.nxos_vsan: &id001 + vsan: + + - id: '{{ vsan1 | int }}' + name: vsan-SAN-A + suspend: true + interface: + - '{{intA1}}' + remove: false + + - id: '{{ vsan2 | int }}' + name: vsan-SAN-B + interface: + - '{{intB1}}' + remove: false + + - assert: + that: + - result.changed == true + + - assert: + that: + - result.commands == ["terminal dont-ask", "vsan database", "vsan 922", + "vsan 922 name vsan-SAN-A", "vsan 922 suspend", "vsan 922 interface + fc1/1", "vsan 923", "vsan 923 name vsan-SAN-B", "no vsan 923 suspend", + "vsan 923 interface fc1/2", "no terminal dont-ask"] + + - name: Idempotence Check + register: result + cisco.nxos.nxos_vsan: *id001 + + - assert: + that: + - result.changed == false + + - assert: + that: + - result.commands == [] + always: + + - name: Remove vsan config + cisco.nxos.nxos_vsan: *id002 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/vars/main.yml new file mode 100644 index 00000000..9c8077a4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vsan/vars/main.yml @@ -0,0 +1,5 @@ +--- +vsan1: 922 +vsan2: 923 +intA1: fc1/1 +intB1: fc1/2 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tests/common/sanity.yaml new file mode 100644 index 00000000..a8c00a66 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_domain/tests/common/sanity.yaml @@ -0,0 +1,46 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vtp_domain sanity test" + +- set_fact: vtp_run="true" + +- set_fact: vtp_run="false" + when: platform is search('N3K-F|N9K-F') + +- block: + + - name: disable feature vtp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: vtp + state: disabled + + - name: enable feature vtp + cisco.nxos.nxos_feature: + feature: vtp + state: enabled + + - name: configure vtp domain + register: result + cisco.nxos.nxos_vtp_domain: &id001 + domain: ntc + + - assert: + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vtp_domain: *id001 + + - assert: + that: + - result.changed == false + when: vtp_run + always: + + - name: disable feature vtp + cisco.nxos.nxos_feature: + feature: vtp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vtp_domain sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tests/common/sanity.yaml new file mode 100644 index 00000000..d4930e0d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_password/tests/common/sanity.yaml @@ -0,0 +1,66 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vtp_password sanity + test" + +- set_fact: vtp_run="true" + +- set_fact: vtp_run="false" + when: platform is search('N3K-F|N9K-F') + +- block: + + - name: disable feature vtp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: vtp + state: disabled + + - name: enable feature vtp + cisco.nxos.nxos_feature: + feature: vtp + state: enabled + + - name: configure vtp domain + cisco.nxos.nxos_vtp_domain: + domain: testing + + - name: configure vtp password + register: result + cisco.nxos.nxos_vtp_password: &id001 + vtp_password: ntc + state: present + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vtp_password: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: remove vtp password + register: result + cisco.nxos.nxos_vtp_password: &id003 + vtp_password: ntc + state: absent + + - assert: *id002 + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vtp_password: *id003 + + - assert: *id004 + when: vtp_run + always: + + - name: disable feature vtp + cisco.nxos.nxos_feature: + feature: vtp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vtp_password sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tests/common/sanity.yaml new file mode 100644 index 00000000..7557893f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vtp_version/tests/common/sanity.yaml @@ -0,0 +1,51 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vtp_version sanity + test" + +- set_fact: vtp_run="true" + +- set_fact: vtp_run="false" + when: platform is search('N3K-F|N9K-F') + +- block: + + - name: disable feature vtp + ignore_errors: true + cisco.nxos.nxos_feature: + feature: vtp + state: disabled + + - name: enable feature vtp + cisco.nxos.nxos_feature: + feature: vtp + state: enabled + + - name: configure supporting vtp domain + cisco.nxos.nxos_vtp_domain: + domain: foo + + - name: configure vtp version + register: result + cisco.nxos.nxos_vtp_version: &id001 + version: 2 + + - assert: + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vtp_version: *id001 + + - assert: + that: + - result.changed == false + when: vtp_run | bool + always: + + - name: disable feature vtp + cisco.nxos.nxos_feature: + feature: vtp + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vtp_version sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/main.yaml new file mode 100644 index 00000000..c7dfdab6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/main.yaml @@ -0,0 +1,8 @@ +--- +- include: cli.yaml + tags: + - cli + +- include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml new file mode 100644 index 00000000..0fba16a7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml @@ -0,0 +1,24 @@ +--- +- name: Unconfigure VDC setting limit-resource module-type f3 + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; no limit-resource module-type f3 + match: none + +- name: Previous command is asynchronous and can take a while. Allow time for it + to complete + pause: + seconds: 45 + +- name: Configure VDC setting allocate interface unallocated-interfaces + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; allocate interface unallocated-interfaces + match: none + +- name: Previous command is asynchronous can take a while. Allow time for it to + complete + pause: + seconds: 45 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml new file mode 100644 index 00000000..0423606c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml @@ -0,0 +1,32 @@ +--- +- name: Get default vdc id + register: vdcout + cisco.nxos.nxos_command: + commands: + - show vdc current-vdc | json + +- set_fact: vdcid="{{ vdcout.stdout_lines[0].name }}" + +- name: Configure VDC setting limit-resource module-type f3 + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; limit-resource module-type f3 + match: none + +- name: Previous command is asynchronous and can take a while. Allow time for it + to complete + pause: + seconds: 45 + +- name: Configure VDC setting allocate interface unallocated-interfaces + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - terminal dont-ask ; vdc {{ vdcid }} ; allocate interface unallocated-interfaces + match: none + +- name: Previous command is asynchronous and can take a while. Allow time for it + to complete + pause: + seconds: 45 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/multisite.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/multisite.yaml new file mode 100644 index 00000000..7a48a4bd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/multisite.yaml @@ -0,0 +1,112 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vxlan_vtep multisite sanity test" + +- name: Enable feature nv overlay - multisite + cisco.nxos.nxos_config: + commands: + - feature nv overlay + match: none + +- name: Enable nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + +- name: Enable multisite border gateway - multisite + ignore_errors: true + register: multiout + cisco.nxos.nxos_config: + lines: + - evpn multisite border-gateway 10 + +- block: + + - name: configure vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id001 + interface: nve1 + description: abcd + host_reachability: true + source_interface: Loopback0 + source_interface_hold_down_time: 30 + global_ingress_replication_bgp: true + multisite_border_gateway_interface: Loopback10 + shutdown: false + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: reset vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id004 + interface: nve1 + description: default + host_reachability: false + source_interface_hold_down_time: default + source_interface: default + global_ingress_replication_bgp: false + multisite_border_gateway_interface: default + shutdown: true + + - assert: *id002 + + - name: reset Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id004 + + - assert: *id003 + + - name: remove vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id005 + interface: nve1 + description: default + host_reachability: true + source_interface: Loopback0 + source_interface_hold_down_time: 30 + shutdown: true + state: absent + + - assert: + that: + - result.changed == true + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id005 + + - assert: + that: + - result.changed == false + + - name: Disable multisite border gateway - multisite + cisco.nxos.nxos_config: + lines: + - no evpn multisite border-gateway 10 + when: multiout is not search("Invalid command") + +- name: Disable nv overlay evpn + when: platform is search('N9K') + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no nv overlay evpn + match: none + +- name: Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nve + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vxlan_vtep sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/sanity.yaml new file mode 100644 index 00000000..f349282d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep/tests/common/sanity.yaml @@ -0,0 +1,225 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vxlan_vtep sanity test" + +- block: + + - set_fact: global_mcast_group_L2="225.1.1.2" + + - set_fact: def_global_mcast_group_L2="default" + + - block: + + - set_fact: global_mcast_group_L3="225.1.1.1" + + - set_fact: def_global_mcast_group_L3="default" + + - set_fact: global_ingress_replication_bgp="true" + + - set_fact: def_global_ingress_replication_bgp="false" + when: false + + - name: TCAM resource check for global_suppress_arp + connection: ansible.netcommon.network_cli + register: tcam_state + cisco.nxos.nxos_command: + commands: + + - command: show hardware access-list tcam region | incl arp-ether | sed + 's/.*size = *//' + output: text + + - block: + + - set_fact: global_suppress_arp="true" + + - set_fact: def_global_suppress_arp="false" + when: tcam_state.stdout[0]|int > 0 + when: platform is search('N9K') and (major_version is version('9.2', 'ge')) + +- block: + + - name: Apply N7K specific setup config + include: targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml + when: platform is match('N7K') + + - name: Enable feature nv overlay + cisco.nxos.nxos_config: + commands: + - feature nv overlay + - nv overlay evpn + match: none + + - block: + + - name: Enable feature ngmvpn + cisco.nxos.nxos_config: + commands: + - feature ngmvpn + match: none + when: global_mcast_group_L3 is defined + + - block: + + - name: configure vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id001 + interface: nve1 + description: abcd + host_reachability: true + source_interface: Loopback0 + source_interface_hold_down_time: 30 + global_ingress_replication_bgp: '{{ global_ingress_replication_bgp|default(omit) + }}' + global_suppress_arp: '{{ global_suppress_arp|default(omit) }}' + global_mcast_group_L3: '{{ global_mcast_group_L3|default(omit) }}' + shutdown: false + + - assert: &id002 + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: reset vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id003 + interface: nve1 + description: default + host_reachability: false + source_interface_hold_down_time: default + source_interface: default + global_ingress_replication_bgp: '{{ def_global_ingress_replication_bgp|default(omit) + }}' + global_suppress_arp: '{{ def_global_suppress_arp|default(omit) }}' + global_mcast_group_L3: '{{ def_global_mcast_group_L3|default(omit) }}' + shutdown: true + + - assert: *id002 + + - name: reset Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id003 + + - assert: *id004 + + - name: configure global mcast L2 + register: result + cisco.nxos.nxos_vxlan_vtep: &id005 + interface: nve1 + host_reachability: true + global_mcast_group_L2: '{{ global_mcast_group_L2|default(omit) }}' + + - assert: *id002 + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id005 + + - assert: *id004 + + - name: reset global mcast L2 + register: result + cisco.nxos.nxos_vxlan_vtep: &id006 + interface: nve1 + host_reachability: false + global_mcast_group_L2: '{{ def_global_mcast_group_L2|default(omit) }}' + + - assert: *id002 + + - name: reset Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id006 + + - assert: *id004 + when: (platform is search('N9K')) + + - block: + + - name: configure vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id007 + interface: nve1 + description: default + host_reachability: true + source_interface: Loopback0 + shutdown: false + + - assert: + that: + - result.changed == true + + - name: Conf Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id007 + + - assert: + that: + - result.changed == false + + - name: reset vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id008 + interface: nve1 + description: default + host_reachability: false + source_interface: default + shutdown: true + + - assert: *id002 + + - name: reset Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id008 + + - assert: *id004 + when: (platform is search('N7K')) + + - name: remove vxlan_vtep + register: result + cisco.nxos.nxos_vxlan_vtep: &id009 + interface: nve1 + description: default + host_reachability: true + source_interface: Loopback0 + source_interface_hold_down_time: 30 + shutdown: true + state: absent + + - assert: + that: + - result.changed == true + + - name: Remove Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep: *id009 + + - assert: + that: + - result.changed == false + when: (platform is search("N7K|N9K")) + always: + + - name: Apply N7K specific cleanup config + include: targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml + when: platform is match('N7K') + + - name: Disable nv overlay evpn + ignore_errors: true + cisco.nxos.nxos_config: + commands: + - no nv overlay evpn + match: none + + - name: Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nve + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vxlan_vtep sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/meta/main.yml new file mode 100644 index 00000000..f504a6ab --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - prepare_nxos_tests diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/main.yaml new file mode 100644 index 00000000..9d6833c0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- block: + + - include: cli.yaml + tags: + - cli + always: + + - include: nxapi.yaml + tags: + - nxapi diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/nxapi.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/nxapi.yaml new file mode 100644 index 00000000..0d152403 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect nxapi test cases + find: + paths: '{{ role_path }}/tests/nxapi' + patterns: '{{ testcase }}.yaml' + connection: local + register: nxapi_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ nxapi_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.httpapi) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.httpapi + connection={{ nxapi }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/multisite.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/multisite.yaml new file mode 100644 index 00000000..bcc44cc4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/multisite.yaml @@ -0,0 +1,108 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vxlan_vtep_vni multisite + sanity test" + +- name: Disable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: disabled + +- name: Enable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: enabled + +- name: Enable nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - nv overlay evpn + +- name: Enable multisite border gateway - multisite + ignore_errors: true + register: multiout + cisco.nxos.nxos_config: + lines: + - evpn multisite border-gateway 10 + +- block: + + - name: configure vxlan_vtep - multisite + cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + host_reachability: true + + - name: Configure multisite ingress replication - multisite + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id001 + interface: nve1 + vni: 8000 + multisite_ingress_replication: enable + + - assert: &id002 + that: + - result.changed == true + + - name: Idempotence check + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id001 + + - assert: &id003 + that: + - result.changed == false + + - name: Remove multisite ingress replication - multisite + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id004 + interface: nve1 + vni: 8000 + multisite_ingress_replication: disable + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id004 + + - assert: *id003 + + - name: Configure optimized multisite ingress replication - multisite + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id005 + interface: nve1 + vni: 8000 + multisite_ingress_replication: optimized + + - assert: *id002 + + - name: Idempotence check + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id005 + + - assert: *id003 + + - name: Disable multisite border gateway - multisite + cisco.nxos.nxos_config: + lines: + - no evpn multisite border-gateway 10 + when: multiout is not search("Invalid command") + +- name: Disable feature nv overlay - multisite + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nv overlay + state: disabled + +- pause: + seconds: 5 + +- name: Remove nv overlay evpn - multisite + when: platform is search('N9K') + cisco.nxos.nxos_config: + lines: + - no nv overlay evpn + +- debug: msg="END connection={{ ansible_connection }} nxos_vxlan_vtep_vni multisite + sanity test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/sanity.yaml new file mode 100644 index 00000000..f80b0227 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_vxlan_vtep_vni/tests/common/sanity.yaml @@ -0,0 +1,253 @@ +--- +- debug: msg="START connection={{ ansible_connection }} nxos_vxlan_vtep_vni sanity + test" + +- block: + + - name: Apply N7K specific setup config + include: targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml + when: platform is match('N7K') + + - name: Enable feature nv overlay + cisco.nxos.nxos_config: + commands: + - feature nv overlay + match: none + + - name: configure vxlan_vtep + cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + host_reachability: true + + - name: configure vxlan_vtep_vni assoc-vrf + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id001 + interface: nve1 + vni: 6000 + assoc_vrf: true + + - assert: &id002 + that: + - result.changed == true + + - name: Conf 1 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id001 + + - assert: &id004 + that: + - result.changed == false + + - name: remove vxlan_vtep_vni + cisco.nxos.nxos_vxlan_vtep_vni: + interface: nve1 + vni: 6000 + assoc_vrf: true + state: absent + + - name: configure vxlan_vtep_vni + register: result + cisco.nxos.nxos_vxlan_vtep_vni: + interface: nve1 + vni: 8000 + + - assert: *id002 + + - name: configure vxlan_vtep_vni mcast + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id003 + interface: nve1 + vni: 8000 + multicast_group: 224.1.1.1 + + - assert: *id002 + + - name: Conf 3 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id003 + + - assert: *id004 + + - name: configure vxlan_vtep_vni default mcast + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id005 + interface: nve1 + vni: 8000 + multicast_group: default + + - assert: *id002 + + - name: Conf 4 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id005 + + - assert: *id004 + + - name: remove config + cisco.nxos.nxos_vxlan_vtep_vni: &id013 + interface: nve1 + vni: 8000 + state: absent + + - name: configure vxlan_vtep + cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + host_reachability: false + + - block: + + - name: configure vxlan_vtep_vni + register: result + cisco.nxos.nxos_vxlan_vtep_vni: + interface: nve1 + vni: 8000 + + - assert: *id002 + + - name: configure vxlan_vtep_vni ingress static + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id006 + interface: nve1 + vni: 8000 + ingress_replication: static + + - assert: *id002 + + - name: check configure vxlan_vtep_vni ingress static idempotence check + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id006 + + - assert: *id004 + + - name: Remove and reconfigure vxlan_vtep + cisco.nxos.nxos_vxlan_vtep: &id009 + interface: nve1 + state: absent + + - name: Configure vxlan_vtep with host reachability bgp + cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + host_reachability: true + + - name: configure vxlan_vtep_vni + cisco.nxos.nxos_vxlan_vtep_vni: &id010 + interface: nve1 + vni: 8000 + + - name: configure vxlan_vtep_vni ingress bgp + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id007 + interface: nve1 + vni: 8000 + ingress_replication: bgp + + - assert: *id002 + + - name: Conf 7 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id007 + + - assert: *id004 + + - name: remove ingress_repl + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id008 + interface: nve1 + vni: 8000 + ingress_replication: default + + - assert: *id002 + + - name: Conf 8 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id008 + + - assert: *id004 + + - name: Remove and reconfigure vxlan_vtep + cisco.nxos.nxos_vxlan_vtep: *id009 + + - name: Configure vxlan_vtep with host reachability static + cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + host_reachability: false + + - name: configure vxlan_vtep_vni + cisco.nxos.nxos_vxlan_vtep_vni: *id010 + + - name: configure vxlan_vtep_vni peer-list + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id011 + interface: nve1 + vni: 8000 + peer_list: + - 192.0.2.1 + - 192.0.2.2 + - 192.0.2.3 + - 192.0.2.4 + ingress_replication: static + + - assert: *id002 + + - name: Conf 9 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id011 + + - assert: *id004 + + - name: configure vxlan_vtep_vni default peer-list + register: result + cisco.nxos.nxos_vxlan_vtep_vni: &id012 + interface: nve1 + vni: 8000 + peer_list: default + ingress_replication: static + + - assert: *id002 + + - name: Conf 10 Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id012 + + - assert: *id004 + + - name: Conf 9 again + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id011 + + - assert: *id002 + + - name: remove vxlan_vtep_vni + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id013 + + - assert: *id002 + + - name: remove Idempotence + register: result + cisco.nxos.nxos_vxlan_vtep_vni: *id013 + + - assert: *id004 + when: (platform is search('N9K')) + when: (platform is search("N7K|N9K")) + always: + + - name: Apply N7K specific cleanup config + include: targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml + when: platform is match('N7K') + + - name: remove vxlan_vtep + ignore_errors: true + cisco.nxos.nxos_vxlan_vtep: + interface: nve1 + shutdown: true + state: absent + + - name: Disable feature nv overlay + ignore_errors: true + cisco.nxos.nxos_feature: + feature: nve + state: disabled + +- debug: msg="END connection={{ ansible_connection }} nxos_vxlan_vtep_vni sanity + test" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/defaults/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/defaults/main.yaml new file mode 100644 index 00000000..10c0fabc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: '*' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/meta/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/meta/main.yml new file mode 100644 index 00000000..91da2a75 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/meta/main.yml @@ -0,0 +1,2 @@ +--- +... diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/cli.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/cli.yaml new file mode 100644 index 00000000..1b09e6e8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/cli.yaml @@ -0,0 +1,28 @@ +--- +- name: collect common test cases + find: + paths: '{{ role_path }}/tests/common' + patterns: '{{ testcase }}.yaml' + connection: local + register: test_cases + +- name: collect cli test cases + find: + paths: '{{ role_path }}/tests/cli' + patterns: '{{ testcase }}.yaml' + connection: local + register: cli_cases + +- set_fact: + test_cases: + files: '{{ test_cases.files }} + {{ cli_cases.files }}' + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test cases (connection=ansible.netcommon.network_cli) + include: '{{ test_case_to_run }} ansible_connection=ansible.netcommon.network_cli + connection={{ cli }}' + with_items: '{{ test_items }}' + loop_control: + loop_var: test_case_to_run diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/main.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/main.yaml new file mode 100644 index 00000000..d7c416ee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tasks/main.yaml @@ -0,0 +1,18 @@ +--- +- name: Check platform type and skip if not MDS + register: result + cisco.nxos.nxos_command: + commands: show version | grep MDS + +- name: Set skip_test flag to false + set_fact: + skip_test=False + +- name: Set skip_test flag to true if not MDS + set_fact: + skip_test=True + when: result.stdout[0] is not search('MDS') + +- include: cli.yaml + tags: cli + when: not skip_test diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tests/common/sanity.yaml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tests/common/sanity.yaml new file mode 100644 index 00000000..cc8d2684 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/tests/common/sanity.yaml @@ -0,0 +1,222 @@ +--- +- debug: msg="START nxos_zone_zoneset sanity test with connection={{ ansible_connection + }} " + +- debug: msg="Using vsans {{ vsan1 }}, {{ vsan2 }} for running this sanity test, + please make sure these are not used in the setup, these will be deleted after + the tests" + +- always: + + - name: Remove vsan config + cisco.nxos.nxos_vsan: + vsan: + + - id: '{{ vsan1 | int }}' + remove: true + + - id: '{{ vsan2 | int }}' + remove: true + block: + + - ignore_errors: true + name: Setup - Remove vsan if configured + cisco.nxos.nxos_vsan: + vsan: + + - id: '{{ vsan1 | int }}' + remove: true + + - id: '{{ vsan2 | int }}' + remove: true + + - name: Configure vsan + cisco.nxos.nxos_vsan: + vsan: + + - id: '{{ vsan1 | int }}' + + - id: '{{ vsan2 | int }}' + + - name: Configure zone and zoneset + register: result + cisco.nxos.nxos_zone_zoneset: &id001 + zone_zoneset_details: + + - mode: enhanced + vsan: '{{ vsan1 | int }}' + zone: + + - members: + + - pwwn: "11:11:11:11:11:11:11:11" + + - device_alias: test123 + + - pwwn: "61:61:62:62:12:12:12:12" + remove: true + name: zoneA + + - members: + + - pwwn: "10:11:11:11:11:11:11:11" + + - pwwn: "62:62:62:62:21:21:21:21" + name: zoneB + + - name: zoneC + remove: true + zoneset: + + - action: activate + members: + + - name: zoneA + + - name: zoneB + + - name: zoneC + remove: true + name: zsetname1 + + - action: deactivate + name: zsetTestExtra + remove: true + + - mode: basic + smart_zoning: true + vsan: '{{ vsan2 | int }}' + zone: + + - members: + + - devtype: both + pwwn: "11:11:11:11:11:11:11:11" + + - pwwn: "62:62:62:62:12:12:12:12" + + - devtype: both + pwwn: "92:62:62:62:12:12:1a:1a" + remove: true + name: zone21A + + - members: + + - pwwn: "10:11:11:11:11:11:11:11" + + - pwwn: "62:62:62:62:21:21:21:21" + + - device_alias: somedummyname + + - device_alias: anydummyname + remove: true + name: zone21B + zoneset: + + - action: activate + members: + + - name: zone21A + + - name: zone21B + name: zsetname21 + + - assert: + that: + - result.changed == true + + - assert: + that: + - result.commands == ["terminal dont-ask", "zone mode enhanced vsan 922", + "zone name zoneA vsan 922", "member pwwn 11:11:11:11:11:11:11:11", "member + device-alias test123", "zone name zoneB vsan 922", "member pwwn 10:11:11:11:11:11:11:11", + "member pwwn 62:62:62:62:21:21:21:21", "zoneset name zsetname1 vsan + 922", "member zoneA", "member zoneB", "zoneset activate name zsetname1 + vsan 922", "zone commit vsan 922", "zone smart-zoning enable vsan 923", + "zone name zone21A vsan 923", "member pwwn 11:11:11:11:11:11:11:11 both", + "member pwwn 62:62:62:62:12:12:12:12", "zone name zone21B vsan 923", + "member pwwn 10:11:11:11:11:11:11:11", "member pwwn 62:62:62:62:21:21:21:21", + "member device-alias somedummyname", "zoneset name zsetname21 vsan 923", + "member zone21A", "member zone21B", "zoneset activate name zsetname21 + vsan 923", "no terminal dont-ask"] + + - name: Idempotence Check + register: result + cisco.nxos.nxos_zone_zoneset: *id001 + + - name: Display Idempotence Check result + debug: + var: result + + - assert: + that: + - result.commands == [] + + - assert: + that: + - result.changed == false + + - name: Delete zone and zoneset that was configured + register: result + cisco.nxos.nxos_zone_zoneset: &id002 + zone_zoneset_details: + + - mode: enhanced + vsan: '{{ vsan1 | int }}' + zone: + + - name: zoneA + remove: true + + - name: zoneB + remove: true + + - name: zoneC + remove: true + zoneset: + + - name: zsetname1 + remove: true + + - action: deactivate + name: zsetTestExtra + remove: true + + - mode: basic + smart_zoning: true + vsan: '{{ vsan2 | int }}' + zone: + + - name: zone21A + remove: true + + - name: zone21B + remove: true + zoneset: + + - name: zsetname21 + remove: true + + - assert: + that: + - result.changed == true + + - assert: + that: + - result.commands == ["terminal dont-ask", "no zone name zoneA vsan 922", + "no zone name zoneB vsan 922", "no zoneset name zsetname1 vsan 922", + "zone commit vsan 922", "no zone name zone21A vsan 923", "no zone name + zone21B vsan 923", "no zoneset name zsetname21 vsan 923", "no terminal + dont-ask"] + + - name: Idempotence Check for zone/zoneset removal + register: result + cisco.nxos.nxos_zone_zoneset: *id002 + + - assert: + that: + - result.commands == [] + + - assert: + that: + - result.changed == false diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/vars/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/vars/main.yml new file mode 100644 index 00000000..9c8077a4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/nxos_zone_zoneset/vars/main.yml @@ -0,0 +1,5 @@ +--- +vsan1: 922 +vsan2: 923 +intA1: fc1/1 +intB1: fc1/2 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/prepare_nxos_tests/tasks/main.yml b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/prepare_nxos_tests/tasks/main.yml new file mode 100644 index 00000000..b9ae40f3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/integration/targets/prepare_nxos_tests/tasks/main.yml @@ -0,0 +1,149 @@ +--- +- block: + + - name: Enable Feature Privilege + connection: ansible.netcommon.network_cli + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - feature privilege + + - name: Enable Feature NXAPI + connection: ansible.netcommon.network_cli + cisco.nxos.nxos_nxapi: + state: present + + - name: Enable lldp + connection: ansible.netcommon.network_cli + ignore_errors: true + cisco.nxos.nxos_config: + lines: + - feature lldp + + - name: Collect interface list + connection: ansible.netcommon.network_cli + register: intout + cisco.nxos.nxos_command: + commands: + - show interface brief | json + + - set_fact: + intdataraw: "{{ intout.stdout_lines[0]['TABLE_interface']['ROW_interface']\ + \ }}" + + - set_fact: + nxos_int1: '{{ intdataraw[1].interface }}' + + - set_fact: + nxos_int2: '{{ intdataraw[2].interface }}' + + - set_fact: + nxos_int3: '{{ intdataraw[3].interface }}' + + - name: Gather image version info + connection: ansible.netcommon.network_cli + register: nxos_version_output + cisco.nxos.nxos_command: + commands: + - show version | json + + - set_fact: + image_version: "{{ nxos_version_output.stdout[0]['kickstart_ver_str'] }}" + + - name: Gather platform info + connection: ansible.netcommon.network_cli + register: nxos_inventory_output + cisco.nxos.nxos_command: + commands: + - show inventory | json + + - set_fact: + platform: "{{ nxos_inventory_output.stdout_lines[0]['TABLE_inv']['ROW_inv'][0]['productid'].split('-')[0]\ + \ }}" + + - set_fact: + chassis_type: "{{ nxos_inventory_output.stdout_lines[0]['TABLE_inv']['ROW_inv'][0]['productid'].split('-')[1]\ + \ }}" + + - set_fact: + fretta: "{% for row in nxos_inventory_output.stdout_lines[0]['TABLE_inv']['ROW_inv']\ + \ if '-R' in row['productid'] %}true{% endfor %}" + when: platform is match("N9K|N3K") + + - set_fact: + platform: N3K-F + when: ( platform is match("N3K")) and ( fretta is search("true")) + + - set_fact: + platform: N9K-F + when: ( platform is match("N9K")) and ( fretta is search("true")) + + - set_fact: + titanium: 'false' + + - set_fact: + titanium: "{% for row in nxos_inventory_output.stdout_lines[0]['TABLE_inv']['ROW_inv']\ + \ if 'NX-OSv' in row['desc']%}true{% endfor %}" + when: platform is match("N7K") + + - set_fact: + platform: N35 + when: ( chassis_type is search("C35")) + + - set_fact: + platform: N35NG + when: ( chassis_type is search("C35")) and image_version is search("7.0\(3\)I7") + + - set_fact: + platform: N3L + when: ( chassis_type is search("C3048")) + + - set_fact: + imagetag: '' + + - set_fact: + imagemr: '' + + - set_fact: + major_version: '{{ image_version[0:3] }}' + + - set_fact: + imagetag: '{{ image_version[0:3] }}' + when: image_version is search("\d\.\d\(\d\)") + + - set_fact: + imagetag: '{{ image_version[6:8] }}' + when: image_version is search("\d\.\d\(\d\)\S\S\(\d\)") + + - set_fact: + imagetag: '{{ image_version[6:10] }}' + when: image_version is search("\d\.\d\(\d\)\S\S\S\S\(\d\)") + + - set_fact: + imagemr: '{{ image_version[4:5] }}' + when: image_version is search("\d\.\d\(\d\)") + + - set_fact: + imagemr: '{{ image_version[9:10] }}' + when: image_version is search("\d\.\d\(\d\)\S\S\(\d\)") + + - set_fact: + imagemr: '{{ image_version[11:12] }}' + when: image_version is search("\d\.\d\(\d\)\S\S\S\S\(\d\)") + + - debug: + msg: IMAGE VERSION {{ image_version }} + + - debug: + msg: IMAGE TAG {{ imagetag }} + + - debug: + msg: IMAGE MR {{ imagemr }} + + - set_fact: + ipv6_supported: 'true' + + - set_fact: + ipv6_supported: 'false' + when: platform is match("N35") + when: prepare_nxos_tests_task | default(True) | bool diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.10.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.10.txt new file mode 100644 index 00000000..46cfbc64 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.10.txt @@ -0,0 +1 @@ +plugins/action/nxos.py action-plugin-docs # base class for deprecated network platform modules using `connection: local` diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.9.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.9.txt new file mode 100644 index 00000000..19b33017 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/ignore-2.9.txt @@ -0,0 +1,31 @@ +plugins/modules/nxos_acl.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_acl.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_acl_interface.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_acl_interface.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_interface.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_interface.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_l2_interface.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_l2_interface.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_l3_interface.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_l3_interface.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_linkagg.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_linkagg.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_lldp.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_lldp.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_ospf.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_ospf.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_static_route.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_static_route.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_vlan.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_vlan.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_ospf_vrf.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_ospf_vrf.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/action/nxos.py action-plugin-docs # base class for deprecated network platform modules using `connection: local` +plugins/modules/nxos_smu.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_smu.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_interface_ospf.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_interface_ospf.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_bgp.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_bgp.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict +plugins/modules/nxos_bgp_neighbor.py validate-modules:deprecation-mismatch # 2.9 expects METADATA +plugins/modules/nxos_bgp_neighbor.py validate-modules:invalid-documentation # removed_at_date not supported in `deprecated` dict diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/requirements.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/requirements.txt new file mode 100644 index 00000000..3e3a9669 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/sanity/requirements.txt @@ -0,0 +1,4 @@ +packaging # needed for update-bundled and changelog +sphinx ; python_version >= '3.5' # docs build requires python 3+ +sphinx-notfound-page ; python_version >= '3.5' # docs build requires python 3+ +straight.plugin ; python_version >= '3.5' # needed for hacking/build-ansible.py which will host changelog generation and requires python 3+ diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/builtins.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/builtins.py new file mode 100644 index 00000000..bfc8adfb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/builtins.py @@ -0,0 +1,34 @@ +# (c) 2014, Toshio Kuratomi +# +# 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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +# +# Compat for python2.7 +# + +# One unittest needs to import builtins via __import__() so we need to have +# the string that represents it +try: + import __builtin__ +except ImportError: + BUILTINS = "builtins" +else: + BUILTINS = "__builtin__" diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/mock.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/mock.py new file mode 100644 index 00000000..b45d6b5c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/mock.py @@ -0,0 +1,127 @@ +# (c) 2014, Toshio Kuratomi +# +# 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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +""" +Compat module for Python3.x's unittest.mock module +""" +import sys + +# Python 2.7 + +# Note: Could use the pypi mock library on python3.x as well as python2.x. It +# is the same as the python3 stdlib mock library + +try: + # Allow wildcard import because we really do want to import all of mock's + # symbols into this compat shim + # pylint: disable=wildcard-import,unused-wildcard-import + from unittest.mock import * +except ImportError: + # Python 2 + # pylint: disable=wildcard-import,unused-wildcard-import + try: + from mock import * + except ImportError: + print("You need the mock library installed on python2.x to run tests") + + +# Prior to 3.4.4, mock_open cannot handle binary read_data +if sys.version_info >= (3,) and sys.version_info < (3, 4, 4): + file_spec = None + + def _iterate_read_data(read_data): + # Helper for mock_open: + # Retrieve lines from read_data via a generator so that separate calls to + # readline, read, and readlines are properly interleaved + sep = b"\n" if isinstance(read_data, bytes) else "\n" + data_as_list = [l + sep for l in read_data.split(sep)] + + if data_as_list[-1] == sep: + # If the last line ended in a newline, the list comprehension will have an + # extra entry that's just a newline. Remove this. + data_as_list = data_as_list[:-1] + else: + # If there wasn't an extra newline by itself, then the file being + # emulated doesn't have a newline to end the last line remove the + # newline that our naive format() added + data_as_list[-1] = data_as_list[-1][:-1] + + for line in data_as_list: + yield line + + def mock_open(mock=None, read_data=""): + """ + A helper function to create a mock to replace the use of `open`. It works + for `open` called directly or used as a context manager. + + The `mock` argument is the mock object to configure. If `None` (the + default) then a `MagicMock` will be created for you, with the API limited + to methods or attributes available on standard file handles. + + `read_data` is a string for the `read` methoddline`, and `readlines` of the + file handle to return. This is an empty string by default. + """ + + def _readlines_side_effect(*args, **kwargs): + if handle.readlines.return_value is not None: + return handle.readlines.return_value + return list(_data) + + def _read_side_effect(*args, **kwargs): + if handle.read.return_value is not None: + return handle.read.return_value + return type(read_data)().join(_data) + + def _readline_side_effect(): + if handle.readline.return_value is not None: + while True: + yield handle.readline.return_value + for line in _data: + yield line + + global file_spec + if file_spec is None: + import _io + + file_spec = list( + set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))) + ) + + if mock is None: + mock = MagicMock(name="open", spec=open) + + handle = MagicMock(spec=file_spec) + handle.__enter__.return_value = handle + + _data = _iterate_read_data(read_data) + + handle.write.return_value = None + handle.read.return_value = None + handle.readline.return_value = None + handle.readlines.return_value = None + + handle.read.side_effect = _read_side_effect + handle.readline.side_effect = _readline_side_effect() + handle.readlines.side_effect = _readlines_side_effect + + mock.return_value = handle + return mock diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/unittest.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/unittest.py new file mode 100644 index 00000000..df3379b8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/compat/unittest.py @@ -0,0 +1,39 @@ +# (c) 2014, Toshio Kuratomi +# +# 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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +""" +Compat module for Python2.7's unittest module +""" + +import sys + +# Allow wildcard import because we really do want to import all of +# unittests's symbols into this compat shim +# pylint: disable=wildcard-import,unused-wildcard-import +if sys.version_info < (2, 7): + try: + # Need unittest2 on python2.6 + from unittest2 import * + except ImportError: + print("You need unittest2 installed on python2.6.x to run tests") +else: + from unittest import * diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/loader.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/loader.py new file mode 100644 index 00000000..c21188ee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/loader.py @@ -0,0 +1,116 @@ +# (c) 2012-2014, Michael DeHaan +# +# 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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import os + +from ansible.errors import AnsibleParserError +from ansible.parsing.dataloader import DataLoader +from ansible.module_utils._text import to_bytes, to_text + + +class DictDataLoader(DataLoader): + def __init__(self, file_mapping=None): + file_mapping = {} if file_mapping is None else file_mapping + assert type(file_mapping) == dict + + super(DictDataLoader, self).__init__() + + self._file_mapping = file_mapping + self._build_known_directories() + self._vault_secrets = None + + def load_from_file(self, path, cache=True, unsafe=False): + path = to_text(path) + if path in self._file_mapping: + return self.load(self._file_mapping[path], path) + return None + + # TODO: the real _get_file_contents returns a bytestring, so we actually convert the + # unicode/text it's created with to utf-8 + def _get_file_contents(self, path): + path = to_text(path) + if path in self._file_mapping: + return (to_bytes(self._file_mapping[path]), False) + else: + raise AnsibleParserError("file not found: %s" % path) + + def path_exists(self, path): + path = to_text(path) + return path in self._file_mapping or path in self._known_directories + + def is_file(self, path): + path = to_text(path) + return path in self._file_mapping + + def is_directory(self, path): + path = to_text(path) + return path in self._known_directories + + def list_directory(self, path): + ret = [] + path = to_text(path) + for x in list(self._file_mapping.keys()) + self._known_directories: + if x.startswith(path): + if os.path.dirname(x) == path: + ret.append(os.path.basename(x)) + return ret + + def is_executable(self, path): + # FIXME: figure out a way to make paths return true for this + return False + + def _add_known_directory(self, directory): + if directory not in self._known_directories: + self._known_directories.append(directory) + + def _build_known_directories(self): + self._known_directories = [] + for path in self._file_mapping: + dirname = os.path.dirname(path) + while dirname not in ("/", ""): + self._add_known_directory(dirname) + dirname = os.path.dirname(dirname) + + def push(self, path, content): + rebuild_dirs = False + if path not in self._file_mapping: + rebuild_dirs = True + + self._file_mapping[path] = content + + if rebuild_dirs: + self._build_known_directories() + + def pop(self, path): + if path in self._file_mapping: + del self._file_mapping[path] + self._build_known_directories() + + def clear(self): + self._file_mapping = dict() + self._known_directories = [] + + def get_basedir(self): + return os.getcwd() + + def set_vault_secrets(self, vault_secrets): + self._vault_secrets = vault_secrets diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/path.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/path.py new file mode 100644 index 00000000..8db8e041 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/path.py @@ -0,0 +1,10 @@ +from __future__ import absolute_import, division, print_function + +__metaclass__ = type +from ansible_collections.cisco.nxos.tests.unit.compat.mock import MagicMock +from ansible.utils.path import unfrackpath + + +mock_unfrackpath_noop = MagicMock( + spec_set=unfrackpath, side_effect=lambda x, *args, **kwargs: x +) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/procenv.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/procenv.py new file mode 100644 index 00000000..59fc1978 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/procenv.py @@ -0,0 +1,94 @@ +# (c) 2016, Matt Davis +# (c) 2016, Toshio Kuratomi +# +# 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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import sys +import json + +from contextlib import contextmanager +from io import BytesIO, StringIO +from ansible_collections.cisco.nxos.tests.unit.compat import unittest +from ansible.module_utils.six import PY3 +from ansible.module_utils._text import to_bytes + + +@contextmanager +def swap_stdin_and_argv(stdin_data="", argv_data=tuple()): + """ + context manager that temporarily masks the test runner's values for stdin and argv + """ + real_stdin = sys.stdin + real_argv = sys.argv + + if PY3: + fake_stream = StringIO(stdin_data) + fake_stream.buffer = BytesIO(to_bytes(stdin_data)) + else: + fake_stream = BytesIO(to_bytes(stdin_data)) + + try: + sys.stdin = fake_stream + sys.argv = argv_data + + yield + finally: + sys.stdin = real_stdin + sys.argv = real_argv + + +@contextmanager +def swap_stdout(): + """ + context manager that temporarily replaces stdout for tests that need to verify output + """ + old_stdout = sys.stdout + + if PY3: + fake_stream = StringIO() + else: + fake_stream = BytesIO() + + try: + sys.stdout = fake_stream + + yield fake_stream + finally: + sys.stdout = old_stdout + + +class ModuleTestCase(unittest.TestCase): + def setUp(self, module_args=None): + if module_args is None: + module_args = { + "_ansible_remote_tmp": "/tmp", + "_ansible_keep_remote_files": False, + } + + args = json.dumps(dict(ANSIBLE_MODULE_ARGS=module_args)) + + # unittest doesn't have a clean place to use a context manager, so we have to enter/exit manually + self.stdin_swap = swap_stdin_and_argv(stdin_data=args) + self.stdin_swap.__enter__() + + def tearDown(self): + # unittest doesn't have a clean place to use a context manager, so we have to enter/exit manually + self.stdin_swap.__exit__(None, None, None) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/vault_helper.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/vault_helper.py new file mode 100644 index 00000000..b34ae134 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/vault_helper.py @@ -0,0 +1,42 @@ +# 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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible.module_utils._text import to_bytes + +from ansible.parsing.vault import VaultSecret + + +class TextVaultSecret(VaultSecret): + """A secret piece of text. ie, a password. Tracks text encoding. + + The text encoding of the text may not be the default text encoding so + we keep track of the encoding so we encode it to the same bytes.""" + + def __init__(self, text, encoding=None, errors=None, _bytes=None): + super(TextVaultSecret, self).__init__() + self.text = text + self.encoding = encoding or "utf-8" + self._bytes = _bytes + self.errors = errors or "strict" + + @property + def bytes(self): + """The text encoded with encoding, unless we specifically set _bytes.""" + return self._bytes or to_bytes( + self.text, encoding=self.encoding, errors=self.errors + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/yaml_helper.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/yaml_helper.py new file mode 100644 index 00000000..5df30aae --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/mock/yaml_helper.py @@ -0,0 +1,167 @@ +from __future__ import absolute_import, division, print_function + +__metaclass__ = type +import io +import yaml + +from ansible.module_utils.six import PY3 +from ansible.parsing.yaml.loader import AnsibleLoader +from ansible.parsing.yaml.dumper import AnsibleDumper + + +class YamlTestUtils(object): + """Mixin class to combine with a unittest.TestCase subclass.""" + + def _loader(self, stream): + """Vault related tests will want to override this. + + Vault cases should setup a AnsibleLoader that has the vault password.""" + return AnsibleLoader(stream) + + def _dump_stream(self, obj, stream, dumper=None): + """Dump to a py2-unicode or py3-string stream.""" + if PY3: + return yaml.dump(obj, stream, Dumper=dumper) + else: + return yaml.dump(obj, stream, Dumper=dumper, encoding=None) + + def _dump_string(self, obj, dumper=None): + """Dump to a py2-unicode or py3-string""" + if PY3: + return yaml.dump(obj, Dumper=dumper) + else: + return yaml.dump(obj, Dumper=dumper, encoding=None) + + def _dump_load_cycle(self, obj): + # Each pass though a dump or load revs the 'generation' + # obj to yaml string + string_from_object_dump = self._dump_string(obj, dumper=AnsibleDumper) + + # wrap a stream/file like StringIO around that yaml + stream_from_object_dump = io.StringIO(string_from_object_dump) + loader = self._loader(stream_from_object_dump) + # load the yaml stream to create a new instance of the object (gen 2) + obj_2 = loader.get_data() + + # dump the gen 2 objects directory to strings + string_from_object_dump_2 = self._dump_string( + obj_2, dumper=AnsibleDumper + ) + + # The gen 1 and gen 2 yaml strings + self.assertEqual(string_from_object_dump, string_from_object_dump_2) + # the gen 1 (orig) and gen 2 py object + self.assertEqual(obj, obj_2) + + # again! gen 3... load strings into py objects + stream_3 = io.StringIO(string_from_object_dump_2) + loader_3 = self._loader(stream_3) + obj_3 = loader_3.get_data() + + string_from_object_dump_3 = self._dump_string( + obj_3, dumper=AnsibleDumper + ) + + self.assertEqual(obj, obj_3) + # should be transitive, but... + self.assertEqual(obj_2, obj_3) + self.assertEqual(string_from_object_dump, string_from_object_dump_3) + + def _old_dump_load_cycle(self, obj): + """Dump the passed in object to yaml, load it back up, dump again, compare.""" + stream = io.StringIO() + + yaml_string = self._dump_string(obj, dumper=AnsibleDumper) + self._dump_stream(obj, stream, dumper=AnsibleDumper) + + yaml_string_from_stream = stream.getvalue() + + # reset stream + stream.seek(0) + + loader = self._loader(stream) + # loader = AnsibleLoader(stream, vault_password=self.vault_password) + obj_from_stream = loader.get_data() + + stream_from_string = io.StringIO(yaml_string) + loader2 = self._loader(stream_from_string) + # loader2 = AnsibleLoader(stream_from_string, vault_password=self.vault_password) + obj_from_string = loader2.get_data() + + stream_obj_from_stream = io.StringIO() + stream_obj_from_string = io.StringIO() + + if PY3: + yaml.dump( + obj_from_stream, stream_obj_from_stream, Dumper=AnsibleDumper + ) + yaml.dump( + obj_from_stream, stream_obj_from_string, Dumper=AnsibleDumper + ) + else: + yaml.dump( + obj_from_stream, + stream_obj_from_stream, + Dumper=AnsibleDumper, + encoding=None, + ) + yaml.dump( + obj_from_stream, + stream_obj_from_string, + Dumper=AnsibleDumper, + encoding=None, + ) + + yaml_string_stream_obj_from_stream = stream_obj_from_stream.getvalue() + yaml_string_stream_obj_from_string = stream_obj_from_string.getvalue() + + stream_obj_from_stream.seek(0) + stream_obj_from_string.seek(0) + + if PY3: + yaml_string_obj_from_stream = yaml.dump( + obj_from_stream, Dumper=AnsibleDumper + ) + yaml_string_obj_from_string = yaml.dump( + obj_from_string, Dumper=AnsibleDumper + ) + else: + yaml_string_obj_from_stream = yaml.dump( + obj_from_stream, Dumper=AnsibleDumper, encoding=None + ) + yaml_string_obj_from_string = yaml.dump( + obj_from_string, Dumper=AnsibleDumper, encoding=None + ) + + assert yaml_string == yaml_string_obj_from_stream + assert ( + yaml_string + == yaml_string_obj_from_stream + == yaml_string_obj_from_string + ) + assert ( + yaml_string + == yaml_string_obj_from_stream + == yaml_string_obj_from_string + == yaml_string_stream_obj_from_stream + == yaml_string_stream_obj_from_string + ) + assert obj == obj_from_stream + assert obj == obj_from_string + assert obj == yaml_string_obj_from_stream + assert obj == yaml_string_obj_from_string + assert ( + obj + == obj_from_stream + == obj_from_string + == yaml_string_obj_from_stream + == yaml_string_obj_from_string + ) + return { + "obj": obj, + "yaml_string": yaml_string, + "yaml_string_from_stream": yaml_string_from_stream, + "obj_from_stream": obj_from_stream, + "obj_from_string": obj_from_string, + "yaml_string_obj_from_string": yaml_string_obj_from_string, + } diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/conftest.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/conftest.py new file mode 100644 index 00000000..e19a1e04 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/conftest.py @@ -0,0 +1,40 @@ +# Copyright (c) 2017 Ansible Project +# 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 + +import pytest + +from ansible.module_utils.six import string_types +from ansible.module_utils._text import to_bytes +from ansible.module_utils.common._collections_compat import MutableMapping + + +@pytest.fixture +def patch_ansible_module(request, mocker): + if isinstance(request.param, string_types): + args = request.param + elif isinstance(request.param, MutableMapping): + if "ANSIBLE_MODULE_ARGS" not in request.param: + request.param = {"ANSIBLE_MODULE_ARGS": request.param} + if "_ansible_remote_tmp" not in request.param["ANSIBLE_MODULE_ARGS"]: + request.param["ANSIBLE_MODULE_ARGS"][ + "_ansible_remote_tmp" + ] = "/tmp" + if ( + "_ansible_keep_remote_files" + not in request.param["ANSIBLE_MODULE_ARGS"] + ): + request.param["ANSIBLE_MODULE_ARGS"][ + "_ansible_keep_remote_files" + ] = False + args = json.dumps(request.param) + else: + raise Exception( + "Malformed data to the patch_ansible_module pytest fixture" + ) + + mocker.patch("ansible.module_utils.basic._ANSIBLE_ARGS", to_bytes(args)) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/_nxos_ip_interface.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/_nxos_ip_interface.cfg new file mode 100644 index 00000000..3ca37d78 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/_nxos_ip_interface.cfg @@ -0,0 +1,30 @@ +IP Interface Status for VRF "default"(1) +Ethernet2/4, Interface status: protocol-up/link-up/admin-up, iod: 39, + IP address: 192.0.2.1, IP subnet: 1.1.1.0/8 route-preference: 0, tag: 0 + IP broadcast address: 255.255.255.255 + IP multicast groups locally joined: none + IP MTU: 1500 bytes (using link MTU) + IP primary address route-preference: 0, tag: 0 + IP proxy ARP : disabled + IP Local Proxy ARP : disabled + IP multicast routing: disabled + IP icmp redirects: enabled + IP directed-broadcast: disabled + IP Forwarding: disabled + IP icmp unreachables (except port): disabled + IP icmp port-unreachable: enabled + IP unicast reverse path forwarding: none + IP load sharing: none + IP interface statistics last reset: never + IP interface software stats: (sent/received/forwarded/originated/consumed) + Unicast packets : 0/0/0/0/0 + Unicast bytes : 0/0/0/0/0 + Multicast packets : 0/0/0/0/0 + Multicast bytes : 0/0/0/0/0 + Broadcast packets : 0/0/0/0/0 + Broadcast bytes : 0/0/0/0/0 + Labeled packets : 0/0/0/0/0 + Labeled bytes : 0/0/0/0/0 + WCCP Redirect outbound: disabled + WCCP Redirect inbound: disabled + WCCP Redirect exclude: disabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_inventory b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_inventory new file mode 100644 index 00000000..2fb8f120 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_inventory @@ -0,0 +1,53 @@ +NAME: "Chassis", DESCR: "MDS 9710 (10 Slot) Chassis" +PID: DS-C9710 , VID: V01 , SN: JAF1724ADSD + +NAME: "Slot 1", DESCR: "4/8/16/32 Gbps Advanced FC Module" +PID: DS-X9648-1536K9 , VID: V01 , SN: JAE204207TT + +NAME: "Slot 2", DESCR: "1/10/40G IPS,2/4/8/10/16G FC Module" +PID: DS-X9334-K9 , VID: V00 , SN: JAE200806S9 + +NAME: "Slot 3", DESCR: "2/4/8/10/16 Gbps Advanced FC Module" +PID: DS-X9448-768K9 , VID: V01 , SN: JAE180605X5 + +NAME: "Slot 4", DESCR: "2/4/8/10/16 Gbps Advanced FC Module" +PID: DS-X9448-768K9 , VID: V01 , SN: JAE180605XZ + +NAME: "Slot 5", DESCR: "Supervisor Module-3" +PID: DS-X97-SF1-K9 , VID: V01 , SN: JAE172007TK + +NAME: "Slot 6", DESCR: "Supervisor Module-3" +PID: DS-X97-SF1-K9 , VID: V01 , SN: JAE17200573 + +NAME: "Slot 7", DESCR: "4/8/16/32 Gbps Advanced FC Module" +PID: DS-X9648-1536K9 , VID: V01 , SN: JAE203901ZM + +NAME: "Slot 8", DESCR: "1/10/40G IPS,2/4/8/10/16G FC Module" +PID: DS-X9334-K9 , VID: V02 , SN: JAE240306KZ + +NAME: "Slot 11", DESCR: "Fabric card module" +PID: DS-X9710-FAB1 , VID: V01 , SN: JAE172008WA + +NAME: "Slot 12", DESCR: "Fabric card module" +PID: DS-X9710-FAB1 , VID: V01 , SN: JAE172006B7 + +NAME: "Slot 13", DESCR: "Fabric card module" +PID: DS-X9710-FAB1 , VID: V01 , SN: JAE1720069V + +NAME: "Slot 33", DESCR: "MDS 9710 (10 Slot) Chassis Power Supply" +PID: DS-CAC97-3KW , VID: V01 , SN: DTM172005SG + +NAME: "Slot 34", DESCR: "MDS 9710 (10 Slot) Chassis Power Supply" +PID: DS-CAC97-3KW , VID: V01 , SN: DTM172005SH + +NAME: "Slot 35", DESCR: "MDS 9710 (10 Slot) Chassis Power Supply" +PID: DS-CAC97-3KW , VID: V01 , SN: DTM172005JK + +NAME: "Slot 41", DESCR: "MDS 9710 (10 Slot) Chassis Fan Module" +PID: DS-C9710-FAN , VID: V01 , SN: JAF1724ALHP + +NAME: "Slot 42", DESCR: "MDS 9710 (10 Slot) Chassis Fan Module" +PID: DS-C9710-FAN , VID: V01 , SN: JAF1721ALCB + +NAME: "Slot 43", DESCR: "MDS 9710 (10 Slot) Chassis Fan Module" +PID: DS-C9710-FAN , VID: V01 , SN: JAF1721AKRL diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_version b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_version new file mode 100644 index 00000000..22b9f816 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/mds/show_version @@ -0,0 +1,40 @@ +Cisco Nexus Operating System (NX-OS) Software +TAC support: http://www.cisco.com/tac +Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_serie +s_home.html +Copyright (c) 2002-2020, Cisco Systems, Inc. All rights reserved. +The copyrights to certain works contained herein are owned by +other third parties and are used and distributed under license. +Some parts of this software are covered under the GNU Public +License. A copy of the license is available at +http://www.gnu.org/licenses/gpl.html. + +Software + BIOS: version 2.1.18 + loader: version N/A + kickstart: version 8.4(2b) + system: version 8.4(2b) + BIOS compile time: 04/06/20 + kickstart image file is: bootflash:///m9100-s5ek9-kickstart-mz.8.4.2b.bin + kickstart compile time: 9/30/2020 12:00:00 [10/06/2020 13:37:39] + system image file is: bootflash:///m9100-s5ek9-mz.8.4.2b.bin + system compile time: 9/30/2020 12:00:00 [10/06/2020 15:30:06] + + +Hardware + cisco MDS 9148S 16G 48 FC (1 Slot) Chassis ("2/4/8/16 Gbps FC/Supervisor") + Motorola, e500v2 with 4088624 kB of memory. + Processor Board ID JAF1751BGPS + + Device name: sw109-Mini + bootflash: 4001760 kB + +Kernel uptime is 42 day(s), 23 hour(s), 31 minute(s), 29 second(s) + +Last reset at 870592 usecs after Tue Oct 13 17:01:33 2020 + Reason: Reset Requested by CLI command reload + System version: 8.4(2b) + Service: + +plugin + Core Plugin diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_inventory b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_inventory new file mode 100644 index 00000000..128e9410 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_inventory @@ -0,0 +1,8 @@ +NAME: "Chassis", DESCR: "Nexus9000 C9300v Chassis" +PID: N9K-C9300v , VID: , SN: 9UTMKABK3C4 + +NAME: "Slot 1", DESCR: "Nexus 9000v 64 port Ethernet Module" +PID: N9K-X9364v , VID: , SN: 9VUZB48Q0AF + +NAME: "Slot 27", DESCR: "Supervisor Module" +PID: N9K-vSUP , VID: , SN: 9J9LUC1LLV5 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_version b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_version new file mode 100644 index 00000000..109c6cd7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/cliconf/nxos/show_version @@ -0,0 +1,38 @@ +Cisco Nexus Operating System (NX-OS) Software +TAC support: http://www.cisco.com/tac +Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html +Copyright (c) 2002-2019, Cisco Systems, Inc. All rights reserved. +The copyrights to certain works contained herein are owned by +other third parties and are used and distributed under license. +Some parts of this software are covered under the GNU Public +License. A copy of the license is available at +http://www.gnu.org/licenses/gpl.html. + +Nexus 9000v is a demo version of the Nexus Operating System + +Software + BIOS: version + NXOS: version 9.3(3) + BIOS compile time: + NXOS image file is: bootflash:///nxos.9.3.3.bin + NXOS compile time: 12/22/2019 2:00:00 [12/22/2019 14:00:37] + + +Hardware + cisco Nexus9000 C9300v Chassis + Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz with 6087432 kB of memory. + Processor Board ID 9J9LUC1LLV5 + + Device name: nxos-9kv-933 + bootflash: 4287040 kB +Kernel uptime is 2 day(s), 5 hour(s), 5 minute(s), 41 second(s) + +Last reset + Reason: Unknown + System version: + Service: + +plugin + Core Plugin, Ethernet Plugin + +Active Package(s): diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/show_ip_access-list.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/show_ip_access-list.txt new file mode 100644 index 00000000..37be9f7d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl/show_ip_access-list.txt @@ -0,0 +1,227 @@ +{ + "TABLE_ip_ipv6_mac": { + "ROW_ip_ipv6_mac": [ + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-bgp", + "TABLE_seqno": { + "ROW_seqno": [ + { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "src_port_op": "gt", + "src_port1_num": "1024", + "dest_any": "any", + "dest_port_op": "eq", + "dest_port1_str": "bgp", + "dest_port1_num": "179" + }, + { + "seqno": 20, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_str": "bgp", + "src_port1_num": "179", + "dest_any": "any", + "dest_port_op": "gt", + "dest_port1_num": "1024" + } + ] + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-cts", + "TABLE_seqno": { + "ROW_seqno": [ + { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "dest_any": "any", + "dest_port_op": "eq", + "dest_port1_num": "64999" + }, + { + "seqno": 20, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_num": "64999", + "dest_any": "any" + } + ] + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-dhcp", + "TABLE_seqno": { + "ROW_seqno": [ + { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_str": "bootpc", + "src_port1_num": "68", + "dest_any": "any" + }, + { + "seqno": 20, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "src_port_op": "neq", + "src_port1_str": "bootps", + "src_port1_num": "67", + "dest_any": "any", + "dest_port_op": "eq", + "dest_port1_str": "bootps", + "dest_port1_num": "67" + } + ] + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-dhcp-relay-response", + "TABLE_seqno": { + "ROW_seqno": [ + { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_str": "bootps", + "src_port1_num": "67", + "dest_any": "any" + }, + { + "seqno": 20, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "dest_any": "any", + "dest_port_op": "eq", + "dest_port1_str": "bootpc", + "dest_port1_num": "68" + } + ] + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-eigrp", + "TABLE_seqno": { + "ROW_seqno": { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "eigrp", + "src_any": "any", + "dest_any": "any" + } + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-ftp", + "TABLE_seqno": { + "ROW_seqno": [ + { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "dest_any": "any", + "dest_port_op": "eq", + "dest_port1_str": "ftp-data", + "dest_port1_num": "20" + }, + { + "seqno": 20, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "dest_any": "any", + "dest_port_op": "eq", + "dest_port1_str": "ftp", + "dest_port1_num": "21" + }, + { + "seqno": 30, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_str": "ftp-data", + "src_port1_num": "20", + "dest_any": "any" + }, + { + "seqno": 40, + "permitdeny": "permit", + "proto_str": "tcp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_str": "ftp", + "src_port1_num": "21", + "dest_any": "any" + } + ] + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-glbp", + "TABLE_seqno": { + "ROW_seqno": { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "src_port_op": "eq", + "src_port1_num": "3222", + "dest_ip_prefix": "224.0.0.0/24", + "dest_port_op": "eq", + "dest_port1_num": "3222" + } + } + }, + { + "op_ip_ipv6_mac": "ip", + "acl_name": "copp-system-p-acl-hsrp", + "TABLE_seqno": { + "ROW_seqno": [ + { + "seqno": 10, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "dest_ip_prefix": "224.0.0.2/32", + "dest_port_op": "eq", + "dest_port1_num": "1985" + }, + { + "seqno": 20, + "permitdeny": "permit", + "proto_str": "udp", + "src_any": "any", + "dest_ip_prefix": "224.0.0.102/32", + "dest_port_op": "eq", + "dest_port1_num": "1985" + } + ] + } + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/show_running-config_aclmgr.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/show_running-config_aclmgr.txt new file mode 100644 index 00000000..ccf92c99 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interface/show_running-config_aclmgr.txt @@ -0,0 +1,4 @@ +ip access-list ANSIBLE_OUT + 10 permit tcp 192.0.2.1/24 any +interface Ethernet1/41 + ip access-group copp-system-p-acl-bgp out diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/nxos_acl_interfaces.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/nxos_acl_interfaces.cfg new file mode 100644 index 00000000..199244e7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_acl_interfaces/nxos_acl_interfaces.cfg @@ -0,0 +1,2 @@ +interface Ethernet1/2 + ip access-group ACL1v4 out \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N7K.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N7K.cfg new file mode 100644 index 00000000..efe96268 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N7K.cfg @@ -0,0 +1,16 @@ +feature bfd + +bfd echo-interface loopback2 +bfd echo-rx-interval 56 +bfd interval 51 min_rx 52 multiplier 4 +bfd slow-timer 2001 +bfd startup-timer 6 +bfd ipv4 echo-rx-interval 54 +bfd ipv4 interval 54 min_rx 54 multiplier 4 +bfd ipv4 slow-timer 2004 +bfd ipv6 echo-rx-interval 56 +bfd ipv6 interval 56 min_rx 56 multiplier 6 +bfd ipv6 slow-timer 2006 +bfd fabricpath slow-timer 2008 +bfd fabricpath interval 58 min_rx 58 multiplier 8 +bfd fabricpath vlan 2 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N9K.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N9K.cfg new file mode 100644 index 00000000..ab1d2d4a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/N9K.cfg @@ -0,0 +1,13 @@ +feature bfd + +bfd echo-interface loopback2 +bfd echo-rx-interval 56 +bfd interval 51 min_rx 52 multiplier 4 +bfd slow-timer 2001 +bfd startup-timer 6 +bfd ipv4 echo-rx-interval 54 +bfd ipv4 interval 54 min_rx 54 multiplier 4 +bfd ipv4 slow-timer 2004 +bfd ipv6 echo-rx-interval 56 +bfd ipv6 interval 56 min_rx 56 multiplier 6 +bfd ipv6 slow-timer 2006 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bfd_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config.cfg new file mode 100644 index 00000000..f0797ee4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config.cfg @@ -0,0 +1,26 @@ +feature bgp + +router bgp 65535 + router-id 192.168.1.1 + event-history cli size medium + event-history detail + vrf test2 + address-family ipv4 unicast + timers bgp 1 10 + neighbor 1.1.1.1 + neighbor 1.1.1.2 + bfd + neighbor 3.3.3.4 + remove-private-as all + neighbor 3.3.3.5 + address-family ipv4 unicast + maximum-prefix 30 30 + neighbor 5.5.5.5 + peer-type fabric-border-leaf + neighbor 6.6.6.6 + peer-type fabric-external + address-family l2vpn evpn + retain route-target route-map xyz + neighbor 7.7.7.7 + address-family l2vpn evpn + rewrite-evpn-rt-asn diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config_32_bits_as.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config_32_bits_as.cfg new file mode 100644 index 00000000..03db9936 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_bgp/config_32_bits_as.cfg @@ -0,0 +1,6 @@ +feature bgp + +router bgp 65535.65535 + router-id 192.168.1.1 + vrf test + address-family ipv4 unicast diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/show_version.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/show_version.txt new file mode 100644 index 00000000..ba9ae665 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_command/show_version.txt @@ -0,0 +1,68 @@ +Cisco NX-OS Software +Copyright (c) 2002-2016, Cisco Systems, Inc. All rights reserved. +NX-OSv software ("NX-OSv Software") and related documentation, +files or other reference materials ("Documentation") are +the proprietary property and confidential information of Cisco +Systems, Inc. ("Cisco") and are protected, without limitation, +pursuant to United States and International copyright and trademark +laws in the applicable jurisdiction which provide civil and criminal +penalties for copying or distribution without Cisco's authorization. + +Any use or disclosure, in whole or in part, of the NX-OSv Software +or Documentation to any third party for any purposes is expressly +prohibited except as otherwise authorized by Cisco in writing. +The copyrights to certain works contained herein are owned by other +third parties and are used and distributed under license. Some parts +of this software may be covered under the GNU Public License or the +GNU Lesser General Public License. A copy of each such license is +available at +http://www.gnu.org/licenses/gpl.html and +http://www.gnu.org/licenses/lgpl.html +*************************************************************************** +* NX-OSv is strictly limited to use for evaluation, demonstration and * +* NX-OS education. NX-OSv is provided as-is and is not supported by * +* Cisco's Technical Advisory Center. Any use or disclosure, in whole or * +* in part of the NX-OSv Software or Documentation to any third party for * +* any purposes is expressly prohibited except as otherwise authorized by * +* Cisco in writing. * +*************************************************************************** +nxos01# show version +Cisco Nexus Operating System (NX-OS) Software +TAC support: http://www.cisco.com/tac +Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html +Copyright (c) 2002-2016, Cisco Systems, Inc. All rights reserved. +The copyrights to certain works contained herein are owned by +other third parties and are used and distributed under license. +Some parts of this software are covered under the GNU Public +License. A copy of the license is available at +http://www.gnu.org/licenses/gpl.html. + +NX-OSv is a demo version of the Nexus Operating System + +Software + loader: version N/A + kickstart: version 7.3(0)D1(1) + system: version 7.3(0)D1(1) + kickstart image file is: bootflash:///titanium-d1-kickstart.7.3.0.D1.1.bin + kickstart compile time: 1/11/2016 16:00:00 [02/11/2016 10:30:12] + system image file is: bootflash:///titanium-d1.7.3.0.D1.1.bin + system compile time: 1/11/2016 16:00:00 [02/11/2016 13:08:11] + + +Hardware + cisco NX-OSv Chassis ("NX-OSv Supervisor Module") + QEMU Virtual CPU version 2.0 with 3064860 kB of memory. + Processor Board ID TM3E35B910B + + Device name: nxos01 + bootflash: 3184776 kB + +Kernel uptime is 7 day(s), 17 hour(s), 0 minute(s), 23 second(s) + + +plugin + Core Plugin, Ethernet Plugin + +Active Package(s) + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/candidate.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/candidate.cfg new file mode 100644 index 00000000..b11bc93e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/candidate.cfg @@ -0,0 +1,7 @@ +hostname switch01 +! +interface Ethernet1 + description test interface + no shutdown +! +ip routing diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/config.cfg new file mode 100644 index 00000000..6a471371 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_config/config.cfg @@ -0,0 +1,26 @@ +! +hostname localhost +ip domain-name eng.ansible.com +! +vrf definition mgmt +! +vrf definition test +! +interface Management1 + ip address 192.168.1.1/24 +! +interface Ethernet1 + shutdown +! +interface Ethernet2 + shutdown +! +interface Ethernet3 + shutdown +! +interface Ethernet4 + shutdown +! +interface Ethernet5 + shutdown +! diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdadatabse.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdadatabse.cfg new file mode 100644 index 00000000..cc526a71 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdadatabse.cfg @@ -0,0 +1,5 @@ +device-alias name test1_add pwwn 56:02:22:11:22:88:11:67 +device-alias name test2_add pwwn 65:22:22:11:22:22:11:0d +device-alias name tieHost-1 pwwn 10:00:00:00:89:a1:01:01 +device-alias name tieHost-2 pwwn 10:00:00:00:89:a1:01:02 + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus.cfg new file mode 100644 index 00000000..7db88034 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus.cfg @@ -0,0 +1,4 @@ +Fabric Distribution : Enabled +Database:- Device Aliases 3831 Mode: Enhanced + Checksum: 0xdc7b6c6c124abd8fe28cf6a1ab293c + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus_mansi.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus_mansi.cfg new file mode 100644 index 00000000..aa399b64 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatus_mansi.cfg @@ -0,0 +1,4 @@ +Fabric Distribution : Disabled +Database:- Device Aliases 3831 Mode: Basic + Checksum: 0xdc7b6c6c124abd8fe28cf6a1ab293c + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatuslock.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatuslock.cfg new file mode 100644 index 00000000..65cb052f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_devicealias/shdastatuslock.cfg @@ -0,0 +1,6 @@ +Fabric Distribution : Enabled +Database:- Device Aliases 3831 Mode: Enhanced + Checksum: 0xdc7b6c6c124abd8fe28cf6a1ab293c +Locked By:- User "CLI/SNMPv3:admin" SWWN 20:00:54:7f:ee:1b:13:f0 +Pending Database:- Device Aliases 3831 Mode: Enhanced + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/configured.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/configured.cfg new file mode 100644 index 00000000..32504f6b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/configured.cfg @@ -0,0 +1,3 @@ +hostname switch01 +nv overlay evpn + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/unconfigured.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/unconfigured.cfg new file mode 100644 index 00000000..c555eaaf --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_global/unconfigured.cfg @@ -0,0 +1 @@ +hostname switch01 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_vni_config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_vni_config.cfg new file mode 100644 index 00000000..b1c8352f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_evpn_vni_config.cfg @@ -0,0 +1,8 @@ +nv overlay evpn +feature nv overlay + +evpn + vni 6000 l2 + rd auto + route-target import auto + route-target export auto diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/show_feature.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/show_feature.txt new file mode 100644 index 00000000..cf6dbdbd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_feature/show_feature.txt @@ -0,0 +1,4 @@ +Feature Name Instance State +-------------------- -------- ----- +nve 1 disabled +ospf 1 enabled diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface new file mode 100644 index 00000000..f50b8f24 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface @@ -0,0 +1,129 @@ +{ + "TABLE_interface": { + "ROW_interface": [ + { + "interface": "Ethernet2/1", + "state": "up", + "admin_state": "up", + "share_state": "Dedicated", + "eth_hw_desc": "Ethernet", + "eth_hw_addr": "fa16.3e50.6647", + "eth_bia_addr": "fa16.3e50.6619", + "desc": "Test aggregation on first interface", + "eth_mtu": "1500", + "eth_bw": 1000000, + "eth_dly": 10, + "eth_reliability": "255", + "eth_txload": "1", + "eth_rxload": "1", + "medium": "broadcast", + "eth_mode": "routed", + "eth_duplex": "full", + "eth_speed": "1000 Mb/s", + "eth_beacon": "off", + "eth_autoneg": "off", + "eth_in_flowctrl": "off", + "eth_out_flowctrl": "off", + "eth_mdix": "off", + "eth_swt_monitor": "off", + "eth_ethertype": "0x8100", + "eth_eee_state": "n/a", + "eth_link_flapped": "4d15h", + "eth_clear_counters": "never", + "eth_reset_cntr": 87, + "eth_load_interval1_rx": 0, + "eth_inrate1_bits": 0, + "eth_inrate1_pkts": 0, + "eth_load_interval1_tx": 0, + "eth_outrate1_bits": 0, + "eth_outrate1_pkts": 0, + "eth_inrate1_summary_bits": "0 bps", + "eth_inrate1_summary_pkts": "0 pps", + "eth_outrate1_summary_bits": "0 bps", + "eth_outrate1_summary_pkts": "0 pps", + "eth_load_interval2_rx": 0, + "eth_inrate2_bits": 0, + "eth_inrate2_pkts": 0, + "eth_load_interval2_tx": 0, + "eth_outrate2_bits": 0, + "eth_outrate2_pkts": 0, + "eth_inrate2_summary_bits": "0 bps", + "eth_inrate2_summary_pkts": "0 pps", + "eth_outrate2_summary_bits": "0 bps", + "eth_outrate2_summary_pkts": "0 pps", + "eth_inucast": 0, + "eth_inmcast": 0, + "eth_inbcast": 0, + "eth_inpkts": 0, + "eth_inbytes": 0, + "eth_jumbo_inpkts": 0, + "eth_storm_supp": 0, + "eth_runts": 0, + "eth_giants": 0, + "eth_crc": 0, + "eth_nobuf": 0, + "eth_inerr": 0, + "eth_frame": 0, + "eth_overrun": 0, + "eth_underrun": 0, + "eth_ignored": 0, + "eth_watchdog": 0, + "eth_bad_eth": 0, + "eth_bad_proto": 0, + "eth_in_ifdown_drops": 0, + "eth_dribble": 0, + "eth_indiscard": 0, + "eth_inpause": 0, + "eth_outucast": 0, + "eth_outmcast": 0, + "eth_outbcast": 0, + "eth_outpkts": 0, + "eth_outbytes": 0, + "eth_jumbo_outpkts": 0, + "eth_outerr": 0, + "eth_coll": 0, + "eth_deferred": 0, + "eth_latecoll": 0, + "eth_lostcarrier": 0, + "eth_nocarrier": 0, + "eth_babbles": 0, + "eth_outdiscard": 0, + "eth_outpause": 0 + }, + { + "interface": "loopback0", + "state": "up", + "admin_state": "up", + "eth_hw_desc": "Loopback", + "desc": "Loopback", + "eth_ip_addr": "192.168.255.1", + "eth_ip_mask": 32, + "eth_ip_prefix": "192.168.255.1", + "eth_mtu": "1500", + "eth_bw": 8000000, + "eth_dly": 5000, + "eth_reliability": "255", + "eth_txload": "1", + "eth_rxload": "1", + "medium": "broadcast", + "eth_mode": "routed", + "eth_mdix": "off", + "loop_in_pkts": 1451854, + "loop_in_bytes": 75138128, + "loop_in_mcast": 0, + "loop_in_compressed": 0, + "loop_in_errors": 0, + "loop_in_frame": 0, + "loop_in_overrun": 0, + "loop_in_fifo": 0, + "loop_out_pkts": 0, + "loop_out_bytes": 0, + "loop_out_underruns": 0, + "loop_out_errors": 0, + "loop_out_collisions": 0, + "loop_out_fifo": 0, + "loop_out_carriers": 0 + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_Ethernet2_1 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_Ethernet2_1 new file mode 100644 index 00000000..f478350f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_Ethernet2_1 @@ -0,0 +1,96 @@ +{ + "TABLE_interface": { + "ROW_interface": { + "interface": "Ethernet2/1", + "state": "up", + "admin_state": "up", + "share_state": "Dedicated", + "eth_hw_desc": "Ethernet", + "eth_hw_addr": "fa16.3e00.0001", + "eth_bia_addr": "fa16.3e27.f279", + "desc": "to nxos03", + "eth_ip_addr": "10.0.0.45", + "eth_ip_mask": 30, + "eth_ip_prefix": "10.0.0.44", + "eth_mtu": "1500", + "eth_bw": 1000000, + "eth_dly": 10, + "eth_reliability": "255", + "eth_txload": "1", + "eth_rxload": "1", + "medium": "broadcast", + "eth_mode": "routed", + "eth_duplex": "full", + "eth_speed": "1000 Mb/s", + "eth_beacon": "off", + "eth_autoneg": "off", + "eth_in_flowctrl": "off", + "eth_out_flowctrl": "off", + "eth_mdix": "off", + "eth_swt_monitor": "off", + "eth_ethertype": "0x8100", + "eth_eee_state": "n/a", + "eth_link_flapped": "14week(s) 0day(s)", + "eth_clear_counters": "never", + "eth_reset_cntr": 1, + "eth_load_interval1_rx": 0, + "eth_inrate1_bits": 0, + "eth_inrate1_pkts": 0, + "eth_load_interval1_tx": 0, + "eth_outrate1_bits": 0, + "eth_outrate1_pkts": 0, + "eth_inrate1_summary_bits": "0 bps", + "eth_inrate1_summary_pkts": "0 pps", + "eth_outrate1_summary_bits": "0 bps", + "eth_outrate1_summary_pkts": "0 pps", + "eth_load_interval2_rx": 0, + "eth_inrate2_bits": 0, + "eth_inrate2_pkts": 0, + "eth_load_interval2_tx": 0, + "eth_outrate2_bits": 0, + "eth_outrate2_pkts": 0, + "eth_inrate2_summary_bits": "0 bps", + "eth_inrate2_summary_pkts": "0 pps", + "eth_outrate2_summary_bits": "0 bps", + "eth_outrate2_summary_pkts": "0 pps", + "eth_inucast": 0, + "eth_inmcast": 0, + "eth_inbcast": 0, + "eth_inpkts": 0, + "eth_inbytes": 0, + "eth_jumbo_inpkts": 0, + "eth_storm_supp": 0, + "eth_runts": 0, + "eth_giants": 0, + "eth_crc": 0, + "eth_nobuf": 0, + "eth_inerr": 0, + "eth_frame": 0, + "eth_overrun": 0, + "eth_underrun": 0, + "eth_ignored": 0, + "eth_watchdog": 0, + "eth_bad_eth": 0, + "eth_bad_proto": 0, + "eth_in_ifdown_drops": 0, + "eth_dribble": 0, + "eth_indiscard": 0, + "eth_inpause": 0, + "eth_outucast": 0, + "eth_outmcast": 0, + "eth_outbcast": 0, + "eth_outpkts": 0, + "eth_outbytes": 0, + "eth_jumbo_outpkts": 0, + "eth_outerr": 0, + "eth_coll": 0, + "eth_deferred": 0, + "eth_latecoll": 0, + "eth_lostcarrier": 0, + "eth_nocarrier": 0, + "eth_babbles": 0, + "eth_outdiscard": 0, + "eth_outpause": 0 + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_loopback0 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_interface_loopback0 new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_Ethernet2_1 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_Ethernet2_1 new file mode 100644 index 00000000..e60c3b4c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_Ethernet2_1 @@ -0,0 +1,8 @@ +interface Ethernet1/5 + description to csr02 + no switchport + speed 1000 + mtu 1500 + mac-address fa16.3e00.000b + ip address 172.31.0.66/30 + no shutdown diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_loopback0 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface/show_run_interface_loopback0 new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/config.cfg new file mode 100644 index 00000000..2061d4d7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_interface_ospf/config.cfg @@ -0,0 +1,17 @@ +interface Ethernet1/33 +interface Ethernet1/33.101 + ip router ospf 1 area 0.0.0.1 +interface Ethernet1/34 + ip router ospf 1 area 0.0.0.1 + ip ospf passive-interface +interface Ethernet1/35 + ip router ospf 1 area 0.0.0.1 + no ip ospf passive-interface + +interface Ethernet1/36 + ip router ospf 1 area 0.0.0.1 + ip ospf bfd + +interface Ethernet1/37 + ip router ospf 1 area 0.0.0.1 + ip ospf bfd disable diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut new file mode 100644 index 00000000..b0407edc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut @@ -0,0 +1,3 @@ +interface Ethernet1/1 + description Configured by Ansible + no shutdown diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_ipv4_ipv6 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_ipv4_ipv6 new file mode 100644 index 00000000..3e4f1978 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_ipv4_ipv6 @@ -0,0 +1,5 @@ +interface Ethernet1/1 + description Configured by Ansible + ip address 192.168.0.1/24 + ipv6 address 2001:db8::1/124 + no shutdown diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_multiple_ipv6 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_multiple_ipv6 new file mode 100644 index 00000000..9013b134 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_l3_interface/ethernet_noshut_multiple_ipv6 @@ -0,0 +1,7 @@ +interface Ethernet1/1 + description Configured by Ansible + ip address 192.168.0.1/24 + ipv6 address 2001:db8:1::1/124 + ipv6 address 2001:db8:2::1/124 + ipv6 address 2001:db8::1/124 + no shutdown diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/show_run_all b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/show_run_all new file mode 100644 index 00000000..da0dfaa7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n3k/show_run_all @@ -0,0 +1,2 @@ +feature nxapi +nxapi http port 80 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/show_run_all b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/show_run_all new file mode 100644 index 00000000..0c4a3ea5 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_nxapi/n7k/show_run_all @@ -0,0 +1,5 @@ +feature nxapi +nxapi http port 80 +no nxapi https +no nxapi sandbox + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_overlay_global_config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_overlay_global_config.cfg new file mode 100644 index 00000000..45a6ff99 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_overlay_global_config.cfg @@ -0,0 +1 @@ +fabric forwarding anycast-gateway-mac 000B.000B.000B diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/config.cfg new file mode 100644 index 00000000..9771622d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim/config.cfg @@ -0,0 +1,2 @@ +ip pim bfd +ip pim ssm range 127.0.0.0/31 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/config.cfg new file mode 100644 index 00000000..2120e607 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/config.cfg @@ -0,0 +1,11 @@ +!Command: show running-config interface Ethernet2/1 +!Time: Mon Aug 21 17:22:02 2017 + +version 7.3(0)D1(1) + +interface Ethernet2/1 + description Configured by Ansible - Layer3 + no switchport + mac-address fa16.3e00.0006 + ip address 10.0.0.69/30 + no shutdown diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/sh_run_interface_eth2_1_all b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/sh_run_interface_eth2_1_all new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 new file mode 100644 index 00000000..f478350f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 @@ -0,0 +1,96 @@ +{ + "TABLE_interface": { + "ROW_interface": { + "interface": "Ethernet2/1", + "state": "up", + "admin_state": "up", + "share_state": "Dedicated", + "eth_hw_desc": "Ethernet", + "eth_hw_addr": "fa16.3e00.0001", + "eth_bia_addr": "fa16.3e27.f279", + "desc": "to nxos03", + "eth_ip_addr": "10.0.0.45", + "eth_ip_mask": 30, + "eth_ip_prefix": "10.0.0.44", + "eth_mtu": "1500", + "eth_bw": 1000000, + "eth_dly": 10, + "eth_reliability": "255", + "eth_txload": "1", + "eth_rxload": "1", + "medium": "broadcast", + "eth_mode": "routed", + "eth_duplex": "full", + "eth_speed": "1000 Mb/s", + "eth_beacon": "off", + "eth_autoneg": "off", + "eth_in_flowctrl": "off", + "eth_out_flowctrl": "off", + "eth_mdix": "off", + "eth_swt_monitor": "off", + "eth_ethertype": "0x8100", + "eth_eee_state": "n/a", + "eth_link_flapped": "14week(s) 0day(s)", + "eth_clear_counters": "never", + "eth_reset_cntr": 1, + "eth_load_interval1_rx": 0, + "eth_inrate1_bits": 0, + "eth_inrate1_pkts": 0, + "eth_load_interval1_tx": 0, + "eth_outrate1_bits": 0, + "eth_outrate1_pkts": 0, + "eth_inrate1_summary_bits": "0 bps", + "eth_inrate1_summary_pkts": "0 pps", + "eth_outrate1_summary_bits": "0 bps", + "eth_outrate1_summary_pkts": "0 pps", + "eth_load_interval2_rx": 0, + "eth_inrate2_bits": 0, + "eth_inrate2_pkts": 0, + "eth_load_interval2_tx": 0, + "eth_outrate2_bits": 0, + "eth_outrate2_pkts": 0, + "eth_inrate2_summary_bits": "0 bps", + "eth_inrate2_summary_pkts": "0 pps", + "eth_outrate2_summary_bits": "0 bps", + "eth_outrate2_summary_pkts": "0 pps", + "eth_inucast": 0, + "eth_inmcast": 0, + "eth_inbcast": 0, + "eth_inpkts": 0, + "eth_inbytes": 0, + "eth_jumbo_inpkts": 0, + "eth_storm_supp": 0, + "eth_runts": 0, + "eth_giants": 0, + "eth_crc": 0, + "eth_nobuf": 0, + "eth_inerr": 0, + "eth_frame": 0, + "eth_overrun": 0, + "eth_underrun": 0, + "eth_ignored": 0, + "eth_watchdog": 0, + "eth_bad_eth": 0, + "eth_bad_proto": 0, + "eth_in_ifdown_drops": 0, + "eth_dribble": 0, + "eth_indiscard": 0, + "eth_inpause": 0, + "eth_outucast": 0, + "eth_outmcast": 0, + "eth_outbcast": 0, + "eth_outpkts": 0, + "eth_outbytes": 0, + "eth_jumbo_outpkts": 0, + "eth_outerr": 0, + "eth_coll": 0, + "eth_deferred": 0, + "eth_latecoll": 0, + "eth_lostcarrier": 0, + "eth_nocarrier": 0, + "eth_babbles": 0, + "eth_outdiscard": 0, + "eth_outpause": 0 + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 new file mode 100644 index 00000000..e013423b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 @@ -0,0 +1,68 @@ +{ + "TABLE_vrf": { + "ROW_vrf": { + "vrf-name": "default", + "TABLE_iod": { + "ROW_iod": { + "if-name": "Ethernet2/1", + "if-status": "protocol-up/link-up/admin-up", + "if-addr-summary": "IP address: 10.0.0.45, IP subnet: 10.0.0.44/30", + "pim-dr-address": "10.0.0.45", + "dr-priority": 2, + "nbr-cnt": 0, + "hello-interval-sec": 35, + "hello-timer": "PT3S", + "holdtime-sec": 105, + "if-conf-dr-priority": 1, + "if-conf-delay": 3, + "is-border": "true", + "genid": "38c4b959", + "isauth-config": "false", + "nbr-policy-name": "none configured", + "jp-interval": 1, + "jp-next-send": 1, + "pim-bfd-enabled": "no", + "is-passive": "false", + "is-pim-vpc-svi": "no", + "is-auto-enabled": "no", + "last-cleared": "PT0S", + "hello-sent": 23, + "hello-rcvd": 0, + "hello-early-sent": 0, + "jp-sent": 0, + "jp-rcvd": 0, + "assert-sent": 0, + "assert-rcvd": 0, + "graft-sent": 0, + "graft-rcvd": 0, + "graft-ack-sent": 0, + "graft-ack-rcvd": 0, + "df-offer-sent": 0, + "df-offer-rcvd": 0, + "df-winner-sent": 0, + "df-winner-rcvd": 0, + "df-backoff-sent": 0, + "df-backoff-rcvd": 0, + "pass-sent": 0, + "pass-rcvd": 0, + "cksum-errors": 0, + "invalid-errors": 0, + "invalid-df-errors": 0, + "auth-failed": 0, + "pak-len-errors": 0, + "ver-errors": 0, + "pkts-self": 0, + "pkts-non-nbr": 0, + "pkts-on-passive": 0, + "jp-rcvd-on-rpf": 0, + "jp-rcvd-no-rp": 0, + "jp-rcvd-wrong-rp": 0, + "jp-rcvd-for-ssm": 0, + "jp-rcvd-for-bidir": 0, + "jp-in-policy-filter": 0, + "jp-out-policy-filter": 0 + } + } + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/config.cfg new file mode 100644 index 00000000..ca9730ec --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_pim_rp_address/config.cfg @@ -0,0 +1 @@ +ip pim rp-address 1.2.3.4 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_static_route.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_static_route.cfg new file mode 100644 index 00000000..8b1a6fe8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_static_route.cfg @@ -0,0 +1,3 @@ +ip route 10.10.30.0/24 1.2.4.8 +vrf context test + ip route 10.8.0.0/14 15.16.17.18 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet new file mode 100644 index 00000000..60e729b2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet @@ -0,0 +1,97 @@ +{ + "TABLE_interface": { + "ROW_interface": { + "interface": "Ethernet2/1", + "state": "up", + "admin_state": "up", + "share_state": "Dedicated", + "eth_hw_desc": "Ethernet", + "eth_hw_addr": "fa16.3e00.0001", + "eth_bia_addr": "fa16.3e27.f279", + "desc": "to nxos03", + "eth_ip_addr": "10.0.0.45", + "eth_ip_mask": 30, + "eth_ip_prefix": "10.0.0.44", + "eth_mtu": "1500", + "eth_bw": 1000000, + "eth_dly": 10, + "eth_reliability": "255", + "eth_txload": "1", + "eth_rxload": "1", + "medium": "broadcast", + "eth_mode": "access", + "eth_bundle": 0, + "eth_duplex": "full", + "eth_speed": "1000 Mb/s", + "eth_beacon": "off", + "eth_autoneg": "off", + "eth_in_flowctrl": "off", + "eth_out_flowctrl": "off", + "eth_mdix": "off", + "eth_swt_monitor": "off", + "eth_ethertype": "0x8100", + "eth_eee_state": "n/a", + "eth_link_flapped": "13week(s) 0day(s)", + "eth_clear_counters": "never", + "eth_reset_cntr": 1, + "eth_load_interval1_rx": 0, + "eth_inrate1_bits": 0, + "eth_inrate1_pkts": 0, + "eth_load_interval1_tx": 0, + "eth_outrate1_bits": 0, + "eth_outrate1_pkts": 0, + "eth_inrate1_summary_bits": "0 bps", + "eth_inrate1_summary_pkts": "0 pps", + "eth_outrate1_summary_bits": "0 bps", + "eth_outrate1_summary_pkts": "0 pps", + "eth_load_interval2_rx": 0, + "eth_inrate2_bits": 0, + "eth_inrate2_pkts": 0, + "eth_load_interval2_tx": 0, + "eth_outrate2_bits": 0, + "eth_outrate2_pkts": 0, + "eth_inrate2_summary_bits": "0 bps", + "eth_inrate2_summary_pkts": "0 pps", + "eth_outrate2_summary_bits": "0 bps", + "eth_outrate2_summary_pkts": "0 pps", + "eth_inucast": 0, + "eth_inmcast": 0, + "eth_inbcast": 0, + "eth_inpkts": 0, + "eth_inbytes": 0, + "eth_jumbo_inpkts": 0, + "eth_storm_supp": 0, + "eth_runts": 0, + "eth_giants": 0, + "eth_crc": 0, + "eth_nobuf": 0, + "eth_inerr": 0, + "eth_frame": 0, + "eth_overrun": 0, + "eth_underrun": 0, + "eth_ignored": 0, + "eth_watchdog": 0, + "eth_bad_eth": 0, + "eth_bad_proto": 0, + "eth_in_ifdown_drops": 0, + "eth_dribble": 0, + "eth_indiscard": 0, + "eth_inpause": 0, + "eth_outucast": 0, + "eth_outmcast": 0, + "eth_outbcast": 0, + "eth_outpkts": 0, + "eth_outbytes": 0, + "eth_jumbo_outpkts": 0, + "eth_outerr": 0, + "eth_coll": 0, + "eth_deferred": 0, + "eth_latecoll": 0, + "eth_lostcarrier": 0, + "eth_nocarrier": 0, + "eth_babbles": 0, + "eth_outdiscard": 0, + "eth_outpause": 0 + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet_switchport b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet_switchport new file mode 100644 index 00000000..352da5e7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_interface_ethernet_switchport @@ -0,0 +1,14 @@ +{ + "TABLE_interface": { + "ROW_interface": { + "interface": "Ethernet2/1", + "oper_mode": "access", + "switchport": "Enabled", + "access_vlan": 2, + "access_vlan_name": "VLAN2", + "native_vlan": 10, + "native_vlan_name": "VLAN10", + "trunk_vlans": "1-50" + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_vlan b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_vlan new file mode 100644 index 00000000..407267bb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_switchport/show_vlan @@ -0,0 +1,18 @@ +{ + "TABLE_vlanbrief": { + "ROW_vlanbrief": { + "vlanshowbr-vlanid": 1, + "vlanshowbr-vlanid-utf": 1, + "vlanshowbr-vlanname": "VLAN1", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + } + }, + "TABLE_mtuinfo": { + "ROW_mtuinfo": { + "vlanshowinfo-vlanid": 1, + "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/config.cfg new file mode 100644 index 00000000..362b7332 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/config.cfg @@ -0,0 +1,16 @@ +hostname nxos01 +system jumbomtu 1500 +! +no ip domain-lookup +ip domain-name ansible.com +ip domain-list ansible.com +ip domain-list redhat.com +ip name-server 8.8.8.8 172.26.1.1 +! +vrf context management + ip domain-name eng.ansible.com + ip domain-list ansible.com + ip domain-list redhat.com + ip name-server 172.26.1.1 8.8.8.8 + ip route 172.26.0.0/16 172.26.4.1 + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/vrf_only/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/vrf_only/config.cfg new file mode 100644 index 00000000..2b039f57 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_system/vrf_only/config.cfg @@ -0,0 +1,4 @@ +vrf context test + ip domain-name abc.com +vrf context test2 + ip domain-name xyz.com \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K.cfg new file mode 100644 index 00000000..697c2c18 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K.cfg @@ -0,0 +1,43 @@ +feature telemetry + +telemetry + certificate /bootflash/server.key localhost + destination-profile + use-vrf management + use-compression gzip + source-interface loopback55 + destination-group 2 + ip address 192.168.0.1 port 50001 protocol gRPC encoding GPB + ip address 192.168.0.2 port 60001 protocol gRPC encoding GPB + destination-group 10 + ip address 192.168.0.1 port 50001 protocol gRPC encoding GPB + ip address 192.168.0.2 port 60001 protocol gRPC encoding GPB + sensor-group 2 + data-source DME + path boo depth 0 + path sys/ospf depth 0 query-condition qc filter-condition fc + path interfaces depth 0 + path sys/bgp + path sys/bgp/inst depth 0 query-condition foo filter-condition foo + path sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11] + path sys/bgp/inst/dom-default/peer-[20.20.20.11]/ent-[20.20.20.11] + path too depth 0 filter-condition foo + sensor-group 55 + sensor-group 56 + data-source DME + path environment + path interface + path resources + path vxlan + subscription 3 + subscription 4 + dst-grp 2 + snsr-grp 2 sample-interval 1000 + subscription 5 + dst-grp 2 + snsr-grp 2 sample-interval 1000 + subscription 6 + dst-grp 10 + subscription 7 + dst-grp 10 + snsr-grp 2 sample-interval 1000 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K_SGs.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K_SGs.cfg new file mode 100644 index 00000000..1729ad81 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/N9K_SGs.cfg @@ -0,0 +1,19 @@ +feature telemetry + +telemetry + sensor-group 1 + path sys/ch depth 4 + path sys/procsys depth 1 + sensor-group 2 + data-source NX-API + path "show bgp l2vpn evpn summary" + path "show isis adjacency" + path "show mac address-table count" depth 2 + path "show bgp sessions" + sensor-group 3 + data-source NX-API + path "show interface ethernet1/1-52" + sensor-group 4 + path sys/bd depth 2 + path sys/eps/epId-1/nws depth 2 + path sys/eps/epId-1/peers depth 2 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_telemetry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/agg_show_vlan_brief.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/agg_show_vlan_brief.txt new file mode 100644 index 00000000..4ba12553 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/agg_show_vlan_brief.txt @@ -0,0 +1,27 @@ +{ + "TABLE_vlanbriefxbrief": { + "ROW_vlanbriefxbrief": [ + { + "vlanshowbr-vlanid": 1, + "vlanshowbr-vlanid-utf": 1, + "vlanshowbr-vlanname": "default", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { + "vlanshowbr-vlanid": 4, + "vlanshowbr-vlanid-utf": 4, + "vlanshowbr-vlanname": "_4_", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { + "vlanshowbr-vlanid": 5, + "vlanshowbr-vlanid-utf": 5, + "vlanshowbr-vlanname": "_5_", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/config.cfg new file mode 100644 index 00000000..905d309f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/config.cfg @@ -0,0 +1,4 @@ +vlan 1 + mode ce + state active + no shutdown diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/show_vlan_brief.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/show_vlan_brief.txt new file mode 100644 index 00000000..ca90e5d4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlan/show_vlan_brief.txt @@ -0,0 +1,11 @@ +{ + "TABLE_vlanbriefxbrief": { + "ROW_vlanbriefxbrief": { + "vlanshowbr-vlanid": 16777216, + "vlanshowbr-vlanid-utf": 1, + "vlanshowbr-vlanname": "default", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config new file mode 100644 index 00000000..51e64c99 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config @@ -0,0 +1,13 @@ +vlan 1,3-5,8 +vlan 3 + name test-vlan3 +vlan 5 + shutdown + name test-changeme + mode fabricpath + state suspend + vn-segment 942 +vlan 8 + shutdown + name test-changeme-not + state suspend diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config_no_facts b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config_no_facts new file mode 100644 index 00000000..ef66a7ff --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_running-config_no_facts @@ -0,0 +1 @@ +! no data diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan new file mode 100644 index 00000000..9d53309f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan @@ -0,0 +1,45 @@ +{ + "TABLE_vlanbrief": { + "ROW_vlanbrief": [ + { "vlanshowbr-vlanid": "1", "vlanshowbr-vlanid-utf": "1", + "vlanshowbr-vlanname": "default", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { "vlanshowbr-vlanid": "3", "vlanshowbr-vlanid-utf": "3", + "vlanshowbr-vlanname": "test-vlan3", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { "vlanshowbr-vlanid": "4", "vlanshowbr-vlanid-utf": "4", + "vlanshowbr-vlanname": "VLAN0004", + "vlanshowbr-vlanstate": "active", + "vlanshowbr-shutstate": "noshutdown" + }, + { "vlanshowbr-vlanid": "5", "vlanshowbr-vlanid-utf": "5", + "vlanshowbr-vlanname": "test-changeme", + "vlanshowbr-vlanstate": "suspend", + "vlanshowbr-shutstate": "shutdown" + }, + { "vlanshowbr-vlanid": "8", "vlanshowbr-vlanid-utf": "8", + "vlanshowbr-vlanname": "test-changeme-not", + "vlanshowbr-vlanstate": "suspend", + "vlanshowbr-shutstate": "shutdown" + } + ] + }, + "TABLE_mtuinfo": { + "ROW_mtuinfo": [ + { "vlanshowinfo-vlanid": "1", "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" }, + { "vlanshowinfo-vlanid": "3", "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" }, + { "vlanshowinfo-vlanid": "4", "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" }, + { "vlanshowinfo-vlanid": "5", "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "fabricpath-vlan" }, + { "vlanshowinfo-vlanid": "8", "vlanshowinfo-media-type": "enet", + "vlanshowinfo-vlanmode": "ce-vlan" } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan_no_facts b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan_no_facts new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vlans/show_vlan_no_facts @@ -0,0 +1 @@ +{} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vpc b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vpc new file mode 100644 index 00000000..7d2c2eae --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vpc @@ -0,0 +1,20 @@ +{ + "vpc-domain-id": "not configured", + "vpc-peer-status": "peer-not-configured", + "vpc-peer-status-reason": "SUCCESS", + "vpc-peer-keepalive-status": "disabled", + "vpc-peer-consistency": "inconsistent", + "vpc-peer-consistency-status": "SYSERR_MCECM_MCT_DOES_NOT_EXISTS", + "vpc-per-vlan-peer-consistency": "inconsistent", + "vpc-type-2-consistency": "inconsistent", + "vpc-type-2-consistency-status": "SYSERR_MCECM_MCT_DOES_NOT_EXISTS", + "vpc-role": "none-established", + "num-of-vpcs": "0", + "peer-gateway": "disabled", + "dual-active-excluded-vlans": "-", + "vpc-graceful-consistency-check-status": "enabled", + "vpc-auto-recovery-status": "Enabled (timeout = 240 seconds)", + "operational-l3-peer": "disabled", + "vpc-isolation-status": "disabled-user", + "vpc-check-consist-note": "disabled" +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vrf_all b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vrf_all new file mode 100644 index 00000000..838190fb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/show_vrf_all @@ -0,0 +1,30 @@ +{ + "TABLE_vrf": { + "ROW_vrf": [ + { + "vrf_name": "coke", + "vrf_id": 4, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "default", + "vrf_id": 1, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "management", + "vrf_id": 2, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "test-vrf", + "vrf_id": 3, + "vrf_state": "Up", + "vrf_reason": "--" + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_hardware b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_hardware new file mode 100644 index 00000000..612a6b3d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_hardware @@ -0,0 +1,3 @@ +{ + "kickstart_ver_str": "7.0(3)I5(3)" +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_inventory b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_inventory new file mode 100644 index 00000000..c1a149dd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_inventory @@ -0,0 +1,13 @@ +{ + "TABLE_inv": { + "ROW_inv": [ + { + "name": "Chassis", + "desc": "Nexus9000 C9504 (4 Slot) Chassis", + "productid": "N9K-C9504", + "vendorid": "V01", + "serialnum": "BR-549" + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vpc b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vpc new file mode 100644 index 00000000..f86daa6b --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vpc @@ -0,0 +1,3 @@ +{ + "vpc-domain-id": "100" +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vrf_all b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vrf_all new file mode 100644 index 00000000..3f56f8ad --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_show_vrf_all @@ -0,0 +1,36 @@ +{ + "TABLE_vrf": { + "ROW_vrf": [ + { + "vrf_name": "my_vrf", + "vrf_id": 4, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "default", + "vrf_id": 1, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "management", + "vrf_id": 2, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "test-vrf", + "vrf_id": 3, + "vrf_state": "Up", + "vrf_reason": "--" + }, + { + "vrf_name": "obviously-different-vrf", + "vrf_id": 4, + "vrf_state": "Up", + "vrf_reason": "--" + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_vpc_config b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_vpc_config new file mode 100644 index 00000000..e7258296 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc/vrf_test_vpc_config @@ -0,0 +1,2 @@ +vpc domain 100 + peer-keepalive destination 192.168.1.1 source 10.1.1.1 vrf my_vrf diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_port-channel_summary b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_port-channel_summary new file mode 100644 index 00000000..d62bea66 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_port-channel_summary @@ -0,0 +1,22 @@ +{ + "TABLE_channel": { + "ROW_channel": [ + { + "group": "10", + "port-channel": "port-channel10", + "layer": "R", + "status": "D", + "type": "Eth", + "prtcl": "NONE" + }, + { + "group": "20", + "port-channel": "port-channel20", + "layer": "R", + "status": "D", + "type": "Eth", + "prtcl": "NONE" + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_vpc_brief b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_vpc_brief new file mode 100644 index 00000000..2206eca0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vpc_interface/show_vpc_brief @@ -0,0 +1,14 @@ +{ + "TABLE_vpc": { + "ROW_vpc": [ + { + "vpc-id": 100, + "vpc-ifindex": "Po10", + "vpc-port-state": "Up", + "vpc-thru-peerlink": 19, + "vpc-consistency": "consistent", + "vpc-consistency-status": "SUCCESS" + } + ] + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_run_all b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_run_all new file mode 100644 index 00000000..06fe9f91 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_run_all @@ -0,0 +1,4 @@ +vrf context coke +vrf context management + ip route 172.26.0.0/16 172.26.4.1 +vrf context test-vrf diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default_interface b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_default_interface new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management new file mode 100644 index 00000000..2b6e9b52 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management @@ -0,0 +1,10 @@ +{ + "TABLE_vrf": { + "ROW_vrf": { + "vrf_name": "management", + "vrf_id": 2, + "vrf_state": "Up", + "vrf_reason": "--" + } + } +} diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management_interface b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_management_interface new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc_interface b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf/show_vrf_ntc_interface new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/config.cfg new file mode 100644 index 00000000..1ac093f7 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vrf_af/config.cfg @@ -0,0 +1,22 @@ +vrf context vrf1 + address-family ipv4 unicast + +vrf context vrf11 + address-family ipv4 unicast + route-target both auto evpn + +vrf context vrf21 + address-family ipv4 unicast + route-target import 65000:1000 + route-target import 65001:1000 + route-target import 65002:1000 + route-target export 65000:1000 + route-target export 65001:1000 + route-target export 65002:1000 + +vrf context vrf31 + address-family ipv4 unicast + route-target import 65000:1000 + route-target export 65001:1000 + route-target import 65002:1000 + route-target export 65003:1000 \ No newline at end of file diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsan.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsan.cfg new file mode 100644 index 00000000..035351a9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsan.cfg @@ -0,0 +1,35 @@ +vsan 1 information + name:VSAN0001 state:active + interoperability mode:default + loadbalancing:src-id/dst-id/oxid + operational state:up + +vsan 10 information + name:VsanAll state:suspended + interoperability mode:default + loadbalancing:src-id/dst-id/oxid + operational state:down + +vsan 221 information + name:VSAN0221 state:active + interoperability mode:default + loadbalancing:src-id/dst-id/oxid + operational state:up + +vsan 922 information + name:vsan-SAN-A state:active + interoperability mode:default + loadbalancing:src-id/dst-id/oxid + operational state:down + +vsan 923 information + name:vsan-SAN-B state:active + interoperability mode:default + loadbalancing:src-id/dst-id/oxid + operational state:up + +vsan 4079:evfp_isolated_vsan + +vsan 4094:isolated_vsan + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsanmem.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsanmem.cfg new file mode 100644 index 00000000..c57c72a2 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vsan/shvsanmem.cfg @@ -0,0 +1,30 @@ +vsan 1 interfaces: + fc1/4 fc1/5 fc1/6 fc1/7 + fc1/8 fc1/9 fc1/10 fc1/12 + fc1/13 fc1/14 fc1/15 fc1/16 + fc1/17 fc1/18 fc1/19 fc1/20 + fc1/22 fc1/23 fc1/24 fc1/25 + fc1/26 fc1/27 fc1/28 fc1/29 + fc1/30 fc1/31 fc1/32 fc1/33 + fc1/34 fc1/35 fc1/36 fc1/37 + fc1/38 fc1/39 fc1/40 + +vsan 10 interfaces: + + +vsan 221 interfaces: + + +vsan 922 interfaces: + fc1/1 fc1/2 fc1/3 port-channel55 + +vsan 923 interfaces: + fc1/11 fc1/21 port-channel56 + +vsan 4079(evfp_isolated_vsan) interfaces: + + +vsan 4094(isolated_vsan) interfaces: + port-channel145 + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/config.cfg new file mode 100644 index 00000000..acc2da73 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep/config.cfg @@ -0,0 +1,3 @@ +interface nve1 + member vni 6000 + multisite border-gateway interface loopback1 diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/config.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/config.cfg new file mode 100644 index 00000000..2532ecf9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_vxlan_vtep_vni/config.cfg @@ -0,0 +1,3 @@ +interface nve1 + member vni 6000 + multisite ingress-replication optimized diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_status_vsan.out b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_status_vsan.out new file mode 100644 index 00000000..890b4a09 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_status_vsan.out @@ -0,0 +1,22 @@ +VSAN: 50 default-zone: deny distribute: full Interop: default + mode: basic merge-control: allow + session: none + hard-zoning: enabled broadcast: unsupported + smart-zoning: disabled + rscn-format: fabric-address + activation overwrite control: disabled +Default zone: + qos: none broadcast: unsupported ronly: unsupported +Full Zoning Database : + DB size: 31812 bytes + Zonesets:1 Zones:134 Aliases: 106 +Active Zoning Database : + DB size: 10808 bytes + Name: z50_csphfab1_zoneset Zonesets:1 Zones:134 +Current Total Zone DB Usage: 42620 / 4000000 bytes (1 % used) +Pending (Session) DB size: + Full DB Copy size: n/a + Active DB Copy size: n/a +SFC size: 42620 / 4000000 bytes (1 % used) +Status: Activation completed at 22:19:08 PDT Apr 13 2020 + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_vsan.out b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_vsan.out new file mode 100644 index 00000000..3dfc77d3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zone_vsan.out @@ -0,0 +1,946 @@ +zone name z50_azusant_f0_unity8174_spa1 vsan 50 + pwwn c0:50:76:09:5b:20:00:64 [azusant_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azplcbsx000652_san01-azsncbsx01_0ac vsan 50 + fcalias name azplcbsx000652_san01 vsan 50 + pwwn 21:00:f4:e9:d4:57:6e:66 [azplcbsx000652_san01] + + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + +zone name z50_azplcbsx000653_san01-azsncbsx01_0ac vsan 50 + fcalias name azplcbsx000653_san01 vsan 50 + pwwn 21:00:f4:e9:d4:54:a7:c8 [azplcbsx000653_san01] + + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + +zone name z50_azplwebodb01_f0_unity1773_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azplwebdb01_f0 vsan 50 + pwwn 21:00:00:24:ff:0c:58:37 [azplwebodb01_f0] + +zone name z50_azpwvnasql1_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpwvnasql1_f0 vsan 50 + pwwn 21:00:00:24:ff:0d:26:68 [azpwvnasql1_f0] + +zone name z50_azplcbsx000652_san01-azsncbsx02_0ac vsan 50 + fcalias name azplcbsx000652_san01 vsan 50 + pwwn 21:00:f4:e9:d4:57:6e:66 [azplcbsx000652_san01] + + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + +zone name z50_azplcbsx000653_san01-azsncbsx02_0ac vsan 50 + fcalias name azplcbsx000653_san01 vsan 50 + pwwn 21:00:f4:e9:d4:54:a7:c8 [azplcbsx000653_san01] + + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + +zone name z50_azpwovd01_A001_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a2:a0:01 [azpwovd01_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azplocat02_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azplocat02_f0 vsan 50 + pwwn 21:00:00:24:ff:01:18:5f [azplocat02_f0] + +zone name z50_azpe123_A03B_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3b [azpe123_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpe001_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpe001_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1d [azpe001_f0] + +zone name z50_azpe123_A03B_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3b [azpe123_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azuqaunx_f1_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azuqaunx_01_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:0e [azuqaunx-01_f0] + pwwn c0:50:76:09:5b:20:00:0f + +zone name z50_azplcbsx000309_san01-azsncbsx01_0ac vsan 50 + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + + fcalias name azplcbsx000309_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f3:e6 [azplcbsx000309_san01] + +zone name z50_azpe002_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpe002_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1e [azpe002_f0] + +zone name z50_azpe122_A03A_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3a [azpe122_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpe122_A03A_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3a [azpe122_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azulaba_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azulaba_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:30 + pwwn c0:50:76:09:5b:20:00:31 + +zone name z50_azulaba_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azulaba_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:34 [azulaba_f2] + pwwn c0:50:76:09:5b:20:00:35 + +zone name z50_azlonbasep1_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azlonbasep1_f0 vsan 50 + pwwn 21:00:00:24:ff:01:78:b0 [azlonbasep1_f0] + +zone name z50_azplcbsx000309_san01-azsncbsx02_0ac vsan 50 + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + + fcalias name azplcbsx000309_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f3:e6 [azplcbsx000309_san01] + +zone name z50_azplcslrpa1_f0_unity1773 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azplcslrpa1-1_f0 vsan 50 + pwwn 50:01:24:80:0b:50:46:03 [azplcslrpa1-1_f0] + + fcalias name azplcslrpa1-2_f0 vsan 50 + pwwn 50:01:24:80:00:a0:46:03 [azplcslrpa1-2_f0] + + fcalias name azplcslrpa1-4_f0 vsan 50 + pwwn 50:01:24:80:09:c0:66:03 [azplcslrpa1-4_f0] + + fcalias name azplcslrpa1-3_f0 vsan 50 + pwwn 50:01:24:80:0f:d0:46:03 [azplcslrpa1-3_f0] + +zone name z50_azpe120_A038_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:38 [azpe120_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpe120_A038_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:38 [azpe120_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpe121_A039_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:39 [azpe121_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azplcbsx000310_san01-azsncbsx01_0ac vsan 50 + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + + fcalias name azplcbsx000310_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f4:4a [azplcbsx000310_san01] + +zone name z50_azplcbsx000310_san01-azsncbsx02_0ac vsan 50 + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + + fcalias name azplcbsx000310_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f4:4a [azplcbsx000310_san01] + +zone name z50_azpe121_A039_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:39 [azpe121_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx48_A036_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:36 [azpesxctx48_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx48_A036_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:36 [azpesxctx48_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx50_A033_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:33 [azpesxctx50_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azuqaunx_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azuqaunx_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx50_A033_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:33 [azpesxctx50_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx46_A034_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:34 [azpesxctx46_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx46_A034_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:34 [azpesxctx46_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx47_A035_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:35 [azpesxctx47_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azplepicbu01_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azplepicbu01_f0 vsan 50 + pwwn 20:ff:00:25:b5:a3:a0:02 [azplepicbu01_f0] + +zone name z50_azxe01p_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azxe01p_f0 vsan 50 + pwwn 21:00:00:24:ff:03:0f:ae [azxe01p_f0] + +zone name z50_azxe02p_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azxe02p_f0 vsan 50 + pwwn 21:00:00:24:ff:03:10:69 [azxe02p_f0] + +zone name z50_azpesxclin01_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxclin01_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:02 [azpesxclin01_f0] + +zone name z50_azpesxclin02_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxclin02_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:03 [azpesxclin02_f0] + +zone name z50_azpesxclin03_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxclin03_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:01 [azpesxclin03_f0] + +zone name z50_azpesxctx01_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx01_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:04 [azpesxctx01_f0] + +zone name z50_azpesxctx02_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx02_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:05 [azpesxctx02_f0] + +zone name z50_azpesxctx03_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx03_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:06 [azpesxctx03_f0] + +zone name z50_azpesxctx04_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx04_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:07 [azpesxctx04_f0] + +zone name z50_azpesxctx05_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx05_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:08 [azpesxctx05_f0] + +zone name z50_azpesxctx06_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx06_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:09 [azpesxctx06_f0] + +zone name z50_azpesxctx07_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx07_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0a [azpesxctx07_f0] + +zone name z50_azpesxctx08_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx08_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0b [azpesxctx08_f0] + +zone name z50_azpesxctx09_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx09_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0c [azpesxctx09_f0] + +zone name z50_azpesxctx10_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx10_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0d [azpesxctx10_f0] + +zone name z50_azpesxctx11_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx11_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0e [azpesxctx11_f0] + +zone name z50_azpesxctx12_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx12_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0f [azpesxctx12_f0] + +zone name z50_azpesxctx13_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx13_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:10 [azpesxctx13_f0] + +zone name z50_azpesxctx14_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx14_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:11 [azpesxctx14_f0] + +zone name z50_azpesxctx15_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx15_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:12 [azpesxctx15_f0] + +zone name z50_azpesxctx16_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx16_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:13 [azpesxctx16_f0] + +zone name z50_azpesxctx17_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx17_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:14 [azpesxctx17_f0] + +zone name z50_azpesxctx18_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx18_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:15 [azpesxctx18_f0] + +zone name z50_azpesxctx19_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx19_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:16 [azpesxctx19_f0] + +zone name z50_azpesxctx20_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx20_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:17 [azpesxctx20_f0] + +zone name z50_azpesxctx21_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx21_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:18 [azpesxctx21_f0] + +zone name z50_azpesxctx22_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx22_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:19 [azpesxctx22_f0] + +zone name z50_azpesxctx23_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx23_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1b [azpesxctx23_f0] + +zone name z50_azpesxctx24_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx24_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1a [azpesxctx24_f0] + +zone name z50_azpesxctx25_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx25_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1c [azpesxctx25_f0] + +zone name z50_azpesxpci01-x_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxpci01-x_f0 vsan 50 + pwwn 21:00:00:24:ff:10:02:00 [azpesxpci01-x_f0] + +zone name z50_azxe01p_0FAE_8174_spb_iom_1_fc2 vsan 50 + pwwn 21:00:00:24:ff:03:0f:ae [azxe01p_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azxe02p_1069_8174_spb_iom_1_fc2 vsan 50 + pwwn 21:00:00:24:ff:03:10:69 [azxe02p_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpe001_A01D_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1d [azpe001_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpe002_A01E_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1e [azpe002_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx47_A035_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:35 [azpesxctx47_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx49_A037_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:37 [azpesxctx49_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx49_A037_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:37 [azpesxctx49_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx26_A027_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:27 [azpesxctx26_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx26_A027_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:27 [azpesxctx26_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx28_A02B_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2b [azpesxctx28_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx28_A02B_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2b [azpesxctx28_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx31_A021_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:21 [azpesxctx31_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx31_A021_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:21 [azpesxctx31_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx32_A023_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:23 [azpesxctx32_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx32_A023_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:23 [azpesxctx32_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx29_A02D_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2d [azpesxctx29_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx29_A02D_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2d [azpesxctx29_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx33_A024_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:24 [azpesxctx33_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx33_A024_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:24 [azpesxctx33_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx30_A01F_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1f [azpesxctx30_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx30_A01F_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1f [azpesxctx30_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx27_A029_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:29 [azpesxctx27_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx27_A029_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:29 [azpesxctx27_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx35_A026_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:26 [azpesxctx35_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx35_A026_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:26 [azpesxctx35_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx37_A02A_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2a [azpesxctx37_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx37_A02A_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2a [azpesxctx37_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx38_A02C_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2c [azpesxctx38_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx38_A02C_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2c [azpesxctx38_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx40_A020_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:20 [azpesxctx40_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx40_A020_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:20 [azpesxctx40_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx34_A025_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:25 [azpesxctx34_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx34_A025_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:25 [azpesxctx34_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx41_A022_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:22 [azpesxctx41_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx41_A022_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:22 [azpesxctx41_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx42_A02F_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2f [azpesxctx42_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx42_A02F_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2f [azpesxctx42_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx36_A028_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:28 [azpesxctx36_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx36_A028_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:28 [azpesxctx36_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx43_A030_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:30 [azpesxctx43_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx43_A030_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:30 [azpesxctx43_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx44_A031_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:31 [azpesxctx44_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx44_A031_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:31 [azpesxctx44_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azpesxctx45_A032_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:32 [azpesxctx45_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + +zone name z50_azpesxctx45_A032_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:32 [azpesxctx45_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + +zone name z50_azpesxctx39_A02E_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2e [azpesxctx39_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + +zone name z50_azpesxctx39_A02E_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2e [azpesxctx39_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + +zone name z50_azunim1_f0_unity8714_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azunim1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:10 [azunim1_f0] + +zone name z50_azunim1_f2_unity8714_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azunim1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:14 [azunim1_f2] + +zone name z50_azusant_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azusant_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:60 [azusant_f2] + +zone name z50_azucdrdb1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azucdrdb1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:3a [azucdrdb1_f0] + +zone name z50_azucdrdb1_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azucdrdb1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:3e [azucdrdb1_f2] + +zone name z50_azpups01_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azupsp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:1a [azupsp1_f0] + +zone name z50_azupsdbp1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azupsdbp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:20 [azupsdbp1_f0] + +zone name z50_azupsdbp1_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azupsdbp1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:24 [azupsdbp1_f2] + +zone name z50_azucdrsr1_f0_unity1773_spa3 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azucdrsr1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:44 [azucdrsr1_f0] + +zone name z50_azudbas1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azudbas1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:4a [azudbas1_f0] + +zone name z50_azudbas1_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azudbas1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:4e [azudbas1_f2] + +zone name z50_azukronp1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azukronp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:2a [azukronp1_f0] + +zone name z50_azukronp1_f00_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azukronp1_f00 vsan 50 + pwwn c0:50:76:09:5b:20:00:2e [azukronp1_f00] + +zone name z50_azpups01_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azupsp1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:1e [azupsp1_f2] + +zone name z50_azucdrsr1_f2_unity1773_spb2 vsan 50 + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azucdrsr1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:40 [azucdrsr1_f2] + +zone name z50_azuepicclarp1_f0_unity8174_spa3 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azuepicclarp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:50 [azuepicclarp1_f0] + +zone name z50_azuepicclarp1_f2_unity8174_spb2 vsan 50 + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azuepicclarp1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:54 [azuepicclarp1_f2] + +zone name z50_azpwovd01_A001_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a2:a0:01 [azpwovd01_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_active_vsan.out b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_active_vsan.out new file mode 100644 index 00000000..8d1251c8 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_active_vsan.out @@ -0,0 +1,606 @@ +zoneset name z50_csphfab1_zoneset vsan 50 + zone name z50_azusant_f0_unity8174_spa1 vsan 50 + * fcid 0x3211cb [pwwn c0:50:76:09:5b:20:00:64] [azusant_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azplcbsx000652_san01-azsncbsx01_0ac vsan 50 + * fcid 0x321240 [pwwn 21:00:f4:e9:d4:57:6e:66] [azplcbsx000652_san01] + * fcid 0x321101 [pwwn 20:12:00:a0:98:fa:42:6e] [azsncbsx01_c01_0a] + * fcid 0x321100 [pwwn 20:32:00:a0:98:fa:42:6e] [azsncbsx01_c01_0c] + * fcid 0x321141 [pwwn 20:13:00:a0:98:fa:42:6e] [azsncbsx01_c02_0a] + * fcid 0x321140 [pwwn 20:33:00:a0:98:fa:42:6e] [azsncbsx01_c02_0c] + + zone name z50_azplcbsx000653_san01-azsncbsx01_0ac vsan 50 + * fcid 0x321260 [pwwn 21:00:f4:e9:d4:54:a7:c8] [azplcbsx000653_san01] + * fcid 0x321101 [pwwn 20:12:00:a0:98:fa:42:6e] [azsncbsx01_c01_0a] + * fcid 0x321100 [pwwn 20:32:00:a0:98:fa:42:6e] [azsncbsx01_c01_0c] + * fcid 0x321141 [pwwn 20:13:00:a0:98:fa:42:6e] [azsncbsx01_c02_0a] + * fcid 0x321140 [pwwn 20:33:00:a0:98:fa:42:6e] [azsncbsx01_c02_0c] + + zone name z50_azplwebodb01_f0_unity1773_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320120 [pwwn 21:00:00:24:ff:0c:58:37] [azplwebodb01_f0] + + zone name z50_azpwvnasql1_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320b60 [pwwn 21:00:00:24:ff:0d:26:68] [azpwvnasql1_f0] + + zone name z50_azplcbsx000652_san01-azsncbsx02_0ac vsan 50 + * fcid 0x321240 [pwwn 21:00:f4:e9:d4:57:6e:66] [azplcbsx000652_san01] + pwwn 20:12:00:a0:98:42:fa:8c + * fcid 0x321040 [pwwn 20:32:00:a0:98:fa:42:8c] [azsncbsx02_c01_0c] + * fcid 0x3210a1 [pwwn 20:13:00:a0:98:fa:42:8c] [azsncbsx02_c02_0a] + * fcid 0x3210a0 [pwwn 20:33:00:a0:98:fa:42:8c] [azsncbsx02_c02_0c] + + zone name z50_azplcbsx000653_san01-azsncbsx02_0ac vsan 50 + * fcid 0x321260 [pwwn 21:00:f4:e9:d4:54:a7:c8] [azplcbsx000653_san01] + pwwn 20:12:00:a0:98:42:fa:8c + * fcid 0x321040 [pwwn 20:32:00:a0:98:fa:42:8c] [azsncbsx02_c01_0c] + * fcid 0x3210a1 [pwwn 20:13:00:a0:98:fa:42:8c] [azsncbsx02_c02_0a] + * fcid 0x3210a0 [pwwn 20:33:00:a0:98:fa:42:8c] [azsncbsx02_c02_0c] + + zone name z50_azpwovd01_A001_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f5d [pwwn 20:ff:00:25:b5:a2:a0:01] [azpwovd01_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azplocat02_f0_unity8174_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320017 [pwwn 21:00:00:24:ff:01:18:5f] [azplocat02_f0] + + zone name z50_azpe123_A03B_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f9f [pwwn 20:ff:00:25:b5:a1:a0:3b] [azpe123_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpe001_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f5e [pwwn 20:ff:00:25:b5:a1:a0:1d] [azpe001_f0] + + zone name z50_azpe123_A03B_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f9f [pwwn 20:ff:00:25:b5:a1:a0:3b] [azpe123_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azuqaunx_f1_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x3211a1 [pwwn c0:50:76:09:5b:20:00:0e] [azuqaunx-01_f0] + pwwn c0:50:76:09:5b:20:00:0f + + zone name z50_azplcbsx000309_san01-azsncbsx01_0ac vsan 50 + * fcid 0x321101 [pwwn 20:12:00:a0:98:fa:42:6e] [azsncbsx01_c01_0a] + * fcid 0x321100 [pwwn 20:32:00:a0:98:fa:42:6e] [azsncbsx01_c01_0c] + * fcid 0x321141 [pwwn 20:13:00:a0:98:fa:42:6e] [azsncbsx01_c02_0a] + * fcid 0x321140 [pwwn 20:33:00:a0:98:fa:42:6e] [azsncbsx01_c02_0c] + * fcid 0x321160 [pwwn 21:00:f4:e9:d4:55:f3:e6] [azplcbsx000309_san01] + + zone name z50_azpe002_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f5f [pwwn 20:ff:00:25:b5:a1:a0:1e] [azpe002_f0] + + zone name z50_azpe122_A03A_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f9e [pwwn 20:ff:00:25:b5:a1:a0:3a] [azpe122_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpe122_A03A_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f9e [pwwn 20:ff:00:25:b5:a1:a0:3a] [azpe122_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azulaba_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x3211c5 [pwwn c0:50:76:09:5b:20:00:30] + pwwn c0:50:76:09:5b:20:00:31 + + zone name z50_azulaba_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x321205 [pwwn c0:50:76:09:5b:20:00:34] [azulaba_f2] + pwwn c0:50:76:09:5b:20:00:35 + + zone name z50_azlonbasep1_f0_unity8174_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320018 [pwwn 21:00:00:24:ff:01:78:b0] [azlonbasep1_f0] + + zone name z50_azplcbsx000309_san01-azsncbsx02_0ac vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + * fcid 0x321040 [pwwn 20:32:00:a0:98:fa:42:8c] [azsncbsx02_c01_0c] + * fcid 0x3210a1 [pwwn 20:13:00:a0:98:fa:42:8c] [azsncbsx02_c02_0a] + * fcid 0x3210a0 [pwwn 20:33:00:a0:98:fa:42:8c] [azsncbsx02_c02_0c] + * fcid 0x321160 [pwwn 21:00:f4:e9:d4:55:f3:e6] [azplcbsx000309_san01] + + zone name z50_azplcslrpa1_f0_unity1773 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320e20 [pwwn 50:01:24:80:0b:50:46:03] [azplcslrpa1-1_f0] + * fcid 0x320e60 [pwwn 50:01:24:80:00:a0:46:03] [azplcslrpa1-2_f0] + * fcid 0x320e40 [pwwn 50:01:24:80:09:c0:66:03] [azplcslrpa1-4_f0] + * fcid 0x320e80 [pwwn 50:01:24:80:0f:d0:46:03] [azplcslrpa1-3_f0] + + zone name z50_azpe120_A038_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f9c [pwwn 20:ff:00:25:b5:a1:a0:38] [azpe120_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpe120_A038_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f9c [pwwn 20:ff:00:25:b5:a1:a0:38] [azpe120_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpe121_A039_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f9d [pwwn 20:ff:00:25:b5:a1:a0:39] [azpe121_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azplcbsx000310_san01-azsncbsx01_0ac vsan 50 + * fcid 0x321101 [pwwn 20:12:00:a0:98:fa:42:6e] [azsncbsx01_c01_0a] + * fcid 0x321100 [pwwn 20:32:00:a0:98:fa:42:6e] [azsncbsx01_c01_0c] + * fcid 0x321141 [pwwn 20:13:00:a0:98:fa:42:6e] [azsncbsx01_c02_0a] + * fcid 0x321140 [pwwn 20:33:00:a0:98:fa:42:6e] [azsncbsx01_c02_0c] + * fcid 0x321180 [pwwn 21:00:f4:e9:d4:55:f4:4a] [azplcbsx000310_san01] + + zone name z50_azplcbsx000310_san01-azsncbsx02_0ac vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + * fcid 0x321040 [pwwn 20:32:00:a0:98:fa:42:8c] [azsncbsx02_c01_0c] + * fcid 0x3210a1 [pwwn 20:13:00:a0:98:fa:42:8c] [azsncbsx02_c02_0a] + * fcid 0x3210a0 [pwwn 20:33:00:a0:98:fa:42:8c] [azsncbsx02_c02_0c] + * fcid 0x321180 [pwwn 21:00:f4:e9:d4:55:f4:4a] [azplcbsx000310_san01] + + zone name z50_azpe121_A039_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f9d [pwwn 20:ff:00:25:b5:a1:a0:39] [azpe121_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx48_A036_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f99 [pwwn 20:ff:00:25:b5:a1:a0:36] [azpesxctx48_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx48_A036_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f99 [pwwn 20:ff:00:25:b5:a1:a0:36] [azpesxctx48_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx50_A033_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f9b [pwwn 20:ff:00:25:b5:a1:a0:33] [azpesxctx50_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azuqaunx_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azuqaunx_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx50_A033_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f9b [pwwn 20:ff:00:25:b5:a1:a0:33] [azpesxctx50_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx46_A034_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f97 [pwwn 20:ff:00:25:b5:a1:a0:34] [azpesxctx46_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx46_A034_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f97 [pwwn 20:ff:00:25:b5:a1:a0:34] [azpesxctx46_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx47_A035_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f98 [pwwn 20:ff:00:25:b5:a1:a0:35] [azpesxctx47_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azplepicbu01_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f82 [pwwn 20:ff:00:25:b5:a3:a0:02] [azplepicbu01_f0] + + zone name z50_azxe01p_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320ca0 [pwwn 21:00:00:24:ff:03:0f:ae] [azxe01p_f0] + + zone name z50_azxe02p_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320da0 [pwwn 21:00:00:24:ff:03:10:69] [azxe02p_f0] + + zone name z50_azpesxclin01_f0_unity8174_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320f42 [pwwn 20:ff:00:25:b5:a1:a0:02] [azpesxclin01_f0] + + zone name z50_azpesxclin02_f0_unity8174_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320f43 [pwwn 20:ff:00:25:b5:a1:a0:03] [azpesxclin02_f0] + + zone name z50_azpesxclin03_f0_unity8174_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320f44 [pwwn 20:ff:00:25:b5:a1:a0:01] [azpesxclin03_f0] + + zone name z50_azpesxctx01_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f41 [pwwn 20:ff:00:25:b5:a1:a0:04] [azpesxctx01_f0] + + zone name z50_azpesxctx02_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f45 [pwwn 20:ff:00:25:b5:a1:a0:05] [azpesxctx02_f0] + + zone name z50_azpesxctx03_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f46 [pwwn 20:ff:00:25:b5:a1:a0:06] [azpesxctx03_f0] + + zone name z50_azpesxctx04_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f47 [pwwn 20:ff:00:25:b5:a1:a0:07] [azpesxctx04_f0] + + zone name z50_azpesxctx05_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f48 [pwwn 20:ff:00:25:b5:a1:a0:08] [azpesxctx05_f0] + + zone name z50_azpesxctx06_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f49 [pwwn 20:ff:00:25:b5:a1:a0:09] [azpesxctx06_f0] + + zone name z50_azpesxctx07_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f4a [pwwn 20:ff:00:25:b5:a1:a0:0a] [azpesxctx07_f0] + + zone name z50_azpesxctx08_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f4b [pwwn 20:ff:00:25:b5:a1:a0:0b] [azpesxctx08_f0] + + zone name z50_azpesxctx09_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f4c [pwwn 20:ff:00:25:b5:a1:a0:0c] [azpesxctx09_f0] + + zone name z50_azpesxctx10_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f4d [pwwn 20:ff:00:25:b5:a1:a0:0d] [azpesxctx10_f0] + + zone name z50_azpesxctx11_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f4e [pwwn 20:ff:00:25:b5:a1:a0:0e] [azpesxctx11_f0] + + zone name z50_azpesxctx12_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f4f [pwwn 20:ff:00:25:b5:a1:a0:0f] [azpesxctx12_f0] + + zone name z50_azpesxctx13_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f50 [pwwn 20:ff:00:25:b5:a1:a0:10] [azpesxctx13_f0] + + zone name z50_azpesxctx14_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f51 [pwwn 20:ff:00:25:b5:a1:a0:11] [azpesxctx14_f0] + + zone name z50_azpesxctx15_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f52 [pwwn 20:ff:00:25:b5:a1:a0:12] [azpesxctx15_f0] + + zone name z50_azpesxctx16_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f53 [pwwn 20:ff:00:25:b5:a1:a0:13] [azpesxctx16_f0] + + zone name z50_azpesxctx17_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f54 [pwwn 20:ff:00:25:b5:a1:a0:14] [azpesxctx17_f0] + + zone name z50_azpesxctx18_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f55 [pwwn 20:ff:00:25:b5:a1:a0:15] [azpesxctx18_f0] + + zone name z50_azpesxctx19_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f56 [pwwn 20:ff:00:25:b5:a1:a0:16] [azpesxctx19_f0] + + zone name z50_azpesxctx20_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f57 [pwwn 20:ff:00:25:b5:a1:a0:17] [azpesxctx20_f0] + + zone name z50_azpesxctx21_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f59 [pwwn 20:ff:00:25:b5:a1:a0:18] [azpesxctx21_f0] + + zone name z50_azpesxctx22_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f58 [pwwn 20:ff:00:25:b5:a1:a0:19] [azpesxctx22_f0] + + zone name z50_azpesxctx23_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f5a [pwwn 20:ff:00:25:b5:a1:a0:1b] [azpesxctx23_f0] + + zone name z50_azpesxctx24_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f5b [pwwn 20:ff:00:25:b5:a1:a0:1a] [azpesxctx24_f0] + + zone name z50_azpesxctx25_f0_unity8174_spa1_spb0 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x320f5c [pwwn 20:ff:00:25:b5:a1:a0:1c] [azpesxctx25_f0] + + zone name z50_azpesxpci01-x_f0_unity8174_spa3_spb2 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x320f60 [pwwn 21:00:00:24:ff:10:02:00] [azpesxpci01-x_f0] + + zone name z50_azxe01p_0FAE_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320ca0 [pwwn 21:00:00:24:ff:03:0f:ae] [azxe01p_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azxe02p_1069_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320da0 [pwwn 21:00:00:24:ff:03:10:69] [azxe02p_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpe001_A01D_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f5e [pwwn 20:ff:00:25:b5:a1:a0:1d] [azpe001_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpe002_A01E_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f5f [pwwn 20:ff:00:25:b5:a1:a0:1e] [azpe002_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx47_A035_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f98 [pwwn 20:ff:00:25:b5:a1:a0:35] [azpesxctx47_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx49_A037_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f9a [pwwn 20:ff:00:25:b5:a1:a0:37] [azpesxctx49_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx49_A037_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f9a [pwwn 20:ff:00:25:b5:a1:a0:37] [azpesxctx49_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx26_A027_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f83 [pwwn 20:ff:00:25:b5:a1:a0:27] [azpesxctx26_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx26_A027_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f83 [pwwn 20:ff:00:25:b5:a1:a0:27] [azpesxctx26_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx28_A02B_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f85 [pwwn 20:ff:00:25:b5:a1:a0:2b] [azpesxctx28_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx28_A02B_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f85 [pwwn 20:ff:00:25:b5:a1:a0:2b] [azpesxctx28_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx31_A021_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f88 [pwwn 20:ff:00:25:b5:a1:a0:21] [azpesxctx31_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx31_A021_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f88 [pwwn 20:ff:00:25:b5:a1:a0:21] [azpesxctx31_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx32_A023_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f89 [pwwn 20:ff:00:25:b5:a1:a0:23] [azpesxctx32_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx32_A023_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f89 [pwwn 20:ff:00:25:b5:a1:a0:23] [azpesxctx32_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx29_A02D_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f86 [pwwn 20:ff:00:25:b5:a1:a0:2d] [azpesxctx29_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx29_A02D_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f86 [pwwn 20:ff:00:25:b5:a1:a0:2d] [azpesxctx29_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx33_A024_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f8b [pwwn 20:ff:00:25:b5:a1:a0:24] [azpesxctx33_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx33_A024_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f8b [pwwn 20:ff:00:25:b5:a1:a0:24] [azpesxctx33_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx30_A01F_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f87 [pwwn 20:ff:00:25:b5:a1:a0:1f] [azpesxctx30_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx30_A01F_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f87 [pwwn 20:ff:00:25:b5:a1:a0:1f] [azpesxctx30_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx27_A029_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f84 [pwwn 20:ff:00:25:b5:a1:a0:29] [azpesxctx27_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx27_A029_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f84 [pwwn 20:ff:00:25:b5:a1:a0:29] [azpesxctx27_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx35_A026_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f8c [pwwn 20:ff:00:25:b5:a1:a0:26] [azpesxctx35_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx35_A026_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f8c [pwwn 20:ff:00:25:b5:a1:a0:26] [azpesxctx35_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx37_A02A_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f8e [pwwn 20:ff:00:25:b5:a1:a0:2a] [azpesxctx37_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx37_A02A_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f8e [pwwn 20:ff:00:25:b5:a1:a0:2a] [azpesxctx37_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx38_A02C_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f8f [pwwn 20:ff:00:25:b5:a1:a0:2c] [azpesxctx38_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx38_A02C_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f8f [pwwn 20:ff:00:25:b5:a1:a0:2c] [azpesxctx38_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx40_A020_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f91 [pwwn 20:ff:00:25:b5:a1:a0:20] [azpesxctx40_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx40_A020_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f91 [pwwn 20:ff:00:25:b5:a1:a0:20] [azpesxctx40_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx34_A025_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f8a [pwwn 20:ff:00:25:b5:a1:a0:25] [azpesxctx34_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx34_A025_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f8a [pwwn 20:ff:00:25:b5:a1:a0:25] [azpesxctx34_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx41_A022_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f92 [pwwn 20:ff:00:25:b5:a1:a0:22] [azpesxctx41_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx41_A022_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f92 [pwwn 20:ff:00:25:b5:a1:a0:22] [azpesxctx41_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx42_A02F_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f93 [pwwn 20:ff:00:25:b5:a1:a0:2f] [azpesxctx42_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx42_A02F_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f93 [pwwn 20:ff:00:25:b5:a1:a0:2f] [azpesxctx42_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx36_A028_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f8d [pwwn 20:ff:00:25:b5:a1:a0:28] [azpesxctx36_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx36_A028_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f8d [pwwn 20:ff:00:25:b5:a1:a0:28] [azpesxctx36_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx43_A030_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f94 [pwwn 20:ff:00:25:b5:a1:a0:30] [azpesxctx43_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx43_A030_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f94 [pwwn 20:ff:00:25:b5:a1:a0:30] [azpesxctx43_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx44_A031_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f95 [pwwn 20:ff:00:25:b5:a1:a0:31] [azpesxctx44_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx44_A031_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f95 [pwwn 20:ff:00:25:b5:a1:a0:31] [azpesxctx44_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azpesxctx45_A032_8174_spa_iom_1_fc1 vsan 50 + * fcid 0x320f96 [pwwn 20:ff:00:25:b5:a1:a0:32] [azpesxctx45_f0] + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + + zone name z50_azpesxctx45_A032_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f96 [pwwn 20:ff:00:25:b5:a1:a0:32] [azpesxctx45_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + + zone name z50_azpesxctx39_A02E_8174_spb_iom_1_fc0 vsan 50 + * fcid 0x320f90 [pwwn 20:ff:00:25:b5:a1:a0:2e] [azpesxctx39_f0] + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + + zone name z50_azpesxctx39_A02E_8174_spa_iom_1_fc3 vsan 50 + * fcid 0x320f90 [pwwn 20:ff:00:25:b5:a1:a0:2e] [azpesxctx39_f0] + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + + zone name z50_azunim1_f0_unity8714_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x3211c1 [pwwn c0:50:76:09:5b:20:00:10] [azunim1_f0] + + zone name z50_azunim1_f2_unity8714_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x321201 [pwwn c0:50:76:09:5b:20:00:14] [azunim1_f2] + + zone name z50_azusant_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x32120b [pwwn c0:50:76:09:5b:20:00:60] [azusant_f2] + + zone name z50_azucdrdb1_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x3211a7 [pwwn c0:50:76:09:5b:20:00:3a] [azucdrdb1_f0] + + zone name z50_azucdrdb1_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x321229 [pwwn c0:50:76:09:5b:20:00:3e] [azucdrdb1_f2] + + zone name z50_azpups01_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x3211a3 [pwwn c0:50:76:09:5b:20:00:1a] [azupsp1_f0] + + zone name z50_azupsdbp1_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321203 [pwwn c0:50:76:09:5b:20:00:20] [azupsdbp1_f0] + + zone name z50_azupsdbp1_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x3211c3 [pwwn c0:50:76:09:5b:20:00:24] [azupsdbp1_f2] + + zone name z50_azucdrsr1_f0_unity1773_spa3 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x3211c7 [pwwn c0:50:76:09:5b:20:00:44] [azucdrsr1_f0] + + zone name z50_azudbas1_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x32122b [pwwn c0:50:76:09:5b:20:00:4a] [azudbas1_f0] + + zone name z50_azudbas1_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x3211a9 [pwwn c0:50:76:09:5b:20:00:4e] [azudbas1_f2] + + zone name z50_azukronp1_f0_unity8174_spa1 vsan 50 + * fcid 0x320fa0 [pwwn 50:06:01:61:47:e4:22:97] [azseunty1773_SPA1] + * fcid 0x321227 [pwwn c0:50:76:09:5b:20:00:2a] [azukronp1_f0] + + zone name z50_azukronp1_f00_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x3211a5 [pwwn c0:50:76:09:5b:20:00:2e] [azukronp1_f00] + + zone name z50_azpups01_f2_unity8174_spb0 vsan 50 + * fcid 0x321000 [pwwn 50:06:01:68:47:e4:22:97] [azseunty1773_SPB0] + * fcid 0x321225 [pwwn c0:50:76:09:5b:20:00:1e] [azupsp1_f2] + + zone name z50_azucdrsr1_f2_unity1773_spb2 vsan 50 + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x321207 [pwwn c0:50:76:09:5b:20:00:40] [azucdrsr1_f2] + + zone name z50_azuepicclarp1_f0_unity8174_spa3 vsan 50 + * fcid 0x320fc0 [pwwn 50:06:01:63:47:e4:22:97] [azseunty1773_SPA3] + * fcid 0x3211c9 [pwwn c0:50:76:09:5b:20:00:50] [azuepicclarp1_f0] + + zone name z50_azuepicclarp1_f2_unity8174_spb2 vsan 50 + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] + * fcid 0x321209 [pwwn c0:50:76:09:5b:20:00:54] [azuepicclarp1_f2] + + zone name z50_azpwovd01_A001_8174_spb_iom_1_fc2 vsan 50 + * fcid 0x320f5d [pwwn 20:ff:00:25:b5:a2:a0:01] [azpwovd01_f0] + * fcid 0x321020 [pwwn 50:06:01:6a:47:e4:22:97] [azseunty1773_SPB2] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_vsan.out b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_vsan.out new file mode 100644 index 00000000..ec6ca418 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/show_zoneset_vsan.out @@ -0,0 +1,947 @@ +zoneset name z50_csphfab1_zoneset vsan 50 + zone name z50_azusant_f0_unity8174_spa1 vsan 50 + pwwn c0:50:76:09:5b:20:00:64 [azusant_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azplcbsx000652_san01-azsncbsx01_0ac vsan 50 + fcalias name azplcbsx000652_san01 vsan 50 + pwwn 21:00:f4:e9:d4:57:6e:66 [azplcbsx000652_san01] + + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + + zone name z50_azplcbsx000653_san01-azsncbsx01_0ac vsan 50 + fcalias name azplcbsx000653_san01 vsan 50 + pwwn 21:00:f4:e9:d4:54:a7:c8 [azplcbsx000653_san01] + + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + + zone name z50_azplwebodb01_f0_unity1773_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azplwebdb01_f0 vsan 50 + pwwn 21:00:00:24:ff:0c:58:37 [azplwebodb01_f0] + + zone name z50_azpwvnasql1_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpwvnasql1_f0 vsan 50 + pwwn 21:00:00:24:ff:0d:26:68 [azpwvnasql1_f0] + + zone name z50_azplcbsx000652_san01-azsncbsx02_0ac vsan 50 + fcalias name azplcbsx000652_san01 vsan 50 + pwwn 21:00:f4:e9:d4:57:6e:66 [azplcbsx000652_san01] + + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + + zone name z50_azplcbsx000653_san01-azsncbsx02_0ac vsan 50 + fcalias name azplcbsx000653_san01 vsan 50 + pwwn 21:00:f4:e9:d4:54:a7:c8 [azplcbsx000653_san01] + + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + + zone name z50_azpwovd01_A001_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a2:a0:01 [azpwovd01_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azplocat02_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azplocat02_f0 vsan 50 + pwwn 21:00:00:24:ff:01:18:5f [azplocat02_f0] + + zone name z50_azpe123_A03B_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3b [azpe123_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpe001_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpe001_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1d [azpe001_f0] + + zone name z50_azpe123_A03B_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3b [azpe123_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azuqaunx_f1_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azuqaunx_01_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:0e [azuqaunx-01_f0] + pwwn c0:50:76:09:5b:20:00:0f + + zone name z50_azplcbsx000309_san01-azsncbsx01_0ac vsan 50 + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + + fcalias name azplcbsx000309_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f3:e6 [azplcbsx000309_san01] + + zone name z50_azpe002_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpe002_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1e [azpe002_f0] + + zone name z50_azpe122_A03A_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3a [azpe122_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpe122_A03A_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:3a [azpe122_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azulaba_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azulaba_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:30 + pwwn c0:50:76:09:5b:20:00:31 + + zone name z50_azulaba_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azulaba_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:34 [azulaba_f2] + pwwn c0:50:76:09:5b:20:00:35 + + zone name z50_azlonbasep1_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azlonbasep1_f0 vsan 50 + pwwn 21:00:00:24:ff:01:78:b0 [azlonbasep1_f0] + + zone name z50_azplcbsx000309_san01-azsncbsx02_0ac vsan 50 + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + + fcalias name azplcbsx000309_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f3:e6 [azplcbsx000309_san01] + + zone name z50_azplcslrpa1_f0_unity1773 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azplcslrpa1-1_f0 vsan 50 + pwwn 50:01:24:80:0b:50:46:03 [azplcslrpa1-1_f0] + + fcalias name azplcslrpa1-2_f0 vsan 50 + pwwn 50:01:24:80:00:a0:46:03 [azplcslrpa1-2_f0] + + fcalias name azplcslrpa1-4_f0 vsan 50 + pwwn 50:01:24:80:09:c0:66:03 [azplcslrpa1-4_f0] + + fcalias name azplcslrpa1-3_f0 vsan 50 + pwwn 50:01:24:80:0f:d0:46:03 [azplcslrpa1-3_f0] + + zone name z50_azpe120_A038_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:38 [azpe120_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpe120_A038_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:38 [azpe120_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpe121_A039_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:39 [azpe121_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azplcbsx000310_san01-azsncbsx01_0ac vsan 50 + fcalias name azsncbsx01_c01_0a vsan 50 + pwwn 20:12:00:a0:98:fa:42:6e [azsncbsx01_c01_0a] + + fcalias name azsncbsx01_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:6e [azsncbsx01_c01_0c] + + fcalias name azsncbsx01_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:6e [azsncbsx01_c02_0a] + + fcalias name azsncbsx01_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:6e [azsncbsx01_c02_0c] + + fcalias name azplcbsx000310_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f4:4a [azplcbsx000310_san01] + + zone name z50_azplcbsx000310_san01-azsncbsx02_0ac vsan 50 + fcalias name azsncbsx02_c01_0a vsan 50 + pwwn 20:12:00:a0:98:42:fa:8c + + fcalias name azsncbsx02_c01_0c vsan 50 + pwwn 20:32:00:a0:98:fa:42:8c [azsncbsx02_c01_0c] + + fcalias name azsncbsx02_c02_0a vsan 50 + pwwn 20:13:00:a0:98:fa:42:8c [azsncbsx02_c02_0a] + + fcalias name azsncbsx02_c02_0c vsan 50 + pwwn 20:33:00:a0:98:fa:42:8c [azsncbsx02_c02_0c] + + fcalias name azplcbsx000310_san01 vsan 50 + pwwn 21:00:f4:e9:d4:55:f4:4a [azplcbsx000310_san01] + + zone name z50_azpe121_A039_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:39 [azpe121_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx48_A036_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:36 [azpesxctx48_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx48_A036_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:36 [azpesxctx48_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx50_A033_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:33 [azpesxctx50_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azuqaunx_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azuqaunx_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx50_A033_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:33 [azpesxctx50_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx46_A034_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:34 [azpesxctx46_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx46_A034_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:34 [azpesxctx46_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx47_A035_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:35 [azpesxctx47_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azplepicbu01_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azplepicbu01_f0 vsan 50 + pwwn 20:ff:00:25:b5:a3:a0:02 [azplepicbu01_f0] + + zone name z50_azxe01p_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azxe01p_f0 vsan 50 + pwwn 21:00:00:24:ff:03:0f:ae [azxe01p_f0] + + zone name z50_azxe02p_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azxe02p_f0 vsan 50 + pwwn 21:00:00:24:ff:03:10:69 [azxe02p_f0] + + zone name z50_azpesxclin01_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxclin01_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:02 [azpesxclin01_f0] + + zone name z50_azpesxclin02_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxclin02_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:03 [azpesxclin02_f0] + + zone name z50_azpesxclin03_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxclin03_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:01 [azpesxclin03_f0] + + zone name z50_azpesxctx01_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx01_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:04 [azpesxctx01_f0] + + zone name z50_azpesxctx02_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx02_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:05 [azpesxctx02_f0] + + zone name z50_azpesxctx03_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx03_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:06 [azpesxctx03_f0] + + zone name z50_azpesxctx04_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx04_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:07 [azpesxctx04_f0] + + zone name z50_azpesxctx05_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx05_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:08 [azpesxctx05_f0] + + zone name z50_azpesxctx06_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx06_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:09 [azpesxctx06_f0] + + zone name z50_azpesxctx07_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx07_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0a [azpesxctx07_f0] + + zone name z50_azpesxctx08_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx08_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0b [azpesxctx08_f0] + + zone name z50_azpesxctx09_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx09_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0c [azpesxctx09_f0] + + zone name z50_azpesxctx10_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx10_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0d [azpesxctx10_f0] + + zone name z50_azpesxctx11_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx11_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0e [azpesxctx11_f0] + + zone name z50_azpesxctx12_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx12_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:0f [azpesxctx12_f0] + + zone name z50_azpesxctx13_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx13_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:10 [azpesxctx13_f0] + + zone name z50_azpesxctx14_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx14_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:11 [azpesxctx14_f0] + + zone name z50_azpesxctx15_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx15_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:12 [azpesxctx15_f0] + + zone name z50_azpesxctx16_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx16_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:13 [azpesxctx16_f0] + + zone name z50_azpesxctx17_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx17_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:14 [azpesxctx17_f0] + + zone name z50_azpesxctx18_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx18_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:15 [azpesxctx18_f0] + + zone name z50_azpesxctx19_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx19_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:16 [azpesxctx19_f0] + + zone name z50_azpesxctx20_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx20_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:17 [azpesxctx20_f0] + + zone name z50_azpesxctx21_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx21_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:18 [azpesxctx21_f0] + + zone name z50_azpesxctx22_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx22_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:19 [azpesxctx22_f0] + + zone name z50_azpesxctx23_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx23_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1b [azpesxctx23_f0] + + zone name z50_azpesxctx24_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx24_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1a [azpesxctx24_f0] + + zone name z50_azpesxctx25_f0_unity8174_spa1_spb0 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azpesxctx25_f0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1c [azpesxctx25_f0] + + zone name z50_azpesxpci01-x_f0_unity8174_spa3_spb2 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azpesxpci01-x_f0 vsan 50 + pwwn 21:00:00:24:ff:10:02:00 [azpesxpci01-x_f0] + + zone name z50_azxe01p_0FAE_8174_spb_iom_1_fc2 vsan 50 + pwwn 21:00:00:24:ff:03:0f:ae [azxe01p_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azxe02p_1069_8174_spb_iom_1_fc2 vsan 50 + pwwn 21:00:00:24:ff:03:10:69 [azxe02p_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpe001_A01D_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1d [azpe001_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpe002_A01E_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1e [azpe002_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx47_A035_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:35 [azpesxctx47_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx49_A037_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:37 [azpesxctx49_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx49_A037_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:37 [azpesxctx49_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx26_A027_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:27 [azpesxctx26_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx26_A027_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:27 [azpesxctx26_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx28_A02B_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2b [azpesxctx28_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx28_A02B_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2b [azpesxctx28_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx31_A021_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:21 [azpesxctx31_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx31_A021_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:21 [azpesxctx31_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx32_A023_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:23 [azpesxctx32_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx32_A023_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:23 [azpesxctx32_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx29_A02D_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2d [azpesxctx29_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx29_A02D_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2d [azpesxctx29_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx33_A024_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:24 [azpesxctx33_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx33_A024_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:24 [azpesxctx33_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx30_A01F_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1f [azpesxctx30_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx30_A01F_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:1f [azpesxctx30_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx27_A029_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:29 [azpesxctx27_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx27_A029_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:29 [azpesxctx27_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx35_A026_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:26 [azpesxctx35_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx35_A026_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:26 [azpesxctx35_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx37_A02A_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2a [azpesxctx37_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx37_A02A_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2a [azpesxctx37_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx38_A02C_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2c [azpesxctx38_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx38_A02C_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2c [azpesxctx38_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx40_A020_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:20 [azpesxctx40_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx40_A020_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:20 [azpesxctx40_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx34_A025_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:25 [azpesxctx34_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx34_A025_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:25 [azpesxctx34_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx41_A022_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:22 [azpesxctx41_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx41_A022_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:22 [azpesxctx41_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx42_A02F_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2f [azpesxctx42_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx42_A02F_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2f [azpesxctx42_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx36_A028_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:28 [azpesxctx36_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx36_A028_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:28 [azpesxctx36_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx43_A030_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:30 [azpesxctx43_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx43_A030_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:30 [azpesxctx43_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx44_A031_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:31 [azpesxctx44_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx44_A031_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:31 [azpesxctx44_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azpesxctx45_A032_8174_spa_iom_1_fc1 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:32 [azpesxctx45_f0] + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + zone name z50_azpesxctx45_A032_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:32 [azpesxctx45_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + zone name z50_azpesxctx39_A02E_8174_spb_iom_1_fc0 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2e [azpesxctx39_f0] + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + zone name z50_azpesxctx39_A02E_8174_spa_iom_1_fc3 vsan 50 + pwwn 20:ff:00:25:b5:a1:a0:2e [azpesxctx39_f0] + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + zone name z50_azunim1_f0_unity8714_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azunim1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:10 [azunim1_f0] + + zone name z50_azunim1_f2_unity8714_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azunim1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:14 [azunim1_f2] + + zone name z50_azusant_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azusant_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:60 [azusant_f2] + + zone name z50_azucdrdb1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azucdrdb1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:3a [azucdrdb1_f0] + + zone name z50_azucdrdb1_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azucdrdb1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:3e [azucdrdb1_f2] + + zone name z50_azpups01_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azupsp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:1a [azupsp1_f0] + + zone name z50_azupsdbp1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azupsdbp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:20 [azupsdbp1_f0] + + zone name z50_azupsdbp1_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azupsdbp1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:24 [azupsdbp1_f2] + + zone name z50_azucdrsr1_f0_unity1773_spa3 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azucdrsr1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:44 [azucdrsr1_f0] + + zone name z50_azudbas1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azudbas1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:4a [azudbas1_f0] + + zone name z50_azudbas1_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azudbas1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:4e [azudbas1_f2] + + zone name z50_azukronp1_f0_unity8174_spa1 vsan 50 + fcalias name azseunty8174_SPA1 vsan 50 + pwwn 50:06:01:61:47:e4:22:97 [azseunty1773_SPA1] + + fcalias name azukronp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:2a [azukronp1_f0] + + zone name z50_azukronp1_f00_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azukronp1_f00 vsan 50 + pwwn c0:50:76:09:5b:20:00:2e [azukronp1_f00] + + zone name z50_azpups01_f2_unity8174_spb0 vsan 50 + fcalias name azseunty8174_SPB0 vsan 50 + pwwn 50:06:01:68:47:e4:22:97 [azseunty1773_SPB0] + + fcalias name azupsp1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:1e [azupsp1_f2] + + zone name z50_azucdrsr1_f2_unity1773_spb2 vsan 50 + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azucdrsr1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:40 [azucdrsr1_f2] + + zone name z50_azuepicclarp1_f0_unity8174_spa3 vsan 50 + fcalias name azseunty8174_SPA3 vsan 50 + pwwn 50:06:01:63:47:e4:22:97 [azseunty1773_SPA3] + + fcalias name azuepicclarp1_f0 vsan 50 + pwwn c0:50:76:09:5b:20:00:50 [azuepicclarp1_f0] + + zone name z50_azuepicclarp1_f2_unity8174_spb2 vsan 50 + fcalias name azseunty8174_SPB2 vsan 50 + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] + + fcalias name azuepicclarp1_f2 vsan 50 + pwwn c0:50:76:09:5b:20:00:54 [azuepicclarp1_f2] + + zone name z50_azpwovd01_A001_8174_spb_iom_1_fc2 vsan 50 + pwwn 20:ff:00:25:b5:a2:a0:01 [azpwovd01_f0] + pwwn 50:06:01:6a:47:e4:22:97 [azseunty1773_SPB2] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_0.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_0.cfg new file mode 100644 index 00000000..14b431b9 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_0.cfg @@ -0,0 +1,8 @@ +zone name zoneA vsan 923 + pwwn 11:11:11:11:11:11:11:11 + device-alias test123 + +zone name zoneB vsan 923 + pwwn 10:11:11:11:11:11:11:11 + pwwn 62:62:62:62:21:21:21:21 + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_1.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_1.cfg new file mode 100644 index 00000000..73d58c51 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_1.cfg @@ -0,0 +1,8 @@ +zone name zoneA vsan 922 + pwwn 11:11:11:11:11:11:11:11 + device-alias test123 both + +zone name zoneB vsan 922 + pwwn 10:11:11:11:11:11:11:11 + pwwn 62:62:62:62:21:21:21:21 + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_2.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_2.cfg new file mode 100644 index 00000000..530266d4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzone_2.cfg @@ -0,0 +1,6 @@ +zone name zv221 vsan 221 + pwwn 21:01:00:1b:32:a1:c0:a8 [h181-dell-linux-top-p2] + pwwn 10:00:00:90:fa:c7:da:42 [h172-32ghost-p2] + pwwn 21:01:00:1b:32:aa:50:4b [h190-dell-linux-top-p2] + pwwn 50:06:01:6a:47:e4:6e:59 [VNX_UNITY_235_SPB-1-2] + pwwn 21:01:00:1b:32:aa:ff:4a [h189-dell-windows-bottom-p2] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_0.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_0.cfg new file mode 100644 index 00000000..c1b56005 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_0.cfg @@ -0,0 +1,10 @@ +zoneset name zsetname21 vsan 922 + zone name zone21A vsan 922 + pwwn 11:11:11:11:11:11:11:11 both + pwwn 62:62:62:62:12:12:12:12 + + zone name zone21B vsan 922 + pwwn 10:11:11:11:11:11:11:11 + pwwn 62:62:62:62:21:21:21:21 + device-alias somedummyname + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_1.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_1.cfg new file mode 100644 index 00000000..77d29622 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_1.cfg @@ -0,0 +1,9 @@ +zoneset name zsetname1 vsan 923 + zone name zoneA vsan 923 + pwwn 11:11:11:11:11:11:11:11 + device-alias test123 + + zone name zoneB vsan 923 + pwwn 10:11:11:11:11:11:11:11 + pwwn 62:62:62:62:21:21:21:21 + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_2.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_2.cfg new file mode 100644 index 00000000..923f54e4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzoneset_2.cfg @@ -0,0 +1,7 @@ +zoneset name zsv221 vsan 221 + zone name zv221 vsan 221 + pwwn 21:01:00:1b:32:a1:c0:a8 [h181-dell-linux-top-p2] + pwwn 10:00:00:90:fa:c7:da:42 [h172-32ghost-p2] + pwwn 21:01:00:1b:32:aa:50:4b [h190-dell-linux-top-p2] + pwwn 50:06:01:6a:47:e4:6e:59 [VNX_UNITY_235_SPB-1-2] + pwwn 21:01:00:1b:32:aa:ff:4a [h189-dell-windows-bottom-p2] diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonesetactive_0.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonesetactive_0.cfg new file mode 100644 index 00000000..1180410a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonesetactive_0.cfg @@ -0,0 +1,8 @@ +zoneset name zsv221 vsan 221 + zone name zv221 vsan 221 + * fcid 0x2f0000 [pwwn 21:01:00:1b:32:a1:c0:a8] [h181-dell-linux-top-p2] + * fcid 0xa90000 [pwwn 10:00:00:90:fa:c7:da:42] [h172-32ghost-p2] + * fcid 0xd50000 [pwwn 21:01:00:1b:32:aa:50:4b] [h190-dell-linux-top-p2] + * fcid 0xde0000 [pwwn 50:06:01:6a:47:e4:6e:59] [VNX_UNITY_235_SPB-1-2] + pwwn 21:01:00:1b:32:aa:ff:4a [h189-dell-windows-bottom-p2] + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_0.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_0.cfg new file mode 100644 index 00000000..0bfced83 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_0.cfg @@ -0,0 +1,23 @@ +VSAN: 922 default-zone: deny distribute: active only Interop: default + mode: basic merge-control: allow + session: none + hard-zoning: enabled broadcast: unsupported + smart-zoning: enabled + rscn-format: fabric-address + activation overwrite control: disabled +Default zone: + qos: none broadcast: unsupported ronly: unsupported +Full Zoning Database : + DB size: 358 bytes + Zonesets: 1 Zones: 2 Aliases: 0 +Active Zoning Database : + DB Size: 125 bytes + Name: zsetname21 Zonesets: 1 Zones: 2 +Current Total Zone DB Usage: 483 / 2097152 bytes (0 % used) +Pending (Session) DB size: + Full DB Copy size: n/a + Active DB Copy size: n/a +SFC size: 483 / 2097152 bytes (0 % used) +Status: Activation completed at 23:50:35 IST Jul 3 2019 + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_1.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_1.cfg new file mode 100644 index 00000000..bf7a4615 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_1.cfg @@ -0,0 +1,23 @@ +VSAN: 922 default-zone: deny distribute: full Interop: default + mode: enhanced merge-control: allow + session: none + hard-zoning: enabled broadcast: unsupported + smart-zoning: disabled + rscn-format: fabric-address + activation overwrite control: disabled +Default zone: + qos: none broadcast: unsupported ronly: unsupported +Full Zoning Database : + DB size: 376 bytes + Zonesets: 1 Zones: 2 Aliases: 0 Attribute-groups: 1 +Active Zoning Database : + DB Size: 156 bytes + Name: zsetname21 Zonesets: 1 Zones: 2 +Current Total Zone DB Usage: 532 / 2097152 bytes (0 % used) +Pending (Session) DB size: + Full DB Copy size: 0 bytes + Active DB Copy size: 0 bytes +SFC size: 0 / 2097152 bytes (0 % used) +Status: Set zoning mode complete at 10:19:02 IST Jul 5 2019 + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_2.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_2.cfg new file mode 100644 index 00000000..eb0db28e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_2.cfg @@ -0,0 +1,24 @@ +VSAN: 923 default-zone: permit distribute: full Interop: default + mode: enhanced merge-control: allow + session: none + hard-zoning: enabled broadcast: unsupported + smart-zoning: disabled + rscn-format: fabric-address + activation overwrite control: disabled +Default zone: + qos: none broadcast: unsupported ronly: unsupported +Full Zoning Database : + DB size: 356 bytes + Zonesets: 1 Zones: 2 Aliases: 0 Attribute-groups: 1 +Active Zoning Database : + DB Size: 136 bytes + Name: zsetname1 Zonesets: 1 Zones: 2 +Current Total Zone DB Usage: 492 / 2097152 bytes (0 % used) +Pending (Session) DB size: + Full DB Copy size: 0 bytes + Active DB Copy size: 0 bytes +SFC size: 0 / 2097152 bytes (0 % used) +Status: Operation failed: [Error: WARNING: Specified zoneset already active and unchanged]: + at 11:06:21 IST Jul 5 2019 + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_3.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_3.cfg new file mode 100644 index 00000000..c5c32db0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_3.cfg @@ -0,0 +1,24 @@ +VSAN: 923 default-zone: permit distribute: full Interop: default + mode: basic merge-control: allow + session: none + hard-zoning: enabled broadcast: unsupported + smart-zoning: disabled + rscn-format: fabric-address + activation overwrite control: disabled +Default zone: + qos: none broadcast: unsupported ronly: unsupported +Full Zoning Database : + DB size: 356 bytes + Zonesets: 1 Zones: 2 Aliases: 0 Attribute-groups: 1 +Active Zoning Database : + DB Size: 136 bytes + Name: zsetname1 Zonesets: 1 Zones: 2 +Current Total Zone DB Usage: 492 / 2097152 bytes (0 % used) +Pending (Session) DB size: + Full DB Copy size: 0 bytes + Active DB Copy size: 0 bytes +SFC size: 0 / 2097152 bytes (0 % used) +Status: Operation failed: [Error: WARNING: Specified zoneset already active and unchanged]: + at 11:06:21 IST Jul 5 2019 + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_4.cfg b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_4.cfg new file mode 100644 index 00000000..97c3a715 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/fixtures/nxos_zone_zoneset/shzonestatus_4.cfg @@ -0,0 +1,23 @@ +VSAN: 221 default-zone: deny distribute: full Interop: default + mode: enhanced merge-control: allow + session: none + hard-zoning: enabled broadcast: unsupported + smart-zoning: disabled + rscn-format: fabric-address + activation overwrite control: disabled +Default zone: + qos: none broadcast: unsupported ronly: unsupported +Full Zoning Database : + DB size: 300 bytes + Zonesets: 1 Zones: 1 Aliases: 0 Attribute-groups: 1 +Active Zoning Database : + DB Size: 112 bytes + Name: zsv221 Zonesets: 1 Zones: 1 +Current Total Zone DB Usage: 412 / 2097152 bytes (0 % used) +Pending (Session) DB size: + Full DB Copy size: 0 bytes + Active DB Copy size: 0 bytes +SFC size: 0 / 2097152 bytes (0 % used) +Status: + + diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/nxos_module.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/nxos_module.py new file mode 100644 index 00000000..0c7b90c1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/nxos_module.py @@ -0,0 +1,137 @@ +# (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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import os +import json + +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleExitJson, + AnsibleFailJson, + ModuleTestCase, +) +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + set_module_args as _set_module_args, +) + + +def set_module_args(args, ignore_provider=None): + if "provider" not in args and not ignore_provider: + args["provider"] = {"transport": args.get("transport") or "cli"} + + return _set_module_args(args) + + +fixture_path = os.path.join(os.path.dirname(__file__), "fixtures") +fixture_data = {} + + +def load_fixture(module_name, name, device=""): + path = os.path.join(fixture_path, module_name, device, name) + if not os.path.exists(path): + path = os.path.join(fixture_path, module_name, name) + + if path in fixture_data: + return fixture_data[path] + + with open(path) as f: + data = f.read() + + try: + data = json.loads(data) + except Exception: + pass + + fixture_data[path] = data + return data + + +class TestNxosModule(ModuleTestCase): + def execute_module_devices( + self, + failed=False, + changed=False, + commands=None, + sort=True, + defaults=False, + ): + module_name = self.module.__name__.rsplit(".", 1)[1] + local_fixture_path = os.path.join(fixture_path, module_name) + + models = [] + for path in os.listdir(local_fixture_path): + path = os.path.join(local_fixture_path, path) + if os.path.isdir(path): + models.append(os.path.basename(path)) + if not models: + models = [""] + + retvals = {} + for model in models: + retvals[model] = self.execute_module( + failed, changed, commands, sort, device=model + ) + + return retvals + + def execute_module( + self, failed=False, changed=False, commands=None, sort=True, device="" + ): + + self.load_fixtures(commands, device=device) + + if failed: + result = self.failed() + self.assertTrue(result["failed"], result) + else: + result = self.changed(changed) + self.assertEqual(result["changed"], changed, result) + if commands is not None and len(commands) > 0: + if sort: + self.assertEqual( + sorted(commands), + sorted(result["commands"]), + result["commands"], + ) + else: + self.assertEqual( + commands, result["commands"], result["commands"] + ) + + return result + + def failed(self): + with self.assertRaises(AnsibleFailJson) as exc: + self.module.main() + result = exc.exception.args[0] + self.assertTrue(result["failed"], result) + return result + + def changed(self, changed=False): + with self.assertRaises(AnsibleExitJson) as exc: + self.module.main() + + result = exc.exception.args[0] + self.assertEqual(result["changed"], changed, result) + return result + + def load_fixtures(self, commands=None, device=""): + pass diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/__init__.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_devicealias.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_devicealias.py new file mode 100644 index 00000000..227221fa --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_devicealias.py @@ -0,0 +1,454 @@ +#!/usr/bin/env python +# Copyright: Ansible Project +# 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 pytest + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules.storage import ( + nxos_devicealias, +) +from ansible_collections.cisco.nxos.plugins.modules.storage.nxos_devicealias import ( + showDeviceAliasStatus, + showDeviceAliasDatabase, +) + +from ..nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosDeviceAliasModule(TestNxosModule): + module = nxos_devicealias + + def setUp(self): + super(TestNxosDeviceAliasModule, self).setUp() + module_path = "ansible_collections.cisco.nxos.plugins.modules.storage.nxos_devicealias." + + self.mock_run_commands = patch(module_path + "run_commands") + self.run_commands = self.mock_run_commands.start() + + self.mock_execute_show_cmd = patch( + module_path + "showDeviceAliasStatus.execute_show_cmd" + ) + self.execute_show_cmd = self.mock_execute_show_cmd.start() + + self.mock_execute_show_cmd_1 = patch( + module_path + "showDeviceAliasDatabase.execute_show_cmd" + ) + self.execute_show_cmd_1 = self.mock_execute_show_cmd_1.start() + + self.mock_load_config = patch(module_path + "load_config") + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosDeviceAliasModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_execute_show_cmd.stop() + self.mock_execute_show_cmd_1.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_da_mode_1(self): + # Playbook mode is basic + # Switch has mode as enahnced + set_module_args(dict(mode="basic"), True) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no device-alias mode enhanced", + "device-alias commit", + "no terminal dont-ask", + ], + ) + + def test_da_mode_2(self): + # Playbook mode is enhanced + # Switch has mode as enahnced + set_module_args(dict(mode="enhanced"), True) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_da_distribute_1(self): + # Playbook mode is enhanced , distrbute = True + # Switch has mode as enahnced, distrbute = True + set_module_args(dict(distribute=True, mode="enhanced"), True) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_da_distribute_2(self): + # Playbook mode is enhanced , distrbute = False + # Switch has mode as enhanced, distrbute = True + set_module_args(dict(distribute=False, mode="enhanced"), True) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["no device-alias distribute"]) + + def test_da_distribute_3(self): + # Playbook mode is basic , distrbute = False + # Switch has mode as enahnced, distrbute = True + set_module_args(dict(distribute=False, mode="basic"), True) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["no device-alias distribute", "no device-alias mode enhanced"], + ) + + def test_da_add_1(self): + # Playbook mode is enhanced , distrbute = true , some new da being added + # Switch has mode as enahnced, distrbute = True, switch doesnt have the new da being added + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[ + dict(name="somename", pwwn="10:00:00:00:89:a1:01:03"), + dict(name="somename1", pwwn="10:00:00:00:89:a1:02:03"), + ], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "device-alias database", + "device-alias name somename pwwn 10:00:00:00:89:a1:01:03", + "device-alias name somename1 pwwn 10:00:00:00:89:a1:02:03", + "device-alias commit", + "no terminal dont-ask", + ], + ) + + def test_da_add_2(self): + # Playbook mode is enhanced , distrbute = true , some new da being added + # Switch has mode as enahnced, distrbute = True, switch already has the pwwn:name + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[dict(name="tieHost-2", pwwn="10:00:00:00:89:a1:01:02")], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_da_add_3(self): + # Playbook mode is enhanced , distrbute = true , some new da being added + # Switch has mode as enahnced, distrbute = True, switch same name present with different pwwn + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[dict(name="tieHost-2", pwwn="10:00:00:00:89:a1:01:ff")], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=False, failed=True) + + def test_da_add_4(self): + # Playbook mode is enhanced , distrbute = true , some new da being added + # Switch has mode as enahnced, distrbute = True, switch same pwwn present with different name + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[dict(name="tieHost-2222", pwwn="10:00:00:00:89:a1:01:02")], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=False, failed=True) + + def test_da_remove_1(self): + # Playbook mode is enhanced , distrbute = true , some da being removed + # Switch has mode as enahnced, distrbute = True, switch has the da that needs to be removed + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[ + dict( + name="tieHost-2", + pwwn="10:00:00:00:89:a1:01:02", + remove=True, + ) + ], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "device-alias database", + "no device-alias name tieHost-2", + "device-alias commit", + "no terminal dont-ask", + ], + ) + + def test_da_remove_2(self): + # Playbook mode is enhanced , distrbute = true , some da being removed + # Switch has mode as enahnced, distrbute = True, switch does NOT have the da that needs to be removed + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[ + dict( + name="somename", + pwwn="10:00:00:00:89:a1:01:02", + remove=True, + ) + ], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_da_lock(self): + # Playbook mode with some data, but switch has cfs lock acq + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[ + dict( + name="somename", + pwwn="10:00:00:00:89:a1:01:02", + remove=True, + ) + ], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatuslock.cfg" + ) + self.execute_module(failed=True) + + def test_da_paramete_not_supported(self): + # Playbook mode with some data, but switch has cfs lock acq + # the below one instead of 'mode' we are passing 'mod', kind of typo in playbook + set_module_args( + dict( + distribute=True, + mod="enhanced", + da=[ + dict( + name="somename", + pwwn="10:00:00:00:89:a1:01:02", + remove=True, + ) + ], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert "Unsupported parameters" in str(testdata["msg"]) + assert testdata["failed"] + + def test_da_name_parameter_missing(self): + # Lets say you are trying to add a device alias but forgot to put 'name' in the 'da' parameter + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[dict(pwwn="10:00:00:00:89:a1:01:02")], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert "missing required arguments" in str(testdata["msg"]) + assert testdata["failed"] + + def test_da_rename_1(self): + # rename works + set_module_args( + dict( + rename=[ + dict(old_name="test1_add", new_name="test234"), + dict(old_name="tieHost-1", new_name="tieTarget-1"), + ] + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "device-alias database", + "device-alias rename test1_add test234", + "device-alias rename tieHost-1 tieTarget-1", + "device-alias commit", + "no terminal dont-ask", + ], + ) + + def test_da_rename_2(self): + # rename : oldname not present + set_module_args( + dict( + rename=[ + dict(old_name="test1", new_name="test234"), + dict(old_name="tie", new_name="tieTarget-1"), + ] + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=False, failed=True) + self.assertEqual(result["commands"], []) + + def test_da_mansi(self): + set_module_args({"distribute": True, "mode": "enhanced"}, True) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus_mansi.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "device-alias distribute", + "terminal dont-ask", + "device-alias mode enhanced", + "device-alias commit", + "no terminal dont-ask", + ], + ) + + def test_da_add_bad(self): + # Playbook mode is enhanced , distrbute = true , some new da being added + # Switch has mode as enahnced, distrbute = True, switch doesnt have the new da being added + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[dict(name="*somename*", pwwn="10:00:00:00:89:a1:01:03")], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + + result = self.execute_module(changed=False, failed=True) + assert "it must start with a letter" in str(result["msg"]) + + def test_da_add_bad_1(self): + # Playbook mode is enhanced , distrbute = true , some new da being added + # Switch has mode as enahnced, distrbute = True, switch doesnt have the new da being added + set_module_args( + dict( + distribute=True, + mode="enhanced", + da=[dict(name="somename*", pwwn="10:00:00:00:89:a1:01:03")], + ), + True, + ) + self.execute_show_cmd.return_value = load_fixture( + "nxos_devicealias", "shdastatus.cfg" + ) + self.execute_show_cmd_1.return_value = load_fixture( + "nxos_devicealias", "shdadatabse.cfg" + ) + + result = self.execute_module(changed=False, failed=True) + assert "and can only contain these characters" in str(result["msg"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_vsan.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_vsan.py new file mode 100644 index 00000000..691b05bc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_vsan.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python +# Copyright: Ansible Project +# 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 pytest + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules.storage import nxos_vsan +from ansible_collections.cisco.nxos.plugins.modules.storage.nxos_vsan import ( + GetVsanInfoFromSwitch, +) + +from ..nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVsanModule(TestNxosModule): + module = nxos_vsan + + def setUp(self): + super(TestNxosVsanModule, self).setUp() + module_path = ( + "ansible_collections.cisco.nxos.plugins.modules.storage.nxos_vsan." + ) + + self.mock_run_commands = patch(module_path + "run_commands") + self.run_commands = self.mock_run_commands.start() + + self.mock_execute_show_vsan_cmd = patch( + module_path + "GetVsanInfoFromSwitch.execute_show_vsan_cmd" + ) + self.execute_show_vsan_cmd = self.mock_execute_show_vsan_cmd.start() + + self.mock_execute_show_vsanmemcmd = patch( + module_path + "GetVsanInfoFromSwitch.execute_show_vsan_mem_cmd" + ) + self.execute_show_vsanmem_cmd = ( + self.mock_execute_show_vsanmemcmd.start() + ) + + self.mock_load_config = patch(module_path + "load_config") + self.load_config = self.mock_load_config.start() + + self.maxDiff = None + + def tearDown(self): + super(TestNxosVsanModule, self).tearDown() + self.mock_run_commands.stop() + self.execute_show_vsan_cmd.stop() + self.execute_show_vsanmem_cmd.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_vsan_add_remove_but_present_in_switch(self): + margs = { + "vsan": [ + { + "interface": ["fc1/1", "port-channel 55"], + "id": 922, + "remove": False, + "name": "vsan-SAN-A", + }, + { + "interface": ["fc1/11", "fc1/21", "port-channel 56"], + "id": 923, + "remove": False, + "name": "vsan-SAN-B", + }, + {"id": 1923, "remove": True, "name": "vsan-SAN-Old"}, + ] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_vsan_remove(self): + margs = { + "vsan": [{"id": 922, "remove": True}, {"id": 923, "remove": True}] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["terminal dont-ask"] + + ["vsan database"] + + ["no vsan 922", "no vsan 923"] + + ["no terminal dont-ask"], + ) + + def test_vsan_add(self): + margs = { + "vsan": [ + { + "interface": ["fc1/1", "port-channel 55"], + "id": 924, + "name": "vsan-SAN-924", + }, + { + "interface": ["fc1/11", "fc1/21", "port-channel 56"], + "id": 925, + "name": "vsan-SAN-925", + }, + ] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["terminal dont-ask"] + + ["vsan database"] + + [ + "vsan 924", + "vsan 924 name vsan-SAN-924", + "no vsan 924 suspend", + "vsan 924 interface fc1/1", + "vsan 924 interface port-channel 55", + ] + + [ + "vsan 925", + "vsan 925 name vsan-SAN-925", + "no vsan 925 suspend", + "vsan 925 interface fc1/11", + "vsan 925 interface fc1/21", + "vsan 925 interface port-channel 56", + ] + + ["no terminal dont-ask"], + ) + + def test_vsan_suspend(self): + margs = { + "vsan": [ + { + "interface": ["fc1/1", "port-channel 55"], + "id": 924, + "name": "vsan-SAN-924", + }, + {"id": 925, "name": "vsan-SAN-925", "suspend": True}, + ] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["terminal dont-ask"] + + ["vsan database"] + + [ + "vsan 924", + "vsan 924 name vsan-SAN-924", + "no vsan 924 suspend", + "vsan 924 interface fc1/1", + "vsan 924 interface port-channel 55", + ] + + ["vsan 925", "vsan 925 name vsan-SAN-925", "vsan 925 suspend"] + + ["no terminal dont-ask"], + ) + + def test_vsan_invalid_vsan(self): + margs = { + "vsan": [{"id": 4096, "name": "vsan-SAN-925", "suspend": True}] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert "invalid vsan" in str(testdata["msg"]) + assert testdata["failed"] + + def test_vsan_change_reserved_vsan(self): + margs = { + "vsan": [{"id": 4094, "name": "vsan-SAN-925", "suspend": True}] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=False) + assert "reserved vsan" in str(result["messages"]) + self.assertEqual(result["commands"], []) + + def test_vsan_add_int_existing_vsan(self): + margs = { + "vsan": [ + { + "interface": ["fc1/1", "fc1/40", "port-channel 155"], + "id": 922, + } + ] + } + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["terminal dont-ask"] + + ["vsan database"] + + [ + "vsan 922 interface fc1/40", + "vsan 922 interface port-channel 155", + ] + + ["no terminal dont-ask"], + ) + + def test_vsan_remove_non_existing_vsan(self): + margs = {"vsan": [{"id": 1111, "remove": True}]} + set_module_args(margs, True) + self.execute_show_vsan_cmd.return_value = load_fixture( + "nxos_vsan", "shvsan.cfg" + ) + self.execute_show_vsanmem_cmd.return_value = load_fixture( + "nxos_vsan", "shvsanmem.cfg" + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + assert "no vsan" in str(result["messages"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_zone_zoneset.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_zone_zoneset.py new file mode 100644 index 00000000..87df7f09 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/storage/test_nxos_zone_zoneset.py @@ -0,0 +1,797 @@ +#!/usr/bin/env python +# Copyright: Ansible Project +# 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 pytest + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, + AnsibleExitJson, +) +from ansible_collections.cisco.nxos.plugins.modules.storage import ( + nxos_zone_zoneset, +) +from ansible_collections.cisco.nxos.plugins.modules.storage.nxos_zone_zoneset import ( + ShowZonesetActive, + ShowZoneset, + ShowZone, + ShowZoneStatus, +) + +from ..nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosZoneZonesetModule(TestNxosModule): + module = nxos_zone_zoneset + + def setUp(self): + super(TestNxosZoneZonesetModule, self).setUp() + module_path = "ansible_collections.cisco.nxos.plugins.modules.storage.nxos_zone_zoneset." + + self.mock_run_commands = patch(module_path + "run_commands") + self.run_commands = self.mock_run_commands.start() + + self.mock_execute_show_cmd_zoneset_active = patch( + module_path + "ShowZonesetActive.execute_show_zoneset_active_cmd" + ) + self.execute_show_cmd_zoneset_active = ( + self.mock_execute_show_cmd_zoneset_active.start() + ) + + self.mock_execute_show_cmd_zoneset = patch( + module_path + "ShowZoneset.execute_show_zoneset_cmd" + ) + self.execute_show_cmd_zoneset = ( + self.mock_execute_show_cmd_zoneset.start() + ) + + self.mock_execute_show_cmd_zone = patch( + module_path + "ShowZone.execute_show_zone_vsan_cmd" + ) + self.execute_show_cmd_zone = self.mock_execute_show_cmd_zone.start() + + self.mock_execute_show_cmd_zone_status = patch( + module_path + "ShowZoneStatus.execute_show_zone_status_cmd" + ) + self.execute_show_cmd_zone_status = ( + self.mock_execute_show_cmd_zone_status.start() + ) + + self.mock_load_config = patch(module_path + "load_config") + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosZoneZonesetModule, self).tearDown() + self.mock_run_commands.stop() + + self.execute_show_cmd_zoneset_active.stop() + self.execute_show_cmd_zoneset.stop() + self.execute_show_cmd_zone.stop() + self.execute_show_cmd_zone_status.stop() + + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + # Test def zone from deny to permit and vice versa + def test_zone_defzone_deny_to_permit(self): + # switch has def-zone deny and mode basic + a = dict(zone_zoneset_details=[dict(vsan=922, default_zone="permit")]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone default-zone permit vsan 922", + "no terminal dont-ask", + ], + ) + + def test_zone_defzone_deny_to_permit_1(self): + # switch has def-zone deny and mode enhanced + a = dict(zone_zoneset_details=[dict(vsan=922, default_zone="permit")]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone default-zone permit vsan 922", + "zone commit vsan 922", + "no terminal dont-ask", + ], + ) + + def test_zone_defzone_permit_to_deny_1(self): + # switch has def-zone deny and mode enhanced + a = dict(zone_zoneset_details=[dict(vsan=923, default_zone="deny")]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_2.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zone default-zone permit vsan 923", + "zone commit vsan 923", + "no terminal dont-ask", + ], + ) + + def test_zone_defzone_permit_to_deny_2(self): + # switch has def-zone deny and mode enhanced + a = dict(zone_zoneset_details=[dict(vsan=923, default_zone="deny")]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_3.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zone default-zone permit vsan 923", + "no terminal dont-ask", + ], + ) + + # Test zone mode from basic to enhanced and vice versa + def test_zone_mode_basic_to_enh(self): + # switch has def-zone deny and mode basic + a = dict(zone_zoneset_details=[dict(vsan=922, mode="enhanced")]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone mode enhanced vsan 922", + "zone commit vsan 922", + "no terminal dont-ask", + ], + ) + + # Test zone mode from basic to enhanced and vice versa + def test_zone_mode_basic_to_enh_1(self): + # switch has def-zone deny and mode basic + a = dict(zone_zoneset_details=[dict(vsan=922, mode="basic")]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zone mode enhanced vsan 922", + "no terminal dont-ask", + ], + ) + + # Test zone smart-zone from enabled to disabled and vice versa + def test_zone_smart_zone(self): + # switch has def-zone deny and mode basic + a = dict(zone_zoneset_details=[dict(vsan=922, smart_zoning=False)]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zone smart-zoning enable vsan 922", + "no terminal dont-ask", + ], + ) + + def test_zone_smart_zone_1(self): + # switch has def-zone deny and mode basic + a = dict(zone_zoneset_details=[dict(vsan=923, smart_zoning=True)]) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone smart-zoning enable vsan 923", + "zone commit vsan 923", + "no terminal dont-ask", + ], + ) + + # Test zone add/removal + def test_zone_add_rem(self): + a = dict( + zone_zoneset_details=[ + dict(vsan=923, zone=[dict(name="zoneB", remove=True)]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zone name zoneB vsan 923", + "zone commit vsan 923", + "no terminal dont-ask", + ], + ) + + def test_zone_add_rem_1(self): + a = dict( + zone_zoneset_details=[ + dict(vsan=923, zone=[dict(name="zoneC", remove=True)]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + m = "zone 'zoneC' is not present in vsan 923" + assert m in str(result["messages"]) + self.assertEqual(result["commands"], []) + + def test_zone_add_rem_2(self): + a = dict( + zone_zoneset_details=[dict(vsan=923, zone=[dict(name="zoneBNew")])] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name zoneBNew vsan 923", + "zone commit vsan 923", + "no terminal dont-ask", + ], + ) + + def test_zone_add_rem_3(self): + a = dict( + zone_zoneset_details=[dict(vsan=923, zone=[dict(name="zoneB")])] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + m = "zone 'zoneB' is already present in vsan 923" + assert m in str(result["messages"]) + self.assertEqual(result["commands"], []) + + # Test zone mem add/removal + def test_zonemem_add_rem(self): + mem1 = {"pwwn": "10:00:10:94:00:00:00:01"} + mem2 = {"device_alias": "somename"} + a = dict( + zone_zoneset_details=[ + dict( + vsan=923, + zone=[dict(name="zoneBNew", members=[mem1, mem2])], + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name zoneBNew vsan 923", + "member pwwn 10:00:10:94:00:00:00:01", + "member device-alias somename", + "zone commit vsan 923", + "no terminal dont-ask", + ], + ) + + # Test zone mem add/removal + def test_zonemem_add_rem_1(self): + mem1 = {"pwwn": "11:11:11:11:11:11:11:11", "remove": True} + mem2 = {"device_alias": "test123", "remove": True} + a = dict( + zone_zoneset_details=[ + dict(vsan=923, zone=[dict(name="zoneA", members=[mem1, mem2])]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name zoneA vsan 923", + "no member pwwn 11:11:11:11:11:11:11:11", + "no member device-alias test123", + "zone commit vsan 923", + "no terminal dont-ask", + ], + ) + + # Test zone mem add/removal + def test_zonemem_add_rem_2(self): + mem1 = {"pwwn": "11:11:11:11:11:11:11:11", "remove": True} + mem2 = {"device_alias": "test123", "remove": True} + a = dict( + zone_zoneset_details=[ + dict( + vsan=923, zone=[dict(name="zoneA1", members=[mem1, mem2])] + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_1.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + m = "zone 'zoneA1' is not present in vsan 923 , hence cannot remove the members" + assert m in str(result["messages"]) + self.assertEqual(result["commands"], []) + + def test_zonemem_add_rem_3(self): + mem1 = {"pwwn": "10:00:10:94:00:00:00:01", "devtype": "initiator"} + mem2 = {"device_alias": "somename", "devtype": "target"} + mem3 = {"device_alias": "somenameWithBoth", "devtype": "both"} + + a = dict( + zone_zoneset_details=[ + dict( + vsan=922, + zone=[dict(name="zoneBNew", members=[mem1, mem2, mem3])], + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_1.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name zoneBNew vsan 922", + "member pwwn 10:00:10:94:00:00:00:01 initiator", + "member device-alias somename target", + "member device-alias somenameWithBoth both", + "no terminal dont-ask", + ], + ) + + # Test zone mem add/removal with devtype + def test_zonemem_add_rem_4(self): + mem2 = {"device_alias": "test123", "devtype": "both", "remove": True} + + a = dict( + zone_zoneset_details=[ + dict(vsan=922, zone=[dict(name="zoneA", members=[mem2])]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_1.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name zoneA vsan 922", + "no member device-alias test123 both", + "no terminal dont-ask", + ], + ) + + # Test zoneset add/removal + def test_zoneset_add_rem(self): + a = dict( + zone_zoneset_details=[ + dict(vsan=922, zoneset=[dict(name="zsetname21", remove=True)]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zoneset name zsetname21 vsan 922", + "no terminal dont-ask", + ], + ) + + def test_zoneset_add_rem_1(self): + a = dict( + zone_zoneset_details=[ + dict(vsan=922, zoneset=[dict(name="zsetname21New")]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zoneset name zsetname21New vsan 922", + "no terminal dont-ask", + ], + ) + + def test_zoneset_add_rem_2(self): + a = dict( + zone_zoneset_details=[ + dict(vsan=922, zoneset=[dict(name="zsetname21")]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + m = "zoneset 'zsetname21' is already present in vsan 922" + self.assertEqual(result["commands"], []) + self.assertEqual(result["messages"], [m]) + + def test_zoneset_add_rem_3(self): + a = dict( + zone_zoneset_details=[ + dict( + vsan=922, zoneset=[dict(name="zsetname21New", remove=True)] + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + m = "zoneset 'zsetname21New' is not present in vsan 922 ,hence there is nothing to remove" + self.assertEqual(result["commands"], []) + self.assertEqual(result["messages"], [m]) + + # Test zoneset mem add/removal + def test_zoneset_mem_add_rem(self): + mem1 = {"name": "newZoneV100"} + + a = dict( + zone_zoneset_details=[ + dict( + vsan=922, zoneset=[dict(name="zsetname21", members=[mem1])] + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=True, failed=False) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zoneset name zsetname21 vsan 922", + "member newZoneV100", + "no terminal dont-ask", + ], + ) + + # Test zoneset mem add/removal + def test_zoneset_mem_add_rem_1(self): + mem1 = {"name": "zone21A", "remove": True} + + a = dict( + zone_zoneset_details=[ + dict( + vsan=922, zoneset=[dict(name="zsetname21", members=[mem1])] + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=True, failed=False) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zoneset name zsetname21 vsan 922", + "no member zone21A", + "no terminal dont-ask", + ], + ) + + # Test zoneset mem add/removal + def test_zoneset_mem_add_rem_2(self): + mem1 = {"name": "zone21", "remove": True} + + a = dict( + zone_zoneset_details=[ + dict( + vsan=922, zoneset=[dict(name="zsetname21", members=[mem1])] + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_0.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + m = "zoneset member 'zone21' is not present in zoneset 'zsetname21' in vsan 922 ,hence there is nothing to remove" + self.assertEqual(result["commands"], []) + self.assertEqual(result["messages"], [m]) + + # Test zoneset activate/deactivate + def test_zoneset_activate_deactivate(self): + a = dict( + zone_zoneset_details=[ + dict( + vsan=221, zoneset=[dict(name="zsv221", action="activate")] + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_4.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_2.cfg" + ) + self.execute_show_cmd_zoneset_active.return_value = load_fixture( + "nxos_zone_zoneset", "shzonesetactive_0.cfg" + ) + result = self.execute_module(changed=False, failed=False) + self.assertEqual(result["commands"], []) + + def test_zoneset_activate_deactivate_1(self): + a = dict( + zone_zoneset_details=[ + dict( + vsan=221, + zoneset=[dict(name="zsv221", action="deactivate")], + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_4.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_2.cfg" + ) + self.execute_show_cmd_zoneset_active.return_value = load_fixture( + "nxos_zone_zoneset", "shzonesetactive_0.cfg" + ) + result = self.execute_module(changed=True, failed=False) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "no zoneset activate name zsv221 vsan 221", + "zone commit vsan 221", + "no terminal dont-ask", + ], + ) + + def test_zoneset_activate_deactivate_2(self): + a = dict( + zone_zoneset_details=[ + dict( + vsan=221, + zoneset=[dict(name="zsv221New", action="activate")], + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_4.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_2.cfg" + ) + self.execute_show_cmd_zoneset_active.return_value = load_fixture( + "nxos_zone_zoneset", "shzonesetactive_0.cfg" + ) + result = self.execute_module(changed=True, failed=False) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zoneset name zsv221New vsan 221", + "zoneset activate name zsv221New vsan 221", + "zone commit vsan 221", + "no terminal dont-ask", + ], + ) + + def test_bug_zone_remove(self): + mem1 = {"pwwn": "21:01:00:1b:32:a1:c0:a8", "remove": True} + mem2 = {"pwwn": "50:06:01:6a:47:e4:6e:59", "remove": True} + a = dict( + zone_zoneset_details=[ + dict(vsan=221, zone=[dict(name="zv221", members=[mem1, mem2])]) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_4.cfg" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "shzone_2.cfg" + ) + self.execute_show_cmd_zoneset_active.return_value = load_fixture( + "nxos_zone_zoneset", "shzonesetactive_0.cfg" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name zv221 vsan 221", + "no member pwwn 21:01:00:1b:32:a1:c0:a8", + "no member pwwn 50:06:01:6a:47:e4:6e:59", + "zone commit vsan 221", + "no terminal dont-ask", + ], + ) + + def test_bug_from_active_zoneset_act(self): + a = dict( + zone_zoneset_details=[ + dict( + vsan=221, + zoneset=[dict(name="zsv221New", action="activate")], + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "shzonestatus_4.cfg" + ) + self.execute_show_cmd_zoneset.return_value = load_fixture( + "nxos_zone_zoneset", "shzoneset_2.cfg" + ) + self.execute_show_cmd_zoneset_active.return_value = load_fixture( + "nxos_zone_zoneset", "shzonesetactive_0.cfg" + ) + result = self.execute_module(changed=True, failed=False) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zoneset name zsv221New vsan 221", + "zoneset activate name zsv221New vsan 221", + "zone commit vsan 221", + "no terminal dont-ask", + ], + ) + + def test_bug_zone_remove_oliver(self): + mem1 = {"pwwn": "c0:50:76:09:5b:20:00:64", "remove": True} + a = dict( + zone_zoneset_details=[ + dict( + vsan=50, + zone=[ + dict( + name="z50_azusant_f0_unity8174_spa1", + members=[mem1], + ) + ], + ) + ] + ) + set_module_args(a, True) + self.execute_show_cmd_zone_status.return_value = load_fixture( + "nxos_zone_zoneset", "show_zone_status_vsan.out" + ) + self.execute_show_cmd_zone.return_value = load_fixture( + "nxos_zone_zoneset", "show_zone_vsan.out" + ) + self.execute_show_cmd_zoneset_active.return_value = load_fixture( + "nxos_zone_zoneset", "show_zoneset_active_vsan.out" + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "terminal dont-ask", + "zone name z50_azusant_f0_unity8174_spa1 vsan 50", + "no member pwwn c0:50:76:09:5b:20:00:64", + "no terminal dont-ask", + ], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos.py new file mode 100644 index 00000000..889affee --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos.py @@ -0,0 +1,127 @@ +# +# (c) 2020 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 os import path + +from mock import MagicMock + +from ansible_collections.cisco.nxos.tests.unit.compat import unittest +from ansible_collections.cisco.nxos.plugins.cliconf import nxos +from ansible.module_utils._text import to_bytes, to_text + + +class TestPluginCLIConfNXOS(unittest.TestCase): + """ Test class for NXOS CLI Conf Methods + """ + + def setUp(self): + self._mock_connection = MagicMock() + self._prepare() + self._cliconf = nxos.Cliconf(self._mock_connection) + self.maxDiff = None + + def _prepare(self, platform="nxos"): + b_FIXTURE_DIR = b"%s/fixtures/cliconf/%s" % ( + to_bytes( + path.dirname(path.abspath(__file__)), + errors="surrogate_or_strict", + ), + to_bytes(platform), + ) + + def _connection_side_effect(*args, **kwargs): + try: + if args: + value = args[0] + else: + value = kwargs.get("command") + + fixture_path = path.abspath( + b"%s/%s" % (b_FIXTURE_DIR, b"_".join(value.split(b" "))) + ) + with open(fixture_path, "rb") as file_desc: + return to_text(file_desc.read()) + except (OSError, IOError): + if args: + value = args[0] + return value + elif kwargs.get("command"): + value = kwargs.get("command") + return value + return "NO-OP" + + self._mock_connection.send.side_effect = _connection_side_effect + + def tearDown(self): + pass + + def test_get_device_info_nxos(self): + """ Test get_device_info for nxos + """ + device_info = self._cliconf.get_device_info() + + mock_device_info = { + "network_os": "nxos", + "network_os_hostname": "nxos-9kv-933", + "network_os_image": "bootflash:///nxos.9.3.3.bin", + "network_os_model": "Nexus9000 C9300v Chassis", + "network_os_platform": "N9K-C9300v", + "network_os_version": "9.3(3)", + } + + self.assertEqual(device_info, mock_device_info) + + def test_get_device_info_mds(self): + """ Test get_device_info for mds + """ + self._prepare(platform="mds") + device_info = self._cliconf.get_device_info() + mock_device_info = { + "network_os": "nxos", + "network_os_version": "8.4(2b)", + "network_os_model": 'MDS 9148S 16G 48 FC (1 Slot) Chassis ("2/4/8/16 Gbps FC/Supervisor")', + "network_os_hostname": "sw109-Mini", + "network_os_image": "bootflash:///m9100-s5ek9-mz.8.4.2b.bin", + "network_os_platform": "DS-C9710", + } + + self.assertEqual(device_info, mock_device_info) + + def test_get_command_with_output_nxos(self): + """ Test _get_command_with_output for nxos + """ + self._prepare() + cmd = self._cliconf._get_command_with_output( + command="show version", output="json" + ) + + self.assertEqual(cmd, "show version | json") + + def test_get_command_with_output_mds(self): + """ Test _get_command_with_output for mds + """ + self._prepare(platform="mds") + cmd = self._cliconf._get_command_with_output( + command="show version", output="json" + ) + + self.assertEqual(cmd, "show version | json native") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl.py new file mode 100644 index 00000000..67f44171 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl.py @@ -0,0 +1,104 @@ +# (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 . + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import json + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_acl +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosAclModule(TestNxosModule): + + module = nxos_acl + + def setUp(self): + super(TestNxosAclModule, self).setUp() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_acl.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_acl.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosAclModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + obj = json.loads(item) + command = obj["command"] + except ValueError: + command = item + filename = "%s.txt" % str(command).split(" | ")[0].replace( + " ", "_" + ) + output.append(load_fixture("nxos_acl", filename)) + return output + + self.run_commands.side_effect = load_from_file + self.load_config.return_value = None + + def test_nxos_acl(self): + set_module_args( + dict( + name="ANSIBLE", + seq=10, + action="permit", + proto="tcp", + src="192.0.2.1/24", + dest="any", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["ip access-list ANSIBLE", "10 permit tcp 192.0.2.1/24 any"], + ) + + def test_nxos_acl_remove(self): + set_module_args( + dict(name="copp-system-p-acl-bgp", seq=10, state="absent") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["ip access-list copp-system-p-acl-bgp", "no 10"], + ) + + def test_nxos_acl_delete_acl(self): + set_module_args(dict(name="copp-system-p-acl-bgp", state="delete_acl")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["no ip access-list copp-system-p-acl-bgp"] + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interface.py new file mode 100644 index 00000000..3efc0fcd --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interface.py @@ -0,0 +1,98 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +__metacl_interfaceass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_acl_interface +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosAclInterfaceModule(TestNxosModule): + + module = nxos_acl_interface + + def setUp(self): + super(TestNxosAclInterfaceModule, self).setUp() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_acl_interface.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_acl_interface.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosAclInterfaceModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + command = item["command"] + except ValueError: + command = item + filename = "%s.txt" % str(command).split(" | ")[0].replace( + " ", "_" + ) + output.append(load_fixture("nxos_acl_interface", filename)) + return output + + self.run_commands.side_effect = load_from_file + self.load_config.return_value = None + + def test_nxos_acl_interface(self): + set_module_args( + dict(name="ANSIBLE", interface="ethernet1/41", direction="egress") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["interface ethernet1/41", "ip access-group ANSIBLE out"], + ) + + def test_nxos_acl_interface_remove(self): + set_module_args( + dict( + name="copp-system-p-acl-bgp", + interface="ethernet1/41", + direction="egress", + state="absent", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface ethernet1/41", + "no ip access-group copp-system-p-acl-bgp out", + ], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interfaces.py new file mode 100644 index 00000000..99eaf6c1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acl_interfaces.py @@ -0,0 +1,407 @@ +# +# (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_collections.cisco.nxos.plugins.modules import nxos_acl_interfaces +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + MagicMock, +) +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + set_module_args, +) +from .nxos_module import TestNxosModule, load_fixture + + +class TestNxosAclInterfacesModule(TestNxosModule): + + module = nxos_acl_interfaces + + def setUp(self): + super(TestNxosAclInterfacesModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.acl_interfaces.acl_interfaces.Acl_interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_execute_show_command = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.acl_interfaces.acl_interfaces.Acl_interfacesFacts.get_device_data" + ) + self.execute_show_command = self.mock_execute_show_command.start() + + def tearDown(self): + super(TestNxosAclInterfacesModule, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_execute_show_command.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + output = """interface Ethernet1/2\n ip access-group ACL1v4 out\n interface Ethernet1/4\n ipv6 port traffic-filter ACL2v6 in\n""" + return output + + self.execute_show_command.side_effect = load_from_file + + def test_nxos_acl_interfaces_merged(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/3", + access_groups=[ + dict( + afi="ipv4", + acls=[dict(name="ACL1-v4", direction="in")], + ) + ], + ) + ], + state="merged", + ) + ) + commands = ["interface Ethernet1/3", "ip access-group ACL1-v4 in"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acl_interfaces_merged_idempotent(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + access_groups=[ + dict( + afi="ipv4", + acls=[dict(name="ACL1v4", direction="out")], + ) + ], + ), + dict( + name="Ethernet1/4", + access_groups=[ + dict( + afi="ipv6", + acls=[ + dict( + name="ACL2v6", + direction="in", + port=True, + ) + ], + ) + ], + ), + ], + state="merged", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_acl_interfaces_replaced(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + access_groups=[ + dict( + afi="ipv6", + acls=[ + dict( + name="ACL1v6", + direction="in", + port=True, + ) + ], + ) + ], + ), + dict( + name="Ethernet1/5", + access_groups=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL2v4", + direction="in", + port=True, + ) + ], + ) + ], + ), + ], + state="replaced", + ) + ) + commands = [ + "interface Ethernet1/2", + "no ip access-group ACL1v4 out", + "ipv6 port traffic-filter ACL1v6 in", + "interface Ethernet1/5", + "ip port access-group ACL2v4 in", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acl_interfaces_replaced_idempotent(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + access_groups=[ + dict( + afi="ipv4", + acls=[dict(name="ACL1v4", direction="out")], + ) + ], + ) + ], + state="replaced", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_acl_interfaces_overridden(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/3", + access_groups=[ + dict( + afi="ipv4", + acls=[ + dict(name="ACL2v4", direction="out"), + dict( + name="PortACL", + direction="in", + port=True, + ), + ], + ) + ], + ) + ], + state="overridden", + ) + ) + commands = [ + "interface Ethernet1/2", + "no ip access-group ACL1v4 out", + "interface Ethernet1/4", + "no ipv6 port traffic-filter ACL2v6 in", + "interface Ethernet1/3", + "ip access-group ACL2v4 out", + "ip port access-group PortACL in", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acl_interfaces_overridden_idempotent(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + access_groups=[ + dict( + afi="ipv4", + acls=[dict(name="ACL1v4", direction="out")], + ) + ], + ), + dict( + name="Ethernet1/4", + access_groups=[ + dict( + afi="ipv6", + acls=[ + dict( + name="ACL2v6", + direction="in", + port=True, + ) + ], + ) + ], + ), + ], + state="overridden", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_acl_interfaces_deletedname(self): + set_module_args( + dict(config=[dict(name="Ethernet1/2")], state="deleted") + ) + commands = ["interface Ethernet1/2", "no ip access-group ACL1v4 out"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acl_interfaces_deletedafi(self): + set_module_args( + dict( + config=[ + dict(name="Ethernet1/2", access_groups=[dict(afi="ipv4")]) + ], + state="deleted", + ) + ) + commands = ["interface Ethernet1/2", "no ip access-group ACL1v4 out"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acl_interfaces_deletedacl(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + access_groups=[ + dict( + afi="ipv4", + acls=[dict(name="ACL1v4", direction="out")], + ) + ], + ) + ], + state="deleted", + ) + ) + commands = ["interface Ethernet1/2", "no ip access-group ACL1v4 out"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acl_interfaces_rendered(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + access_groups=[ + dict( + afi="ipv4", + acls=[dict(name="ACL1v4", direction="out")], + ) + ], + ), + dict( + name="Ethernet1/4", + access_groups=[ + dict( + afi="ipv6", + acls=[ + dict( + name="ACL2v6", + direction="in", + port=True, + ) + ], + ) + ], + ), + ], + state="rendered", + ) + ) + commands = [ + "interface Ethernet1/2", + "ip access-group ACL1v4 out", + "interface Ethernet1/4", + "ipv6 port traffic-filter ACL2v6 in", + ] + result = self.execute_module(changed=False) + self.assertEqual( + sorted(result["rendered"]), sorted(commands), result["rendered"] + ) + + def test_nxos_acl_interfaces_parsed(self): + set_module_args( + dict( + running_config="""interface Ethernet1/2\n ip access-group ACL1v4 out\n interface Ethernet1/4\n \ + ipv6 port traffic-filter ACL2v6 in""", + state="parsed", + ) + ) + result = self.execute_module(changed=False) + compare_list = [ + { + "access_groups": [ + { + "acls": [{"direction": "out", "name": "ACL1v4"}], + "afi": "ipv4", + } + ], + "name": "Ethernet1/2", + }, + { + "access_groups": [ + { + "acls": [ + {"direction": "in", "name": "ACL2v6", "port": True} + ], + "afi": "ipv6", + } + ], + "name": "Ethernet1/4", + }, + ] + self.assertEqual(result["parsed"], compare_list, result["parsed"]) + + def test_nxos_acl_interfaces_gathered(self): + set_module_args(dict(config=[], state="gathered")) + result = self.execute_module(changed=False) + compare_list = [ + { + "access_groups": [ + { + "acls": [{"direction": "out", "name": "ACL1v4"}], + "afi": "ipv4", + } + ], + "name": "Ethernet1/2", + }, + { + "access_groups": [ + { + "acls": [ + {"direction": "in", "name": "ACL2v6", "port": True} + ], + "afi": "ipv6", + } + ], + "name": "Ethernet1/4", + }, + ] + self.assertEqual(result["gathered"], compare_list, result["gathered"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acls.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acls.py new file mode 100644 index 00000000..978556dc --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_acls.py @@ -0,0 +1,517 @@ +# +# (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_collections.cisco.nxos.plugins.modules import nxos_acls +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + MagicMock, +) +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + set_module_args, +) +from .nxos_module import TestNxosModule, load_fixture + + +class TestNxosAclsModule(TestNxosModule): + + module = nxos_acls + + def setUp(self): + super(TestNxosAclsModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.acls.acls.Acls.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_execute_show_command = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.acls.acls.AclsFacts.get_device_data" + ) + self.execute_show_command = self.mock_execute_show_command.start() + + def tearDown(self): + super(TestNxosAclsModule, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_execute_show_command.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + v4 = """\nip access-list ACL1v4\n 10 permit ip any any\n 20 deny udp any any""" + v6 = """\nipv6 access-list ACL1v6\n 10 permit sctp any any""" + return v4 + v6 + + self.execute_show_command.side_effect = load_from_file + + def test_nxos_acls_merged(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL2v4", + aces=[ + dict( + grant="deny", + destination=dict(any=True), + source=dict(any=True), + fragments=True, + sequence=20, + protocol="tcp", + protocol_options=dict( + tcp=dict(ack=True) + ), + ), + dict( + grant="deny", + destination=dict( + prefix="2002:2:2:2::/64" + ), + source=dict(prefix="2002:1:1:1::/64"), + sequence=30, + protocol="icmp", + protocol_options=dict( + icmp=dict(echo_request=True) + ), + ), + ], + ) + ], + ), + dict(afi="ipv6", acls=[dict(name="ACL2v6")]), + ], + state="merged", + ) + ) + commands = [ + "ip access-list ACL2v4", + "20 deny tcp any any ack fragments", + "30 deny icmp 2002:1:1:1::/64 2002:2:2:2::/64 echo-request", + "ipv6 access-list ACL2v6", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acls_merged_idempotent(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL1v4", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="ip", + ), + dict( + grant="deny", + destination=dict(any=True), + source=dict(any=True), + sequence=20, + protocol="udp", + ), + ], + ) + ], + ), + dict( + afi="ipv6", + acls=[ + dict( + name="ACL1v6", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="sctp", + ) + ], + ) + ], + ), + ], + state="merged", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_acls_replaced(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL1v4", + aces=[ + dict( + grant="permit", + destination=dict(host="192.0.2.28"), + source=dict(any=True), + log=True, + sequence=50, + protocol="icmp", + protocol_options=dict( + icmp=dict( + administratively_prohibited=True + ) + ), + ) + ], + ) + ], + ) + ], + state="replaced", + ) + ) + commands = [ + "ip access-list ACL1v4", + "no 20 deny udp any any", + "no 10 permit ip any any", + "50 permit icmp any host 192.0.2.28 administratively-prohibited log", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acls_replaced_idempotent(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL1v4", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="ip", + ), + dict( + grant="deny", + destination=dict(any=True), + source=dict(any=True), + sequence=20, + protocol="udp", + ), + ], + ) + ], + ), + dict( + afi="ipv6", + acls=[ + dict( + name="ACL1v6", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="sctp", + ) + ], + ) + ], + ), + ], + state="replaced", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_acls_overridden(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL2v4", + aces=[ + dict( + grant="permit", + destination=dict(host="192.0.2.28"), + source=dict(any=True), + log=True, + sequence=50, + protocol="icmp", + protocol_options=dict( + icmp=dict( + administratively_prohibited=True + ) + ), + ), + dict(remark="Overridden ACL"), + ], + ) + ], + ) + ], + state="overridden", + ) + ) + commands = [ + "no ip access-list ACL1v4", + "no ipv6 access-list ACL1v6", + "ip access-list ACL2v4", + "50 permit icmp any host 192.0.2.28 administratively-prohibited log", + "remark Overridden ACL", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acls_overridden_idempotent(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL1v4", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="ip", + ), + dict( + grant="deny", + destination=dict(any=True), + source=dict(any=True), + sequence=20, + protocol="udp", + ), + ], + ) + ], + ), + dict( + afi="ipv6", + acls=[ + dict( + name="ACL1v6", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="sctp", + ) + ], + ) + ], + ), + ], + state="overridden", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_acls_deletedafi(self): + set_module_args(dict(config=[dict(afi="ipv4")], state="deleted")) + commands = ["no ip access-list ACL1v4"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acls_deletedall(self): + set_module_args(dict(config=[], state="deleted")) + commands = ["no ipv6 access-list ACL1v6", "no ip access-list ACL1v4"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_acls_rendered(self): + set_module_args( + dict( + config=[ + dict( + afi="ipv4", + acls=[ + dict( + name="ACL1v4", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="ip", + ), + dict( + grant="deny", + destination=dict(any=True), + source=dict(any=True), + sequence=20, + protocol="udp", + ), + ], + ) + ], + ), + dict( + afi="ipv6", + acls=[ + dict( + name="ACL1v6", + aces=[ + dict( + grant="permit", + destination=dict(any=True), + source=dict(any=True), + sequence=10, + protocol="sctp", + ) + ], + ) + ], + ), + ], + state="rendered", + ) + ) + commands = [ + "ip access-list ACL1v4", + "10 permit ip any any", + "20 deny udp any any", + "ipv6 access-list ACL1v6", + "10 permit sctp any any", + ] + result = self.execute_module(changed=False) + self.assertEqual( + sorted(result["rendered"]), sorted(commands), result["rendered"] + ) + + def test_nxos_acls_parsed(self): + set_module_args( + dict( + running_config="""\nip access-list ACL1v4\n 10 permit ip any any\n 20 deny udp any any dscp AF23 precedence critical""", + state="parsed", + ) + ) + result = self.execute_module(changed=False) + compare_list = [ + { + "afi": "ipv4", + "acls": [ + { + "name": "ACL1v4", + "aces": [ + { + "grant": "permit", + "sequence": 10, + "protocol": "ip", + "source": {"any": True}, + "destination": {"any": True}, + }, + { + "grant": "deny", + "sequence": 20, + "protocol": "udp", + "source": {"any": True}, + "destination": {"any": True}, + "dscp": "AF23", + "precedence": "critical", + }, + ], + } + ], + } + ] + self.assertEqual(result["parsed"], compare_list, result["parsed"]) + + def test_nxos_acls_gathered(self): + set_module_args(dict(config=[], state="gathered")) + result = self.execute_module(changed=False) + compare_list = [ + { + "acls": [ + { + "aces": [ + { + "destination": {"any": True}, + "sequence": 10, + "protocol": "sctp", + "source": {"any": True}, + "grant": "permit", + } + ], + "name": "ACL1v6", + } + ], + "afi": "ipv6", + }, + { + "acls": [ + { + "aces": [ + { + "destination": {"any": True}, + "sequence": 10, + "protocol": "ip", + "source": {"any": True}, + "grant": "permit", + }, + { + "destination": {"any": True}, + "sequence": 20, + "protocol": "udp", + "source": {"any": True}, + "grant": "deny", + }, + ], + "name": "ACL1v4", + } + ], + "afi": "ipv4", + }, + ] + self.assertEqual(result["gathered"], compare_list, result["gathered"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_banner.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_banner.py new file mode 100644 index 00000000..a4784d58 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_banner.py @@ -0,0 +1,101 @@ +# 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_banner +from .nxos_module import TestNxosModule, set_module_args + + +class TestNxosBannerModule(TestNxosModule): + + module = nxos_banner + + def setUp(self): + super(TestNxosBannerModule, self).setUp() + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_banner.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_banner.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosBannerModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = dict(diff=None, session="session") + + def test_nxos_banner_exec_create(self): + set_module_args(dict(banner="exec", text="test\nbanner\nstring")) + commands = ["banner exec @\ntest\nbanner\nstring\n@"] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) + + def test_nxos_banner_exec_remove(self): + set_module_args(dict(banner="exec", state="absent")) + commands = ["no banner exec"] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) + + def test_nxos_banner_exec_fail_create(self): + set_module_args(dict(banner="exec", text="test\nbanner\nstring")) + commands = ["banner exec @\ntest\nbanner\nstring\n@"] + err_rsp = ["Invalid command"] + self.run_commands.return_value = err_rsp + result = self.execute_module(failed=True, changed=True) + self.assertEqual( + result["msg"], + "banner: exec may not be supported on this platform. Possible values are : exec | motd", + ) + + def test_nxos_banner_exec_fail_remove(self): + set_module_args(dict(banner="exec", state="absent")) + commands = ["no banner exec"] + err_rsp = ["Invalid command"] + self.run_commands.return_value = err_rsp + result = self.execute_module(failed=True, changed=True) + self.assertEqual( + result["msg"], + "banner: exec may not be supported on this platform. Possible values are : exec | motd", + ) + + def test_nxos_banner_motd_create(self): + set_module_args(dict(banner="motd", text="test\nbanner\nstring")) + commands = ["banner motd @\ntest\nbanner\nstring\n@"] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) + + def test_nxos_banner_motd_remove(self): + set_module_args(dict(banner="motd", state="absent")) + commands = ["no banner motd"] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) + + def test_nxos_banner_with_preserved_spaces(self): + set_module_args(dict(banner="motd", text=" foo \n")) + commands = ["banner motd @\n foo \n\n@"] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_global.py new file mode 100644 index 00000000..ad4cd1a1 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_global.py @@ -0,0 +1,336 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_bfd_global +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + NxosCmdRef, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +# TBD: These imports / import checks are only needed as a workaround for +# shippable, which fails this test due to import yaml & import ordereddict. +import pytest +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxosCmdRef_import_check, +) + +msg = nxosCmdRef_import_check() + + +@pytest.mark.skipif(len(msg), reason=msg) +class TestNxosBfdGlobalModule(TestNxosModule): + + module = nxos_bfd_global + + def setUp(self): + super(TestNxosBfdGlobalModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bfd_global.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_execute_show_command = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos.NxosCmdRef.execute_show_command" + ) + self.execute_show_command = self.mock_execute_show_command.start() + + self.mock_get_platform_shortname = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos.NxosCmdRef.get_platform_shortname" + ) + self.get_platform_shortname = self.mock_get_platform_shortname.start() + + def tearDown(self): + super(TestNxosBfdGlobalModule, self).tearDown() + self.mock_load_config.stop() + self.execute_show_command.stop() + self.get_platform_shortname.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_bfd_defaults_n9k(self): + # feature bfd is enabled, no non-defaults are set. + self.execute_show_command.return_value = "feature bfd" + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + echo_interface="deleted", + echo_rx_interval=50, + interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + slow_timer=2000, + startup_timer=5, + ipv4_echo_rx_interval=50, + ipv4_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + ipv4_slow_timer=2000, + ipv6_echo_rx_interval=50, + ipv6_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + ipv6_slow_timer=2000, + ) + ) + self.execute_module(changed=False) + + def test_bfd_non_defaults_n9k(self): + # feature bfd is enabled, apply all non-default values. + # This testcase also tests reordering of echo_interface to make sure + # it gets applied last. + self.execute_show_command.return_value = "feature bfd" + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + echo_interface="loopback1", + echo_rx_interval=51, + interval={"tx": 51, "min_rx": 51, "multiplier": 4}, + slow_timer=2001, + startup_timer=6, + ipv4_echo_rx_interval=51, + ipv4_interval={"tx": 51, "min_rx": 51, "multiplier": 4}, + ipv4_slow_timer=2001, + ipv6_echo_rx_interval=51, + ipv6_interval={"tx": 51, "min_rx": 51, "multiplier": 4}, + ipv6_slow_timer=2001, + ) + ) + self.execute_module( + changed=True, + commands=[ + "bfd interval 51 min_rx 51 multiplier 4", + "bfd ipv4 echo-rx-interval 51", + "bfd ipv4 interval 51 min_rx 51 multiplier 4", + "bfd ipv4 slow-timer 2001", + "bfd ipv6 echo-rx-interval 51", + "bfd ipv6 interval 51 min_rx 51 multiplier 4", + "bfd ipv6 slow-timer 2001", + "bfd slow-timer 2001", + "bfd startup-timer 6", + "bfd echo-interface loopback1", + "bfd echo-rx-interval 51", + ], + ) + + def test_bfd_defaults_n3k(self): + # feature bfd is enabled, no non-defaults are set. + self.execute_show_command.return_value = "feature bfd" + self.get_platform_shortname.return_value = "N3K" + set_module_args( + dict( + echo_interface="deleted", + echo_rx_interval=250, + interval={"tx": 250, "min_rx": 250, "multiplier": 3}, + slow_timer=2000, + startup_timer=5, + ipv4_echo_rx_interval=250, + ipv4_interval={"tx": 250, "min_rx": 250, "multiplier": 3}, + ipv4_slow_timer=2000, + ipv6_echo_rx_interval=250, + ipv6_interval={"tx": 250, "min_rx": 250, "multiplier": 3}, + ipv6_slow_timer=2000, + ) + ) + self.execute_module(changed=False) + + def test_bfd_defaults_n35(self): + # feature bfd is enabled, no non-defaults are set. + self.execute_show_command.return_value = "feature bfd" + self.get_platform_shortname.return_value = "N35" + set_module_args( + dict( + echo_interface="deleted", + echo_rx_interval=50, + interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + slow_timer=2000, + startup_timer=5, + ipv4_echo_rx_interval=50, + ipv4_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + ipv4_slow_timer=2000, + ) + ) + self.execute_module(changed=False) + + def test_bfd_defaults_n6k(self): + # feature bfd is enabled, no non-defaults are set. + self.execute_show_command.return_value = "feature bfd" + self.get_platform_shortname.return_value = "N6K" + set_module_args( + dict( + echo_interface="deleted", + interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + slow_timer=2000, + fabricpath_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + fabricpath_slow_timer=2000, + fabricpath_vlan=1, + ) + ) + self.execute_module(changed=False) + + def test_bfd_defaults_n7k(self): + # feature bfd is enabled, no non-defaults are set. + self.execute_show_command.return_value = "feature bfd" + self.get_platform_shortname.return_value = "N7K" + set_module_args( + dict( + echo_interface="deleted", + echo_rx_interval=50, + interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + slow_timer=2000, + ipv4_echo_rx_interval=50, + ipv4_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + ipv4_slow_timer=2000, + ipv6_echo_rx_interval=50, + ipv6_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + ipv6_slow_timer=2000, + fabricpath_interval={"tx": 50, "min_rx": 50, "multiplier": 3}, + fabricpath_slow_timer=2000, + fabricpath_vlan=1, + ) + ) + self.execute_module(changed=False) + + def test_bfd_existing_n9k(self): + module_name = self.module.__name__.rsplit(".", 1)[1] + self.execute_show_command.return_value = load_fixture( + module_name, "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + echo_interface="deleted", + echo_rx_interval=51, + interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + slow_timer=2000, + startup_timer=5, + ipv4_echo_rx_interval=50, + ipv4_interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + ipv4_slow_timer=2000, + ipv6_echo_rx_interval=50, + ipv6_interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + ipv6_slow_timer=2000, + ) + ) + self.execute_module( + changed=True, + commands=[ + "no bfd echo-interface loopback2", + "bfd echo-rx-interval 51", + "bfd interval 51 min_rx 51 multiplier 3", + "bfd slow-timer 2000", + "bfd startup-timer 5", + "bfd ipv4 echo-rx-interval 50", + "bfd ipv4 interval 51 min_rx 51 multiplier 3", + "bfd ipv4 slow-timer 2000", + "bfd ipv6 echo-rx-interval 50", + "bfd ipv6 interval 51 min_rx 51 multiplier 3", + "bfd ipv6 slow-timer 2000", + ], + ) + + def test_bfd_idempotence_n9k(self): + module_name = self.module.__name__.rsplit(".", 1)[1] + self.execute_show_command.return_value = load_fixture( + module_name, "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + echo_interface="loopback2", + echo_rx_interval=56, + interval={"tx": 51, "min_rx": 52, "multiplier": 4}, + slow_timer=2001, + startup_timer=6, + ipv4_echo_rx_interval=54, + ipv4_interval={"tx": 54, "min_rx": 54, "multiplier": 4}, + ipv4_slow_timer=2004, + ipv6_echo_rx_interval=56, + ipv6_interval={"tx": 56, "min_rx": 56, "multiplier": 6}, + ipv6_slow_timer=2006, + ) + ) + self.execute_module(changed=False) + + def test_bfd_existing_n7k(self): + module_name = self.module.__name__.rsplit(".", 1)[1] + self.execute_show_command.return_value = load_fixture( + module_name, "N7K.cfg" + ) + self.get_platform_shortname.return_value = "N7K" + set_module_args( + dict( + echo_interface="deleted", + echo_rx_interval=51, + interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + slow_timer=2002, + ipv4_echo_rx_interval=51, + ipv4_interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + ipv4_slow_timer=2002, + ipv6_echo_rx_interval=51, + ipv6_interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + ipv6_slow_timer=2002, + fabricpath_interval={"tx": 51, "min_rx": 51, "multiplier": 3}, + fabricpath_slow_timer=2003, + fabricpath_vlan=3, + ) + ) + self.execute_module( + changed=True, + commands=[ + "no bfd echo-interface loopback2", + "bfd echo-rx-interval 51", + "bfd interval 51 min_rx 51 multiplier 3", + "bfd slow-timer 2002", + "bfd ipv4 echo-rx-interval 51", + "bfd ipv4 interval 51 min_rx 51 multiplier 3", + "bfd ipv4 slow-timer 2002", + "bfd ipv6 echo-rx-interval 51", + "bfd ipv6 interval 51 min_rx 51 multiplier 3", + "bfd ipv6 slow-timer 2002", + "bfd fabricpath interval 51 min_rx 51 multiplier 3", + "bfd fabricpath slow-timer 2003", + "bfd fabricpath vlan 3", + ], + ) + + def test_bfd_idempotence_n7k(self): + module_name = self.module.__name__.rsplit(".", 1)[1] + self.execute_show_command.return_value = load_fixture( + module_name, "N7K.cfg" + ) + self.get_platform_shortname.return_value = "N7K" + set_module_args( + dict( + echo_interface="loopback2", + echo_rx_interval=56, + interval={"tx": 51, "min_rx": 52, "multiplier": 4}, + slow_timer=2001, + ipv4_echo_rx_interval=54, + ipv4_interval={"tx": 54, "min_rx": 54, "multiplier": 4}, + ipv4_slow_timer=2004, + ipv6_echo_rx_interval=56, + ipv6_interval={"tx": 56, "min_rx": 56, "multiplier": 6}, + ipv6_slow_timer=2006, + fabricpath_interval={"tx": 58, "min_rx": 58, "multiplier": 8}, + fabricpath_slow_timer=2008, + fabricpath_vlan=2, + ) + ) + self.execute_module(changed=False) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_interfaces.py new file mode 100644 index 00000000..8e5dc271 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bfd_interfaces.py @@ -0,0 +1,357 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_bfd_interfaces +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.bfd_interfaces.bfd_interfaces import ( + Bfd_interfaces, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosBfdInterfacesModule(TestNxosModule): + + module = nxos_bfd_interfaces + + def setUp(self): + super(TestNxosBfdInterfacesModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.bfd_interfaces.bfd_interfaces.Bfd_interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + def tearDown(self): + super(TestNxosBfdInterfacesModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.mock_FACT_LEGACY_SUBSETS.return_value = dict() + self.get_resource_connection_config.return_value = None + self.edit_config.return_value = None + + # --------------------------- + # Bfd_interfaces Test Cases + # --------------------------- + + # 'state' logic behaviors + # + # - 'merged' : Update existing device state with any differences in the play. + # - 'deleted' : Reset existing device state to default values. Ignores any + # play attrs other than 'name'. Scope is limited to interfaces + # in the play. + # - 'overridden': The play is the source of truth. Similar to replaced but the + # scope includes all interfaces; ie. it will also reset state + # on interfaces not found in the play. + # - 'replaced' : Scope is limited to the interfaces in the play. + + SHOW_CMD = "show running-config | section '^interface|^feature bfd'" + + def test_1(self): + # Setup: No BFD configs shown on device interfaces + # NOTE: The bfd 'enable' state is the default and does not nvgen. + existing = dedent( + """\ + feature bfd + interface Ethernet1/1 + interface Ethernet1/2 + interface Ethernet1/3 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="Ethernet1/1", bfd="disable", echo="disable"), + dict(name="Ethernet1/2", bfd="disable"), + ] + ) + # Expected result commands for each 'state' + merged = [ + "interface Ethernet1/1", + "no bfd", + "no bfd echo", + "interface Ethernet1/2", + "no bfd", + ] + deleted = [] + overridden = merged + replaced = merged + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_2(self): + # Change existing BFD configs + existing = dedent( + """\ + feature bfd + interface Ethernet1/1 + no bfd + interface Ethernet1/2 + no bfd echo + interface Ethernet1/3 + no bfd + no bfd echo + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="Ethernet1/1", bfd="enable", echo="disable"), + dict(name="Ethernet1/2"), + # Eth1/3 not present! Thus overridden should set Eth1/3 to defaults; + # replaced should ignore Eth1/3. + ] + ) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1", "bfd", "no bfd echo"] + deleted = [ + "interface Ethernet1/1", + "bfd", + "interface Ethernet1/2", + "bfd echo", + ] + overridden = [ + "interface Ethernet1/3", + "bfd", + "bfd echo", + "interface Ethernet1/1", + "bfd", + "no bfd echo", + "interface Ethernet1/2", + "bfd echo", + ] + replaced = [ + "interface Ethernet1/1", + "bfd", + "no bfd echo", + "interface Ethernet1/2", + "bfd echo", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_3(self): + # Device has bfd configs, playbook has no values + existing = dedent( + """\ + feature bfd + interface Ethernet1/1 + no bfd + interface Ethernet1/2 + no bfd echo + interface Ethernet1/3 + no bfd + no bfd echo + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict(config=[dict(name="Ethernet1/1")]) + # Expected result commands for each 'state' + merged = [] + deleted = ["interface Ethernet1/1", "bfd"] + overridden = [ + "interface Ethernet1/1", + "bfd", + "interface Ethernet1/2", + "bfd echo", + "interface Ethernet1/3", + "bfd", + "bfd echo", + ] + replaced = ["interface Ethernet1/1", "bfd"] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_4(self): + # Test with interface that doesn't exist yet + existing = dedent( + """\ + feature bfd + interface Ethernet1/1 + no bfd + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[dict(name="Ethernet1/1.42", bfd="enable", echo="disable")] + ) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1.42", "bfd", "no bfd echo"] + deleted = [] + overridden = [ + "interface Ethernet1/1.42", + "bfd", + "no bfd echo", + "interface Ethernet1/1", + "bfd", + ] + replaced = ["interface Ethernet1/1.42", "bfd", "no bfd echo"] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_5(self): + # idempotence + existing = dedent( + """\ + feature bfd + interface Ethernet1/1 + no bfd + no bfd echo + interface Ethernet1/2 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="Ethernet1/1", bfd="disable", echo="disable"), + dict(name="Ethernet1/2", bfd="enable", echo="enable"), + ] + ) + # Expected result commands for each 'state' + merged = [] + deleted = ["interface Ethernet1/1", "bfd", "bfd echo"] + overridden = [] + replaced = [] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=replaced) + + +def build_args(data, type, state=None, check_mode=None): + if state is None: + state = "merged" + if check_mode is None: + check_mode = False + args = { + "state": state, + "_ansible_check_mode": check_mode, + "config": {type: data}, + } + return args diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp.py new file mode 100644 index 00000000..71edccf0 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp.py @@ -0,0 +1,162 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_bgp +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosBgpModule(TestNxosModule): + + module = nxos_bgp + + def setUp(self): + super(TestNxosBgpModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosBgpModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture("nxos_bgp", "config.cfg") + self.load_config.return_value = [] + + def test_nxos_bgp(self): + set_module_args(dict(asn=65535, router_id="192.0.2.1")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["router bgp 65535", "router-id 192.0.2.1"] + ) + + def test_nxos_bgp_change_nothing(self): + set_module_args(dict(asn=65535, router_id="192.168.1.1")) + self.execute_module(changed=False) + + def test_nxos_bgp_wrong_asn(self): + set_module_args(dict(asn=10, router_id="192.168.1.1")) + result = self.execute_module(failed=True) + self.assertEqual(result["msg"], "Another BGP ASN already exists.") + + def test_nxos_bgp_remove(self): + set_module_args(dict(asn=65535, state="absent")) + self.execute_module(changed=True, commands=["no router bgp 65535"]) + + def test_nxos_bgp_remove_vrf(self): + set_module_args(dict(asn=65535, vrf="test2", state="absent")) + self.execute_module( + changed=True, commands=["router bgp 65535", "no vrf test2"] + ) + + def test_nxos_bgp_remove_nonexistant_vrf(self): + set_module_args(dict(asn=65535, vrf="foo", state="absent")) + self.execute_module(changed=False) + + def test_nxos_bgp_remove_wrong_asn(self): + set_module_args(dict(asn=10, state="absent")) + self.execute_module(changed=False) + + def test_nxos_bgp_vrf(self): + set_module_args(dict(asn=65535, vrf="test", router_id="192.0.2.1")) + result = self.execute_module( + changed=True, + commands=["router bgp 65535", "vrf test", "router-id 192.0.2.1"], + ) + self.assertEqual(result["warnings"], ["VRF test doesn't exist."]) + + def test_nxos_bgp_global_param(self): + set_module_args(dict(asn=65535, shutdown=True)) + self.execute_module( + changed=True, commands=["router bgp 65535", "shutdown"] + ) + + def test_nxos_bgp_global_param_outside_default(self): + set_module_args(dict(asn=65535, vrf="test", shutdown=True)) + result = self.execute_module(failed=True) + self.assertEqual( + result["msg"], + 'Global params can be modified only under "default" VRF.', + ) + + def test_nxos_bgp_default_value(self): + set_module_args( + dict(asn=65535, graceful_restart_timers_restart="default") + ) + self.execute_module( + changed=True, + commands=["router bgp 65535", "graceful-restart restart-time 120"], + ) + + +class TestNxosBgp32BitsAS(TestNxosModule): + + module = nxos_bgp + + def setUp(self): + super(TestNxosBgp32BitsAS, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosBgp32BitsAS, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_bgp", "config_32_bits_as.cfg" + ) + self.load_config.return_value = [] + + def test_nxos_bgp_change_nothing(self): + set_module_args(dict(asn="65535.65535", router_id="192.168.1.1")) + self.execute_module(changed=False) + + def test_nxos_bgp_wrong_asn(self): + set_module_args(dict(asn="65535.10", router_id="192.168.1.1")) + result = self.execute_module(failed=True) + self.assertEqual(result["msg"], "Another BGP ASN already exists.") + + def test_nxos_bgp_remove(self): + set_module_args(dict(asn="65535.65535", state="absent")) + self.execute_module( + changed=True, commands=["no router bgp 65535.65535"] + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_af.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_af.py new file mode 100644 index 00000000..b4fc5de3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_af.py @@ -0,0 +1,192 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_bgp_af +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosBgpAfModule(TestNxosModule): + + module = nxos_bgp_af + + def setUp(self): + super(TestNxosBgpAfModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp_af.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp_af.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosBgpAfModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture("nxos_bgp", "config.cfg") + self.load_config.return_value = None + + def test_nxos_bgp_af(self): + set_module_args(dict(asn=65535, afi="ipv4", safi="unicast")) + self.execute_module( + changed=True, + sort=False, + commands=["router bgp 65535", "address-family ipv4 unicast"], + ) + + def test_nxos_bgp_af_vrf(self): + set_module_args( + dict(asn=65535, vrf="test", afi="ipv4", safi="unicast") + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "router bgp 65535", + "vrf test", + "address-family ipv4 unicast", + ], + ) + + def test_nxos_bgp_af_vrf_exists(self): + set_module_args( + dict(asn=65535, vrf="test2", afi="ipv4", safi="unicast") + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_bgp_af_dampening_routemap(self): + set_module_args( + dict( + asn=65535, + afi="ipv4", + safi="unicast", + dampening_routemap="route-map-a", + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "address-family ipv4 unicast", + "dampening route-map route-map-a", + ], + ) + + def test_nxos_bgp_af_dampening_manual(self): + set_module_args( + dict( + asn=65535, + afi="ipv4", + safi="unicast", + dampening_half_time=5, + dampening_suppress_time=2000, + dampening_reuse_time=1900, + dampening_max_suppress_time=10, + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "address-family ipv4 unicast", + "dampening 5 1900 2000 10", + ], + ) + + def test_nxos_bgp_af_dampening_mix(self): + set_module_args( + dict( + asn=65535, + afi="ipv4", + safi="unicast", + dampening_routemap="route-map-a", + dampening_half_time=5, + dampening_suppress_time=2000, + dampening_reuse_time=1900, + dampening_max_suppress_time=10, + ) + ) + result = self.execute_module(failed=True) + self.assertEqual( + result["msg"], + "parameters are mutually exclusive: dampening_routemap|dampening_half_time, " + "dampening_routemap|dampening_suppress_time, dampening_routemap|dampening_reuse_time, " + "dampening_routemap|dampening_max_suppress_time", + ) + + def test_nxos_bgp_af_client(self): + set_module_args( + dict(asn=65535, afi="ipv4", safi="unicast", client_to_client=False) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "address-family ipv4 unicast", + "no client-to-client reflection", + ], + ) + + def test_nxos_bgp_af_retain_route_target(self): + set_module_args( + dict( + asn=65535, afi="l2vpn", safi="evpn", retain_route_target="abc" + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "address-family l2vpn evpn", + "retain route-target route-map abc", + ], + ) + + def test_nxos_bgp_af_retain_route_target_all(self): + set_module_args( + dict( + asn=65535, afi="l2vpn", safi="evpn", retain_route_target="all" + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "address-family l2vpn evpn", + "retain route-target all", + ], + ) + + def test_nxos_bgp_af_retain_route_target_exists(self): + set_module_args( + dict( + asn=65535, afi="l2vpn", safi="evpn", retain_route_target="xyz" + ) + ) + self.execute_module(changed=False, commands=[]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_global.py new file mode 100644 index 00000000..f2cee75f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_global.py @@ -0,0 +1,795 @@ +# (c) 2021 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_bgp_global + +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosBgpGlobalModule(TestNxosModule): + + module = nxos_bgp_global + + def setUp(self): + super(TestNxosBgpGlobalModule, self).setUp() + + self.mock_get_resource_connection = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module.get_resource_connection" + ) + self.get_resource_connection = ( + self.mock_get_resource_connection.start() + ) + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.bgp_global.bgp_global.Bgp_globalFacts.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_cfg_get_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.bgp_global.bgp_global.Bgp_global._get_config" + ) + self.cfg_get_config = self.mock_cfg_get_config.start() + + def tearDown(self): + super(TestNxosBgpGlobalModule, self).tearDown() + self.get_resource_connection.stop() + self.get_config.stop() + self.cfg_get_config.stop() + + def test_nxos_bgp_global_merged(self): + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.2", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=160), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ), + dict( + neighbor_address="198.51.100.21", + remote_as="65537", + password=dict( + encryption=7, key="12090404011C03162E" + ), + ), + ], + vrfs=[ + dict( + vrf="site-1", + local_as="200", + log_neighbor_changes=True, + neighbors=[ + dict( + neighbor_address="192.0.2.10", + neighbor_affinity_group=dict(group_id=161), + remote_as="65538", + description="site-1-nbr-1", + password=dict( + encryption=3, + key="13D4D3549493D2877B1DC116EE27A6BE", + ), + ) + ], + ), + dict( + vrf="site-2", + local_as="300", + log_neighbor_changes=True, + neighbor_down=dict(fib_accelerate=True), + ), + ], + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router bgp 65536", + "log-neighbor-changes", + "maxas-limit 20", + "router-id 198.51.100.2", + "neighbor 198.51.100.20", + "remote-as 65537", + "affinity-group 160", + "description NBR-1", + "low-memory exempt", + "neighbor 198.51.100.21", + "remote-as 65537", + "password 7 12090404011C03162E", + "vrf site-1", + "local-as 200", + "log-neighbor-changes", + "neighbor 192.0.2.10", + "affinity-group 161", + "remote-as 65538", + "description site-1-nbr-1", + "password 3 13D4D3549493D2877B1DC116EE27A6BE", + "vrf site-2", + "local-as 300", + "log-neighbor-changes", + "neighbor-down fib-accelerate", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_bgp_global_merged_idempotent(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 160 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 161 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.2", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=160), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ), + dict( + neighbor_address="198.51.100.21", + remote_as="65537", + password=dict( + encryption=7, key="12090404011C03162E" + ), + ), + ], + vrfs=[ + dict( + vrf="site-1", + local_as="200", + log_neighbor_changes=True, + neighbors=[ + dict( + neighbor_address="192.0.2.10", + neighbor_affinity_group=dict(group_id=161), + remote_as="65538", + description="site-1-nbr-1", + password=dict( + encryption=3, + key="13D4D3549493D2877B1DC116EE27A6BE", + ), + ) + ], + ), + dict( + vrf="site-2", + local_as="300", + log_neighbor_changes=True, + neighbor_down=dict(fib_accelerate=True), + ), + ], + ), + state="merged", + ), + ignore_provider_arg, + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_bgp_global_replaced(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.212", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=161), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ) + ], + vrfs=[ + dict( + vrf="site-1", + local_as="200", + log_neighbor_changes=True, + neighbors=[ + dict( + neighbor_address="192.0.2.10", + neighbor_affinity_group=dict(group_id=190), + remote_as="65538", + description="site-1-nbr-1", + password=dict( + encryption=3, + key="13D4D3549493D2877B1DC116EE27A6BE", + ), + ) + ], + ) + ], + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router bgp 65536", + "router-id 198.51.100.212", + "no neighbor 198.51.100.21", + "vrf site-1", + "neighbor 192.0.2.10", + "affinity-group 190", + "no vrf site-2", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_bgp_global_replaced_idempotent(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.212 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 190 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.212", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=161), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ) + ], + vrfs=[ + dict( + vrf="site-1", + local_as="200", + log_neighbor_changes=True, + neighbors=[ + dict( + neighbor_address="192.0.2.10", + neighbor_affinity_group=dict(group_id=190), + remote_as="65538", + description="site-1-nbr-1", + password=dict( + encryption=3, + key="13D4D3549493D2877B1DC116EE27A6BE", + ), + ) + ], + ) + ], + ), + state="replaced", + ), + ignore_provider_arg, + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_bgp_global_replaced_failed_1(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + address-family ipv4 unicast + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.212", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=161), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ) + ], + vrfs=[ + dict( + vrf="site-1", + local_as="200", + log_neighbor_changes=True, + neighbors=[ + dict( + neighbor_address="192.0.2.10", + neighbor_affinity_group=dict(group_id=190), + remote_as="65538", + description="site-1-nbr-1", + password=dict( + encryption=3, + key="13D4D3549493D2877B1DC116EE27A6BE", + ), + ) + ], + ) + ], + ), + state="replaced", + ), + ignore_provider_arg, + ) + result = self.execute_module(failed=True) + + def test_nxos_bgp_global_replaced_failed_2(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + address-family ipv4 unicast + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.2", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=160), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ), + dict( + neighbor_address="198.51.100.21", + remote_as="65537", + password=dict( + encryption=7, key="12090404011C03162E" + ), + ), + ], + vrfs=[ + dict( + vrf="site-2", + local_as="300", + log_neighbor_changes=True, + neighbor_down=dict(fib_accelerate=True), + ) + ], + ), + state="replaced", + ), + ignore_provider_arg, + ) + result = self.execute_module(failed=True) + + def test_nxos_bgp_global_replaced_failed_3(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + address-family ipv4 unicast + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args( + dict( + config=dict( + as_number="65536", + router_id="198.51.100.2", + log_neighbor_changes=True, + maxas_limit=20, + neighbors=[ + dict( + neighbor_address="198.51.100.20", + neighbor_affinity_group=dict(group_id=160), + remote_as="65537", + description="NBR-1", + low_memory=dict(exempt=True), + ), + dict( + neighbor_address="198.51.100.21", + remote_as="65537", + password=dict( + encryption=7, key="12090404011C03162E" + ), + ), + ], + vrfs=[ + dict( + vrf="site-1", + local_as="200", + log_neighbor_changes=True, + ), + dict( + vrf="site-2", + local_as="300", + log_neighbor_changes=True, + neighbor_down=dict(fib_accelerate=True), + ), + ], + ), + state="replaced", + ), + ignore_provider_arg, + ) + result = self.execute_module(failed=True) + + def test_nxos_bgp_global_deleted(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args(dict(state="deleted"), ignore_provider_arg) + commands = [ + "router bgp 65536", + "no log-neighbor-changes", + "no maxas-limit 20", + "no router-id 198.51.100.2", + "no neighbor 198.51.100.20", + "no neighbor 198.51.100.21", + "no vrf site-1", + "no vrf site-2", + ] + + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_bgp_global_deleted_idempotent_1(self): + run_cfg = dedent( + """\ + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args(dict(state="deleted"), ignore_provider_arg) + + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_bgp_global_deleted_idempotent_2(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args( + dict(config=dict(as_number="65539"), state="deleted"), + ignore_provider_arg, + ) + + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_bgp_global_deleted_failed(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + address-family ipv4 unicast + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args(dict(state="deleted"), ignore_provider_arg) + result = self.execute_module(failed=True) + + def test_nxos_bgp_global_purged(self): + run_cfg = dedent( + """\ + router bgp 65536 + log-neighbor-changes + maxas-limit 20 + router-id 198.51.100.2 + neighbor 198.51.100.20 + remote-as 65537 + affinity-group 161 + description NBR-1 + low-memory exempt + neighbor 198.51.100.21 + remote-as 65537 + password 7 12090404011C03162E + vrf site-1 + local-as 200 + log-neighbor-changes + neighbor 192.0.2.10 + affinity-group 170 + remote-as 65538 + description site-1-nbr-1 + password 3 13D4D3549493D2877B1DC116EE27A6BE + vrf site-2 + local-as 300 + log-neighbor-changes + neighbor-down fib-accelerate + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args(dict(state="purged"), ignore_provider_arg) + commands = ["no router bgp 65536"] + + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_bgp_global_purged_idempotent(self): + run_cfg = dedent( + """\ + """ + ) + self.get_config.return_value = run_cfg + self.cfg_get_config.return_value = run_cfg + + set_module_args(dict(state="purged"), ignore_provider_arg) + + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor.py new file mode 100644 index 00000000..ebaa3852 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor.py @@ -0,0 +1,155 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_bgp_neighbor +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosBgpNeighborModule(TestNxosModule): + + module = nxos_bgp_neighbor + + def setUp(self): + super(TestNxosBgpNeighborModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp_neighbor.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp_neighbor.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosBgpNeighborModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture("nxos_bgp", "config.cfg") + self.load_config.return_value = [] + + def test_nxos_bgp_neighbor_bfd_1(self): + # None (disable) -> enable + set_module_args(dict(asn=65535, neighbor="1.1.1.1", bfd="enable")) + self.execute_module( + changed=True, + commands=["router bgp 65535", "neighbor 1.1.1.1", "bfd"], + ) + + # enable -> enable (idempotence) + set_module_args(dict(asn=65535, neighbor="1.1.1.2", bfd="enable")) + self.execute_module(changed=False) + + def test_nxos_bgp_neighbor_bfd_2(self): + # enable -> None (disable) + set_module_args(dict(asn=65535, neighbor="1.1.1.2", bfd="disable")) + self.execute_module( + changed=True, + commands=["router bgp 65535", "neighbor 1.1.1.2", "no bfd"], + ) + + # None (disable) -> disable (idempotence) + set_module_args(dict(asn=65535, neighbor="1.1.1.1", bfd="disable")) + self.execute_module(changed=False) + + def test_nxos_bgp_neighbor(self): + set_module_args( + dict(asn=65535, neighbor="192.0.2.3", description="some words") + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 192.0.2.3", + "description some words", + ], + ) + + def test_nxos_bgp_neighbor_absent(self): + set_module_args(dict(asn=65535, neighbor="1.1.1.1", state="absent")) + self.execute_module( + changed=True, commands=["router bgp 65535", "no neighbor 1.1.1.1"] + ) + + def test_nxos_bgp_neighbor_remove_private_as(self): + set_module_args( + dict(asn=65535, neighbor="3.3.3.4", remove_private_as="all") + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_bgp_neighbor_remove_private_as_changed(self): + set_module_args( + dict(asn=65535, neighbor="3.3.3.4", remove_private_as="replace-as") + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.4", + "remove-private-as replace-as", + ], + ) + + def test_nxos_bgp_neighbor_peertype_border_leaf(self): + set_module_args( + dict( + asn=65535, neighbor="192.0.2.3", peer_type="fabric_border_leaf" + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 192.0.2.3", + "peer-type fabric-border-leaf", + ], + ) + + def test_nxos_bgp_neighbor_peertype_external(self): + set_module_args( + dict(asn=65535, neighbor="192.0.2.3", peer_type="fabric_external") + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 192.0.2.3", + "peer-type fabric-external", + ], + ) + + def test_nxos_bgp_neighbor_peertype_border_leaf_exists(self): + set_module_args( + dict(asn=65535, neighbor="5.5.5.5", peer_type="fabric_border_leaf") + ) + self.execute_module(changed=False) + + def test_nxos_bgp_neighbor_peertype_external_exists(self): + set_module_args( + dict(asn=65535, neighbor="6.6.6.6", peer_type="fabric_external") + ) + self.execute_module(changed=False) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor_af.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor_af.py new file mode 100644 index 00000000..daeea18e --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_bgp_neighbor_af.py @@ -0,0 +1,260 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_bgp_neighbor_af +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosBgpNeighborAfModule(TestNxosModule): + + module = nxos_bgp_neighbor_af + + def setUp(self): + super(TestNxosBgpNeighborAfModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp_neighbor_af.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_bgp_neighbor_af.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosBgpNeighborAfModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture("nxos_bgp", "config.cfg") + self.load_config.return_value = [] + + def test_nxos_bgp_neighbor_af(self): + set_module_args( + dict( + asn=65535, + neighbor="192.0.2.3", + afi="ipv4", + safi="unicast", + route_reflector_client=True, + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "router bgp 65535", + "neighbor 192.0.2.3", + "address-family ipv4 unicast", + "route-reflector-client", + ], + ) + + def test_nxos_bgp_neighbor_af_exists(self): + set_module_args( + dict(asn=65535, neighbor="3.3.3.5", afi="ipv4", safi="unicast") + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_bgp_neighbor_af_absent(self): + set_module_args( + dict( + asn=65535, + neighbor="3.3.3.5", + afi="ipv4", + safi="unicast", + state="absent", + ) + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.5", + "no address-family ipv4 unicast", + ], + ) + + def test_nxos_bgp_neighbor_af_advertise_map(self): + set_module_args( + dict( + asn=65535, + neighbor="3.3.3.5", + afi="ipv4", + safi="unicast", + advertise_map_exist=["my_advertise_map", "my_exist_map"], + ) + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.5", + "address-family ipv4 unicast", + "advertise-map my_advertise_map exist-map my_exist_map", + ], + ) + + def test_nxos_bgp_neighbor_af_advertise_map_non_exist(self): + set_module_args( + dict( + asn=65535, + neighbor="3.3.3.5", + afi="ipv4", + safi="unicast", + advertise_map_non_exist=[ + "my_advertise_map", + "my_non_exist_map", + ], + ) + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.5", + "address-family ipv4 unicast", + "advertise-map my_advertise_map non-exist-map my_non_exist_map", + ], + ) + + def test_nxos_bgp_neighbor_af_max_prefix_limit_default(self): + set_module_args( + dict( + asn=65535, + neighbor="3.3.3.5", + afi="ipv4", + safi="unicast", + max_prefix_limit="default", + ) + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.5", + "address-family ipv4 unicast", + "no maximum-prefix", + ], + ) + + def test_nxos_bgp_neighbor_af_max_prefix(self): + set_module_args( + dict( + asn=65535, + neighbor="3.3.3.5", + afi="ipv4", + safi="unicast", + max_prefix_threshold=20, + max_prefix_limit=20, + ) + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.5", + "address-family ipv4 unicast", + "maximum-prefix 20 20", + ], + ) + + def test_nxos_bgp_neighbor_af_disable_peer_as_check(self): + set_module_args( + dict( + asn=65535, + neighbor="3.3.3.5", + afi="ipv4", + safi="unicast", + disable_peer_as_check=True, + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 3.3.3.5", + "address-family ipv4 unicast", + "disable-peer-as-check", + ], + ) + + def test_nxos_bgp_neighbor_af_rewrite_evpn(self): + set_module_args( + dict( + asn=65535, + neighbor="30.30.30.5", + afi="l2vpn", + safi="evpn", + rewrite_evpn_rt_asn=True, + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 30.30.30.5", + "address-family l2vpn evpn", + "rewrite-evpn-rt-asn", + ], + ) + + def test_nxos_bgp_neighbor_af_rewrite_evpn_disable(self): + set_module_args( + dict( + asn=65535, + neighbor="30.30.30.5", + afi="l2vpn", + safi="evpn", + rewrite_evpn_rt_asn=False, + ) + ) + self.execute_module( + changed=True, + commands=[ + "router bgp 65535", + "neighbor 30.30.30.5", + "address-family l2vpn evpn", + "no rewrite-evpn-rt-asn", + ], + ) + + def test_nxos_bgp_neighbor_af_rewrite_evpn_exists(self): + set_module_args( + dict( + asn=65535, + neighbor="7.7.7.7", + afi="l2vpn", + safi="evpn", + rewrite_evpn_rt_asn=True, + ) + ) + self.execute_module(changed=False, commands=[]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_command.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_command.py new file mode 100644 index 00000000..af27c64d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_command.py @@ -0,0 +1,124 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import json + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_command +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosCommandModule(TestNxosModule): + + module = nxos_command + + def setUp(self): + super(TestNxosCommandModule, self).setUp() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_command.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestNxosCommandModule, self).tearDown() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + obj = json.loads(item["command"]) + command = obj["command"] + except ValueError: + command = item["command"] + filename = "%s.txt" % str(command).replace(" ", "_") + output.append(load_fixture("nxos_command", filename)) + return output + + self.run_commands.side_effect = load_from_file + + def test_nxos_command_simple(self): + set_module_args(dict(commands=["show version"])) + result = self.execute_module() + self.assertEqual(len(result["stdout"]), 1) + self.assertTrue(result["stdout"][0].startswith("Cisco")) + + def test_nxos_command_multiple(self): + set_module_args(dict(commands=["show version", "show version"])) + result = self.execute_module() + self.assertEqual(len(result["stdout"]), 2) + self.assertTrue(result["stdout"][0].startswith("Cisco")) + + def test_nxos_command_wait_for(self): + wait_for = 'result[0] contains "NX-OS"' + set_module_args(dict(commands=["show version"], wait_for=wait_for)) + self.execute_module() + + def test_nxos_command_wait_for_fails(self): + wait_for = 'result[0] contains "test string"' + set_module_args(dict(commands=["show version"], wait_for=wait_for)) + self.execute_module(failed=True) + self.assertEqual(self.run_commands.call_count, 10) + + def test_nxos_command_retries(self): + wait_for = 'result[0] contains "test string"' + set_module_args( + dict(commands=["show version"], wait_for=wait_for, retries=2) + ) + self.execute_module(failed=True) + self.assertEqual(self.run_commands.call_count, 2) + + def test_nxos_command_match_any(self): + wait_for = [ + 'result[0] contains "Cisco"', + 'result[0] contains "test string"', + ] + set_module_args( + dict(commands=["show version"], wait_for=wait_for, match="any") + ) + self.execute_module() + + def test_nxos_command_match_all(self): + wait_for = [ + 'result[0] contains "Cisco"', + 'result[0] contains "image file"', + ] + set_module_args( + dict(commands=["show version"], wait_for=wait_for, match="all") + ) + self.execute_module() + + def test_nxos_command_match_all_failure(self): + wait_for = [ + 'result[0] contains "Cisco"', + 'result[0] contains "test string"', + ] + commands = ["show version", "show version"] + set_module_args( + dict(commands=commands, wait_for=wait_for, match="all") + ) + self.execute_module(failed=True) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_config.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_config.py new file mode 100644 index 00000000..ec51d19f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_config.py @@ -0,0 +1,295 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + MagicMock, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_config +from ansible_collections.cisco.nxos.plugins.cliconf.nxos import Cliconf +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosConfigModule(TestNxosModule): + + module = nxos_config + + def setUp(self): + super(TestNxosConfigModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_config.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_config.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_save_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_config.save_config" + ) + self.save_config = self.mock_save_config.start() + + self.mock_get_connection = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_config.get_connection" + ) + self.get_connection = self.mock_get_connection.start() + + self.conn = self.get_connection() + self.conn.edit_config = MagicMock() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_config.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.cliconf_obj = Cliconf(MagicMock()) + self.running_config = load_fixture("nxos_config", "config.cfg") + + def tearDown(self): + super(TestNxosConfigModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_run_commands.stop() + self.mock_get_connection.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_config", "config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_config_no_change(self): + lines = ["hostname localhost"] + args = dict(lines=lines) + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff( + "\n".join(lines), self.running_config + ) + ) + set_module_args(args) + result = self.execute_module() + + def test_nxos_config_src(self): + src = load_fixture("nxos_config", "candidate.cfg") + args = dict(src=src) + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff(src, self.running_config) + ) + set_module_args(args) + + result = self.execute_module(changed=True) + config = [ + "hostname switch01", + "interface Ethernet1", + "description test interface", + "no shutdown", + "ip routing", + ] + + self.assertEqual( + sorted(config), sorted(result["commands"]), result["commands"] + ) + + def test_nxos_config_replace_src(self): + set_module_args(dict(replace_src="bootflash:config", replace="config")) + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff( + self.running_config, self.running_config, diff_replace="config" + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["config replace bootflash:config"] + ) + + def test_nxos_config_lines(self): + lines = ["hostname switch01", "ip domain-name eng.ansible.com"] + args = dict(lines=lines) + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff( + "\n".join(lines), self.running_config + ) + ) + set_module_args(args) + + result = self.execute_module(changed=True) + config = ["hostname switch01"] + + self.assertEqual( + sorted(config), sorted(result["commands"]), result["commands"] + ) + + def test_nxos_config_before(self): + lines = ["hostname switch01", "ip domain-name eng.ansible.com"] + args = dict(lines=lines, before=["before command"]) + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff( + "\n".join(lines), self.running_config + ) + ) + set_module_args(args) + + result = self.execute_module(changed=True) + config = ["before command", "hostname switch01"] + + self.assertEqual( + sorted(config), sorted(result["commands"]), result["commands"] + ) + self.assertEqual("before command", result["commands"][0]) + + def test_nxos_config_after(self): + lines = ["hostname switch01", "ip domain-name eng.ansible.com"] + args = dict(lines=lines, after=["after command"]) + + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff( + "\n".join(lines), self.running_config + ) + ) + set_module_args(args) + + result = self.execute_module(changed=True) + config = ["after command", "hostname switch01"] + + self.assertEqual( + sorted(config), sorted(result["commands"]), result["commands"] + ) + self.assertEqual("after command", result["commands"][-1]) + + def test_nxos_config_parents(self): + lines = ["ip address 1.2.3.4/5", "no shutdown"] + parents = ["interface Ethernet10"] + args = dict(lines=lines, parents=parents) + self.conn.get_diff = MagicMock( + return_value=self.cliconf_obj.get_diff( + "\n".join(parents + lines), self.running_config, path=parents + ) + ) + set_module_args(args) + + result = self.execute_module(changed=True) + config = [ + "interface Ethernet10", + "ip address 1.2.3.4/5", + "no shutdown", + ] + + self.assertEqual(config, result["commands"], result["commands"]) + + def test_nxos_config_src_and_lines_fails(self): + args = dict(src="foo", lines="foo") + set_module_args(args) + result = self.execute_module(failed=True) + + def test_nxos_config_src_and_parents_fails(self): + args = dict(src="foo", parents="foo") + set_module_args(args) + result = self.execute_module(failed=True) + + def test_nxos_config_match_exact_requires_lines(self): + args = dict(match="exact") + set_module_args(args) + result = self.execute_module(failed=True) + + def test_nxos_config_match_strict_requires_lines(self): + args = dict(match="strict") + set_module_args(args) + result = self.execute_module(failed=True) + + def test_nxos_config_replace_block_requires_lines(self): + args = dict(replace="block") + set_module_args(args) + result = self.execute_module(failed=True) + + def test_nxos_config_replace_config_requires_src(self): + args = dict(replace="config") + set_module_args(args) + result = self.execute_module(failed=True) + + def test_nxos_config_backup_returns__backup__(self): + args = dict(backup=True) + set_module_args(args) + result = self.execute_module() + self.assertIn("__backup__", result) + + def test_nxos_config_save_always(self): + args = dict(save_when="always") + set_module_args(args) + self.execute_module() + self.assertEqual(self.save_config.call_count, 1) + self.assertEqual(self.get_config.call_count, 0) + self.assertEqual(self.load_config.call_count, 0) + + def test_nxos_config_save_changed_true(self): + args = dict( + save_when="changed", + lines=[ + "hostname foo", + "interface GigabitEthernet0/0", + "no ip address", + ], + ) + set_module_args(args) + self.execute_module(changed=True) + self.assertEqual(self.save_config.call_count, 1) + self.assertEqual(self.get_config.call_count, 1) + self.assertEqual(self.load_config.call_count, 1) + + def test_nxos_config_save_changed_false(self): + args = dict(save_when="changed") + set_module_args(args) + self.execute_module() + self.assertEqual(self.save_config.call_count, 0) + self.assertEqual(self.get_config.call_count, 0) + self.assertEqual(self.load_config.call_count, 0) + + def test_nxos_config_defaults_false(self): + set_module_args(dict(lines=["hostname localhost"], defaults=False)) + result = self.execute_module(changed=True) + self.assertEqual(self.get_config.call_count, 1) + self.assertEqual(self.get_config.call_args[1], dict(flags=[])) + + def test_nxos_config_defaults_true(self): + set_module_args(dict(lines=["hostname localhost"], defaults=True)) + result = self.execute_module(changed=True) + self.assertEqual(self.get_config.call_count, 1) + self.assertEqual(self.get_config.call_args[1], dict(flags=["all"])) + + def test_nxos_config_defaults_false_backup_true(self): + set_module_args( + dict(lines=["hostname localhost"], defaults=False, backup=True) + ) + result = self.execute_module(changed=True) + self.assertEqual(self.get_config.call_count, 1) + self.assertEqual(self.get_config.call_args[1], dict(flags=[])) + + def test_nxos_config_defaults_true_backup_true(self): + set_module_args( + dict(lines=["hostname localhost"], defaults=True, backup=True) + ) + result = self.execute_module(changed=True) + self.assertEqual(self.get_config.call_count, 1) + self.assertEqual(self.get_config.call_args[1], dict(flags=["all"])) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_global.py new file mode 100644 index 00000000..2f926f6f --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_global.py @@ -0,0 +1,81 @@ +# +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_evpn_global +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosEvpnGlobalModule(TestNxosModule): + + module = nxos_evpn_global + + def setUp(self): + super(TestNxosEvpnGlobalModule, self).setUp() + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_evpn_global.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_evpn_global.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_capabilities = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_evpn_global.get_capabilities" + ) + self.get_capabilities = self.mock_get_capabilities.start() + self.get_capabilities.return_value = {"network_api": "cliconf"} + + def tearDown(self): + super(TestNxosEvpnGlobalModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_get_capabilities.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def start_configured(self, *args, **kwargs): + self.get_config.return_value = load_fixture( + "nxos_evpn_global", "configured.cfg" + ) + return self.execute_module(*args, **kwargs) + + def start_unconfigured(self, *args, **kwargs): + self.get_config.return_value = load_fixture( + "nxos_evpn_global", "unconfigured.cfg" + ) + return self.execute_module(*args, **kwargs) + + def test_nxos_evpn_global_enable(self): + set_module_args(dict(nv_overlay_evpn=True)) + commands = ["nv overlay evpn"] + self.start_unconfigured(changed=True, commands=commands) + + def test_nxos_evpn_global_disable(self): + set_module_args(dict(nv_overlay_evpn=False)) + commands = ["no nv overlay evpn"] + self.start_configured(changed=True, commands=commands) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_vni.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_vni.py new file mode 100644 index 00000000..53e23d48 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_evpn_vni.py @@ -0,0 +1,80 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_evpn_vni +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosEvpnVniModule(TestNxosModule): + + module = nxos_evpn_vni + + def setUp(self): + super(TestNxosEvpnVniModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_evpn_vni.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_evpn_vni.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosEvpnVniModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "", "nxos_evpn_vni_config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_evpn_vni_present(self): + set_module_args( + dict(vni="6000", route_target_import="5000:10", state="present") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "evpn", + "vni 6000 l2", + "route-target import 5000:10", + "no route-target import auto", + ], + ) + + def test_nxos_evpn_vni_absent_not_existing(self): + set_module_args(dict(vni="12000", state="absent")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_evpn_vni_absent_existing(self): + set_module_args(dict(vni="6000", state="absent")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["evpn", "no vni 6000 l2"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_feature.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_feature.py new file mode 100644 index 00000000..ff09149a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_feature.py @@ -0,0 +1,96 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import json + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_feature +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosFeatureModule(TestNxosModule): + + module = nxos_feature + + def setUp(self): + super(TestNxosFeatureModule, self).setUp() + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_feature.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_feature.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_feature.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_get_capabilities = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_feature.get_capabilities" + ) + self.get_capabilities = self.mock_get_capabilities.start() + self.get_capabilities.return_value = {"network_api": "cliconf"} + + def tearDown(self): + super(TestNxosFeatureModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + self.mock_get_config.stop() + self.mock_get_capabilities.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + obj = json.loads(item["command"]) + command = obj["command"] + except ValueError: + command = item["command"] + filename = "%s.txt" % str(command).replace(" ", "_") + output.append(load_fixture("nxos_feature", filename)) + return output + + self.run_commands.side_effect = load_from_file + self.get_config.return_value = "" + self.load_config.return_value = None + + def test_nxos_feature_enable(self): + set_module_args(dict(feature="nve", state="enabled")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["terminal dont-ask", "feature nv overlay"] + ) + + def test_nxos_feature_disable(self): + set_module_args(dict(feature="ospf", state="disabled")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["terminal dont-ask", "no feature ospf"] + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp.py new file mode 100644 index 00000000..3c125c85 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp.py @@ -0,0 +1,84 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_hsrp +from .nxos_module import TestNxosModule, set_module_args + + +class TestNxosHsrpModule(TestNxosModule): + + module = nxos_hsrp + + def setUp(self): + super(TestNxosHsrpModule, self).setUp() + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_hsrp.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_hsrp.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_capabilities = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_hsrp.get_capabilities" + ) + self.get_capabilities = self.mock_get_capabilities.start() + self.get_capabilities.return_value = {"network_api": "cliconf"} + + def tearDown(self): + super(TestNxosHsrpModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + self.mock_get_capabilities.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_nxos_hsrp(self): + set_module_args( + dict( + group="10", + vip="192.0.2.2/8", + priority="150", + interface="Ethernet1/2", + preempt="enabled", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + sorted(result["commands"]), + sorted( + [ + "config t", + "interface ethernet1/2", + "hsrp version 1", + "hsrp 10", + "priority 150", + "ip 192.0.2.2/8", + "preempt", + ] + ), + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp_interfaces.py new file mode 100644 index 00000000..2af403c6 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_hsrp_interfaces.py @@ -0,0 +1,351 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_hsrp_interfaces +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.hsrp_interfaces.hsrp_interfaces import ( + Hsrp_interfaces, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosHsrpInterfacesModule(TestNxosModule): + + module = nxos_hsrp_interfaces + + def setUp(self): + super(TestNxosHsrpInterfacesModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.hsrp_interfaces.hsrp_interfaces.Hsrp_interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + def tearDown(self): + super(TestNxosHsrpInterfacesModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.mock_FACT_LEGACY_SUBSETS.return_value = dict() + self.get_resource_connection_config.return_value = None + self.edit_config.return_value = None + + # --------------------------- + # Hsrp_interfaces Test Cases + # --------------------------- + + # 'state' logic behaviors + # + # - 'merged' : Update existing device state with any differences in the play. + # - 'deleted' : Reset existing device state to default values. Ignores any + # play attrs other than 'name'. Scope is limited to interfaces + # in the play. + # - 'overridden': The play is the source of truth. Similar to replaced but the + # scope includes all interfaces; ie. it will also reset state + # on interfaces not found in the play. + # - 'replaced' : Scope is limited to the interfaces in the play. + + SHOW_CMD = "show running-config | section ^interface" + + def test_1(self): + # Setup: No HSRP BFD configs shown on device interfaces + existing = dedent( + """\ + interface Ethernet1/1 + interface Ethernet1/2 + interface Ethernet1/3 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="Ethernet1/1", bfd="enable"), + dict(name="Ethernet1/2", bfd="disable"), + ] + ) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1", "hsrp bfd"] + deleted = [] + overridden = merged + replaced = merged + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_2(self): + # Change existing HSRP configs + existing = dedent( + """\ + interface Ethernet1/1 + hsrp bfd + interface Ethernet1/2 + hsrp bfd + interface Ethernet1/3 + hsrp bfd + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="Ethernet1/1", bfd="disable"), + dict(name="Ethernet1/2"), + # Eth1/3 not present! Thus overridden should set Eth1/3 to defaults; + # replaced should ignore Eth1/3. + ] + ) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1", "no hsrp bfd"] + deleted = [ + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + overridden = [ + "interface Ethernet1/3", + "no hsrp bfd", + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + replaced = [ + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_3(self): + # Device has hsrp bfd configs, playbook has no values + existing = dedent( + """\ + interface Ethernet1/1 + hsrp bfd + interface Ethernet1/2 + hsrp bfd + interface Ethernet1/3 + hsrp bfd + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[dict(name="Ethernet1/1"), dict(name="Ethernet1/2")] + ) + # Expected result commands for each 'state' + merged = [] + deleted = [ + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + overridden = [ + "interface Ethernet1/3", + "no hsrp bfd", + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + replaced = [ + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_4(self): + # Test with interface that doesn't exist yet + existing = dedent( + """\ + interface Ethernet1/1 + hsrp bfd + interface Ethernet1/2 + hsrp bfd + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict(config=[dict(name="Ethernet1/1.42", bfd="enable")]) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1.42", "hsrp bfd"] + deleted = [] + overridden = [ + "interface Ethernet1/1.42", + "hsrp bfd", + "interface Ethernet1/1", + "no hsrp bfd", + "interface Ethernet1/2", + "no hsrp bfd", + ] + replaced = ["interface Ethernet1/1.42", "hsrp bfd"] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_5(self): + # idempotence + existing = dedent( + """\ + interface Ethernet1/1 + hsrp bfd + interface Ethernet1/2 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="Ethernet1/1", bfd="enable"), + dict(name="Ethernet1/2", bfd="disable"), + ] + ) + # Expected result commands for each 'state' + merged = [] + deleted = ["interface Ethernet1/1", "no hsrp bfd"] + overridden = [] + replaced = [] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=overridden) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=replaced) + + +def build_args(data, type, state=None, check_mode=None): + if state is None: + state = "merged" + if check_mode is None: + check_mode = False + args = { + "state": state, + "_ansible_check_mode": check_mode, + "config": {type: data}, + } + return args diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface.py new file mode 100644 index 00000000..e8e451d4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface.py @@ -0,0 +1,116 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_interface +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosInterfaceModule(TestNxosModule): + + module = nxos_interface + + def setUp(self): + super(TestNxosInterfaceModule, self).setUp() + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_interface.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_interface.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosInterfaceModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + module_name = self.module.__name__.rsplit(".", 1)[1] + + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for command in commands: + if type(command) == dict: + command = command["command"] + filename = ( + str(command) + .split(" | ")[0] + .replace(" ", "_") + .replace("/", "_") + ) + print(filename) + output.append(load_fixture(module_name, filename)) + return output + + self.load_config.return_value = None + self.run_commands.side_effect = load_from_file + + def test_nxos_interface_up(self): + set_module_args(dict(interface="loopback0")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["interface loopback0", "no shutdown"] + ) + + def test_nxos_interface_down(self): + set_module_args(dict(interface="loopback0", admin_state="down")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["interface loopback0", "shutdown"] + ) + + def test_nxos_interface_delete(self): + set_module_args(dict(interface="loopback0", state="absent")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_interface_type(self): + set_module_args(dict(interface_type="loopback", state="absent")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["no interface loopback0"]) + + def test_nxos_interface_mtu(self): + set_module_args( + dict(interface="Ethernet2/1", mode="layer2", mtu="1800") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet2/1", + "switchport", + "mtu 1800", + "interface Ethernet2/1", + "no shutdown", + ], + ) + + def test_nxos_interface_speed_idempotence(self): + set_module_args(dict(interface="Ethernet2/1", speed="1000")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface_ospf.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface_ospf.py new file mode 100644 index 00000000..b1fa1157 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interface_ospf.py @@ -0,0 +1,296 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_interface_ospf +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosInterfaceOspfModule(TestNxosModule): + + module = nxos_interface_ospf + + def setUp(self): + super(TestNxosInterfaceOspfModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_interface_ospf.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_interface_ospf.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosInterfaceOspfModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + module_name = self.module.__name__.rsplit(".", 1)[1] + self.get_config.return_value = load_fixture(module_name, "config.cfg") + self.load_config.return_value = None + + def test_nxos_interface_ospf(self): + set_module_args(dict(interface="ethernet1/32", ospf=1, area=1)) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/32", + "ip router ospf 1 area 0.0.0.1", + ], + ) + + def test_bfd_1(self): + # default -> enable + set_module_args( + dict(interface="ethernet1/33", ospf=1, area=1, bfd="enable") + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/33", + "ip router ospf 1 area 0.0.0.1", + "ip ospf bfd", + ], + ) + + # default -> disable + set_module_args( + dict(interface="ethernet1/33", ospf=1, area=1, bfd="disable") + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/33", + "ip router ospf 1 area 0.0.0.1", + "ip ospf bfd disable", + ], + ) + + def test_bfd_2(self): + # default -> default + set_module_args( + dict(interface="ethernet1/33.101", ospf=1, area=1, bfd="default") + ) + self.execute_module(changed=False) + + # enable -> default + set_module_args( + dict(interface="ethernet1/36", ospf=1, area=1, bfd="default") + ) + self.execute_module( + changed=True, commands=["interface Ethernet1/36", "no ip ospf bfd"] + ) + + # disable -> default + set_module_args( + dict(interface="ethernet1/37", ospf=1, area=1, bfd="default") + ) + self.execute_module( + changed=True, commands=["interface Ethernet1/37", "no ip ospf bfd"] + ) + + def test_bfd_3(self): + # enable -> idempotence + set_module_args( + dict(interface="ethernet1/36", ospf=1, area=1, bfd="enable") + ) + self.execute_module(changed=False) + + # disable -> idempotence + set_module_args( + dict(interface="ethernet1/37", ospf=1, area=1, bfd="disable") + ) + self.execute_module(changed=False) + + def test_bfd_4(self): + # None -> absent + set_module_args( + dict(interface="ethernet1/33.101", ospf=1, area=1, state="absent") + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/33.101", + "no ip router ospf 1 area 0.0.0.1", + ], + ) + + # enable -> absent + set_module_args( + dict( + interface="ethernet1/36", + ospf=1, + area=1, + bfd="enable", + state="absent", + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/36", + "no ip router ospf 1 area 0.0.0.1", + "no ip ospf bfd", + ], + ) + + # disable -> absent + set_module_args( + dict( + interface="ethernet1/37", + ospf=1, + area=1, + bfd="disable", + state="absent", + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/37", + "no ip router ospf 1 area 0.0.0.1", + "no ip ospf bfd", + ], + ) + + def test_absent_1(self): + # area only -> absent + set_module_args( + dict(interface="ethernet1/33.101", ospf=1, area=1, state="absent") + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/33.101", + "no ip router ospf 1 area 0.0.0.1", + ], + ) + + # None -> absent + set_module_args( + dict(interface="ethernet1/33", ospf=1, area=1, state="absent") + ) + self.execute_module(changed=False) + + def test_loopback_interface_failed(self): + set_module_args( + dict(interface="loopback0", ospf=1, area=0, passive_interface=True) + ) + self.execute_module(failed=True, changed=False) + set_module_args( + dict(interface="loopback0", ospf=1, area=0, network="broadcast") + ) + self.execute_module(failed=True, changed=False) + + def test_nxos_interface_ospf_passive(self): + # default -> True + set_module_args( + dict( + interface="ethernet1/33", + ospf=1, + area=1, + passive_interface=True, + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/33", + "ip router ospf 1 area 0.0.0.1", + "ip ospf passive-interface", + ], + ) + # default -> False + set_module_args( + dict( + interface="ethernet1/33", + ospf=1, + area=1, + passive_interface=False, + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/33", + "ip router ospf 1 area 0.0.0.1", + "no ip ospf passive-interface", + ], + ) + # True -> False + set_module_args( + dict( + interface="ethernet1/34", + ospf=1, + area=1, + passive_interface=False, + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/34", + "no ip ospf passive-interface", + ], + ) + # True -> default (absent) + set_module_args( + dict(interface="ethernet1/34", ospf=1, area=1, state="absent") + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/34", + "no ip router ospf 1 area 0.0.0.1", + "default ip ospf passive-interface", + ], + ) + # False -> True + set_module_args( + dict( + interface="ethernet1/35", + ospf=1, + area=1, + passive_interface=True, + ) + ) + self.execute_module( + changed=True, + commands=["interface Ethernet1/35", "ip ospf passive-interface"], + ) + # False -> default (absent) + set_module_args( + dict(interface="ethernet1/35", ospf=1, area=1, state="absent") + ) + self.execute_module( + changed=True, + commands=[ + "interface Ethernet1/35", + "no ip router ospf 1 area 0.0.0.1", + "default ip ospf passive-interface", + ], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interfaces.py new file mode 100644 index 00000000..ef76b6b4 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_interfaces.py @@ -0,0 +1,681 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_interfaces +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.interfaces.interfaces import ( + Interfaces, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.interfaces.interfaces import ( + InterfacesFacts, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosInterfacesModule(TestNxosModule): + + module = nxos_interfaces + + def setUp(self): + super(TestNxosInterfacesModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.interfaces.interfaces.Interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_get_system_defaults = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.interfaces.interfaces.Interfaces.get_system_defaults" + ) + self.get_system_defaults = self.mock_get_system_defaults.start() + + self.mock_get_platform = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.interfaces.interfaces.Interfaces.get_platform" + ) + self.get_platform = self.mock_get_platform.start() + + def tearDown(self): + super(TestNxosInterfacesModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_system_defaults.stop() + self.mock_get_platform.stop() + + def load_fixtures(self, commands=None, device=""): + self.mock_FACT_LEGACY_SUBSETS.return_value = dict() + self.get_resource_connection_config.return_value = None + self.edit_config.return_value = None + if device == "legacy": + # call execute_module() with device='legacy' to use this codepath + self.get_platform.return_value = "N3K-Cxxx" + else: + self.get_platform.return_value = "N9K-Cxxx" + + SHOW_RUN_INTF = "show running-config | section ^interface" + + def test_1(self): + # Overall general test for each state: merged, deleted, overridden, replaced + sysdefs = dedent( + """\ + ! + ! Interfaces default to L3 !! + ! + no system default switchport + no system default switchport shutdown + """ + ) + intf = dedent( + """\ + interface mgmt0 + description do not manage mgmt0! + interface Ethernet1/1 + description foo + interface Ethernet1/2 + description bar + speed 1000 + duplex full + mtu 4096 + ip forward + fabric forwarding mode anycast-gateway + interface Ethernet1/3 + interface Ethernet1/4 + interface Ethernet1/5 + interface Ethernet1/6 + no shutdown + interface loopback0 + description test-loopback + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_RUN_INTF: intf + } + self.get_system_defaults.return_value = sysdefs + + playbook = dict( + config=[ + dict(name="Ethernet1/1", description="ansible", mode="layer3"), + dict( + name="Ethernet1/2", + speed=10000, + duplex="auto", + mtu=1500, + ip_forward=False, + fabric_forwarding_anycast_gateway=False, + ), + dict(name="Ethernet1/3", description="ansible", mode="layer3"), + dict( + name="Ethernet1/3.101", + description="test-sub-intf", + enabled=False, + ), + dict(name="Ethernet1/4", mode="layer2"), + dict(name="Ethernet1/5"), + dict(name="loopback1", description="test-loopback"), + ] + ) + merged = [ + # Update existing device states with any differences in the playbook. + "interface Ethernet1/1", + "description ansible", + "interface Ethernet1/2", + "speed 10000", + "duplex auto", + "mtu 1500", + "no ip forward", + "no fabric forwarding mode anycast-gateway", + "interface Ethernet1/3", + "description ansible", + "interface Ethernet1/3.101", + "description test-sub-intf", + "interface Ethernet1/4", + "switchport", + "interface loopback1", + "description test-loopback", + ] + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + deleted = [ + # Reset existing device state to default values. Scope is limited to + # objects in the play. Ignores any play attrs other than 'name'. + "interface Ethernet1/1", + "no description", + "interface Ethernet1/2", + "no description", + "no speed", + "no duplex", + "no mtu", + "no ip forward", + "no fabric forwarding mode anycast-gateway", + ] + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + replaced = [ + # Scope is limited to objects in the play. The play is the source of + # truth for the objects that are explicitly listed. + "interface Ethernet1/1", + "description ansible", + "interface Ethernet1/2", + "no description", + "no ip forward", + "no fabric forwarding mode anycast-gateway", + "speed 10000", + "duplex auto", + "mtu 1500", + "interface Ethernet1/3", + "description ansible", + "interface Ethernet1/3.101", + "description test-sub-intf", + "interface Ethernet1/4", + "switchport", + "interface loopback1", + "description test-loopback", + ] + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + overridden = [ + # The play is the source of truth. Similar to replaced but the scope + # includes all objects on the device; i.e. it will also reset state + # on objects not found in the play. + "interface Ethernet1/1", + "description ansible", + "interface Ethernet1/2", + "no description", + "no ip forward", + "no fabric forwarding mode anycast-gateway", + "speed 10000", + "duplex auto", + "mtu 1500", + "interface Ethernet1/6", + "shutdown", + "interface loopback0", + "no description", + "interface Ethernet1/3", + "description ansible", + "interface Ethernet1/4", + "switchport", + "interface Ethernet1/3.101", + "description test-sub-intf", + "interface loopback1", + "description test-loopback", + "interface mgmt0", + "no description", + ] + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_2(self): + # 'enabled'/shutdown behaviors are tricky: + # - different default states for different interface types for different + # platforms, based on 'system default switchport' settings + # - virtual interfaces may not exist yet + # - idempotence for interfaces with all default states + sysdefs = dedent( + """\ + ! + ! Interfaces default to L3 !! + ! + no system default switchport + no system default switchport shutdown + """ + ) + intf = dedent( + """\ + interface mgmt0 + interface Ethernet1/1 + interface Ethernet1/2 + switchport + shutdown + interface Ethernet1/3 + switchport + interface loopback1 + interface loopback2 + shutdown + interface loopback3 + interface loopback8 + interface loopback9 + shutdown + interface port-channel2 + interface port-channel3 + shutdown + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_RUN_INTF: intf + } + self.get_system_defaults.return_value = sysdefs + + playbook = dict( + config=[ + # Set non-default states on existing objs + dict(name="Ethernet1/1", mode="layer3", enabled=True), + dict(name="loopback1", enabled=False), + # Set default states on existing objs + dict(name="Ethernet1/2", enabled=True), + dict(name="loopback2", enabled=True), + # Set explicit default state on existing objs (no chg) + dict(name="Ethernet1/3", enabled=True), + dict(name="loopback3", enabled=True), + dict(name="port-channel3", enabled=True), + # Set default state on non-existent objs; no state changes but need to create intf + dict(name="loopback4", enabled=True), + dict(name="port-channel4", enabled=True), + dict(name="Ethernet1/4.101"), + ] + ) + # Testing with newer code version + merged = [ + "interface Ethernet1/1", + "no shutdown", + "interface loopback1", + "shutdown", + "interface Ethernet1/2", + "no shutdown", + "interface loopback2", + "no shutdown", + "interface port-channel3", + "no shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + deleted = [ + # e1/2 becomes L3 so enable default changes to false + "interface Ethernet1/2", + "no switchport", + "interface loopback2", + "no shutdown", + "interface Ethernet1/3", + "no switchport", + "interface port-channel3", + "no shutdown", + ] + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + replaced = [ + "interface Ethernet1/1", + "no shutdown", + "interface loopback1", + "shutdown", + "interface Ethernet1/2", + "no switchport", + "no shutdown", + "interface loopback2", + "no shutdown", + "interface Ethernet1/3", + "no switchport", + "no shutdown", + "interface port-channel3", + "no shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + overridden = [ + "interface Ethernet1/2", + "no switchport", + "no shutdown", + "interface Ethernet1/3", + "no switchport", + "no shutdown", + "interface loopback2", + "no shutdown", + "interface loopback9", + "no shutdown", + "interface port-channel3", + "no shutdown", + "interface Ethernet1/1", + "no shutdown", + "interface loopback1", + "shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_3(self): + # Testing 'enabled' with different 'system default' settings. + # This is the same as test_2 with some minor changes. + sysdefs = dedent( + """\ + ! + ! Interfaces default to L2 !! + ! + system default switchport + system default switchport shutdown + """ + ) + intf = dedent( + """\ + interface mgmt0 + interface Ethernet1/1 + interface Ethernet1/2 + no switchport + no shutdown + interface Ethernet1/3 + no switchport + interface loopback1 + interface loopback2 + shutdown + interface loopback3 + interface loopback8 + interface loopback9 + shutdown + interface port-channel2 + interface port-channel3 + shutdown + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_RUN_INTF: intf + } + self.get_system_defaults.return_value = sysdefs + + playbook = dict( + config=[ + # Set non-default states on existing objs + dict(name="Ethernet1/1", mode="layer3", enabled=True), + dict(name="loopback1", enabled=False), + # Set default states on existing objs + dict(name="Ethernet1/2", enabled=False), + dict(name="loopback2", enabled=True), + # Set explicit default state on existing objs (no chg) + dict(name="Ethernet1/3", enabled=False), + dict(name="loopback3", enabled=True), + dict(name="port-channel3", enabled=True), + # Set default state on non-existent objs; no state changes but need to create intf + dict(name="loopback4", enabled=True), + dict(name="port-channel4", enabled=True), + dict(name="Ethernet1/4.101"), + ] + ) + merged = [ + "interface Ethernet1/1", + "no switchport", + "no shutdown", + "interface loopback1", + "shutdown", + "interface Ethernet1/2", + "shutdown", + "interface loopback2", + "no shutdown", + "interface port-channel3", + "no shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + # Test with an older image version which has different defaults + merged_legacy = [ + "interface Ethernet1/1", + "no switchport", + "interface loopback1", + "shutdown", + "interface Ethernet1/2", + "shutdown", + "interface loopback2", + "no shutdown", + "interface Ethernet1/3", + "shutdown", + "interface port-channel3", + "no shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + self.execute_module( + changed=True, commands=merged_legacy, device="legacy" + ) + + deleted = [ + "interface Ethernet1/2", + "switchport", + "shutdown", + "interface loopback2", + "no shutdown", + "interface Ethernet1/3", + "switchport", + "interface port-channel3", + "no shutdown", + ] + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + replaced = [ + "interface Ethernet1/1", + "no switchport", + "no shutdown", + "interface loopback1", + "shutdown", + "interface Ethernet1/2", + "switchport", + "shutdown", + "interface loopback2", + "no shutdown", + "interface Ethernet1/3", + "switchport", + "interface port-channel3", + "no shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + overridden = [ + "interface Ethernet1/2", + "switchport", + "shutdown", + "interface Ethernet1/3", + "switchport", + "interface loopback2", + "no shutdown", + "interface loopback9", + "no shutdown", + "interface port-channel3", + "no shutdown", + "interface Ethernet1/1", + "no switchport", + "no shutdown", + "interface loopback1", + "shutdown", + "interface loopback4", + "interface port-channel4", + "interface Ethernet1/4.101", + ] + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_4(self): + # Basic idempotence test + sysdefs = dedent( + """\ + ! + ! Interfaces default to L3 !! + ! + no system default switchport + no system default switchport shutdown + """ + ) + intf = dedent( + """\ + interface Ethernet1/1 + interface Ethernet1/2 + switchport + speed 1000 + shutdown + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_RUN_INTF: intf + } + self.get_system_defaults.return_value = sysdefs + + playbook = dict( + config=[ + dict(name="Ethernet1/1", mode="layer3"), + dict(name="Ethernet1/2", mode="layer2", enabled=False), + ] + ) + merged = [] + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, commands=merged) + + def test_5(self): + # 'state: deleted' without 'config'; clean all objects. + sysdefs = dedent( + """\ + ! + ! Interfaces default to L3 !! + ! + no system default switchport + no system default switchport shutdown + """ + ) + intf = dedent( + """\ + interface Ethernet1/1 + switchport + interface Ethernet1/2 + speed 1000 + no shutdown + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_RUN_INTF: intf + } + self.get_system_defaults.return_value = sysdefs + + playbook = dict() + deleted = [ + "interface Ethernet1/1", + "no switchport", + "interface Ethernet1/2", + "no speed", + "shutdown", + ] + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + def test_6_gathered(self): + # check for parsing correct contexts + sysdefs = dedent( + """\ + ! + ! Interfaces default to L3 !! + ! + no system default switchport + no system default switchport shutdown + """ + ) + intf = dedent( + """\ + interface nve1 + no shutdown + source-interface loopback1 + interface Ethernet1/1 + switchport + description interface + interface Ethernet1/2 + speed 1000 + no shutdown + interface loopback1 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_RUN_INTF: intf + } + self.get_system_defaults.return_value = sysdefs + + playbook = dict() + playbook["state"] = "gathered" + + gathered_facts = [ + {"name": "nve1", "enabled": True}, + { + "name": "Ethernet1/1", + "mode": "layer2", + "description": "interface", + }, + {"name": "Ethernet1/2", "enabled": True, "speed": "1000"}, + {"name": "loopback1"}, + ] + set_module_args(playbook, ignore_provider_arg) + result = self.execute_module(changed=False) + self.assertEqual(result["gathered"], gathered_facts) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interface.py new file mode 100644 index 00000000..f30ad8ff --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interface.py @@ -0,0 +1,395 @@ +# Copyright: (c) 2019, Olivier Blin +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_l3_interface +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosL3InterfaceModule(TestNxosModule): + + module = nxos_l3_interface + + def setUp(self): + super(TestNxosL3InterfaceModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_l3_interface.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_l3_interface.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosL3InterfaceModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + self.get_config.return_value = load_fixture( + "nxos_l3_interface", self.mode + ) + + def test_nxos_l3_interface_unknonw_ethernet(self): + self.mode = "ethernet_noshut" + set_module_args(dict(name="Ethernet1/2", ipv4="192.168.0.1/24")) + result = self.execute_module(changed=False) + + # Add when missing + def test_nxos_l3_interface_add_missing_ipv4(self): + self.mode = "ethernet_noshut" + set_module_args(dict(name="Ethernet1/1", ipv4="192.168.0.1/24")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["interface Ethernet1/1", "ip address 192.168.0.1/24", "exit"], + ) + + def test_nxos_l3_interface_add_missing_ipv4_on_e11(self): + self.mode = "ethernet_noshut" + set_module_args(dict(name="et1/1", ipv4="192.168.0.1/24")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["interface Ethernet1/1", "ip address 192.168.0.1/24", "exit"], + ) + + def test_nxos_l3_interface_add_missing_ipv6(self): + self.mode = "ethernet_noshut" + set_module_args(dict(name="Ethernet1/1", ipv6="2001:db8::1/124")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["interface Ethernet1/1", "ipv6 address 2001:db8::1/124", "exit"], + ) + + def test_nxos_l3_interface_add_missing_ipv4_and_ipv6(self): + self.mode = "ethernet_noshut" + set_module_args( + dict( + name="Ethernet1/1", + ipv4="192.168.0.1/24", + ipv6="2001:db8::1/124", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "ip address 192.168.0.1/24", + "ipv6 address 2001:db8::1/124", + "exit", + ], + ) + + # Add when existing + def test_nxos_l3_interface_add_existing_ipv4(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args(dict(name="Ethernet1/1", ipv4="192.168.0.1/24")) + result = self.execute_module() + + def test_nxos_l3_interface_add_existing_ipv4_on_e11(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args(dict(name="et1/1", ipv4="192.168.0.1/24")) + result = self.execute_module() + + def test_nxos_l3_interface_add_existing_ipv6(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args(dict(name="Ethernet1/1", ipv6="2001:db8::1/124")) + result = self.execute_module() + + def test_nxos_l3_interface_add_existing_ipv4_and_ipv6(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args( + dict( + name="Ethernet1/1", + ipv4="192.168.0.1/24", + ipv6="2001:db8::1/124", + ) + ) + result = self.execute_module() + + def test_nxos_l3_interface_new_ipv4_and_ipv6(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args( + dict( + name="Ethernet1/1", + ipv4="192.168.0.2/24", + ipv6="2001:db8::2/124", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "ip address 192.168.0.2/24", + "ipv6 address 2001:db8::2/124", + "exit", + ], + ) + + # Add when existing with multiple IPv6 + def test_nxos_l3_interface_multiple_ipv6_add_first(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args(dict(name="Ethernet1/1", ipv6="2001:db8::1/124")) + result = self.execute_module() + + def test_nxos_l3_interface_multiple_ipv6_add_last(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args(dict(name="Ethernet1/1", ipv6="2001:db8:2::1/124")) + result = self.execute_module() + + # Add aggregate + def test_nxos_l3_interface_add_missing_with_empty_aggregate(self): + self.mode = "ethernet_noshut" + set_module_args(dict(aggregate=[])) + result = self.execute_module() + + def test_nxos_l3_interface_add_missing_with_aggregate(self): + self.mode = "ethernet_noshut" + set_module_args( + dict( + aggregate=[ + dict( + name="Ethernet1/1", + ipv4="192.168.0.2/24", + ipv6="2001:db8::2/124", + ), + dict(name="Ethernet1/1", ipv6="2001:db8:1::2/124"), + dict(name="Ethernet1/1", ipv6="2001:db8:2::2/124"), + ] + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "ip address 192.168.0.2/24", + "ipv6 address 2001:db8::2/124", + "exit", + "interface Ethernet1/1", + "ipv6 address 2001:db8:1::2/124", + "exit", + "interface Ethernet1/1", + "ipv6 address 2001:db8:2::2/124", + "exit", + ], + ) + + # Rem when missing + def test_nxos_l3_interface_rem_missing_ipv4(self): + self.mode = "ethernet_noshut" + set_module_args( + dict(name="Ethernet1/1", ipv4="192.168.0.1/24", state="absent") + ) + result = self.execute_module() + + def test_nxos_l3_interface_rem_missing_ipv4_on_e11(self): + self.mode = "ethernet_noshut" + set_module_args( + dict(name="et1/1", ipv4="192.168.0.1/24", state="absent") + ) + result = self.execute_module() + + def test_nxos_l3_interface_rem_missing_ipv6(self): + self.mode = "ethernet_noshut" + set_module_args( + dict(name="Ethernet1/1", ipv6="2001:db8::1/124", state="absent") + ) + result = self.execute_module() + + def test_nxos_l3_interface_rem_missing_ipv4_and_ipv6(self): + self.mode = "ethernet_noshut" + set_module_args( + dict( + name="Ethernet1/1", + ipv4="192.168.0.1/24", + ipv6="2001:db8::1/124", + state="absent", + ) + ) + result = self.execute_module() + + # Rem when existing + def test_nxos_l3_interface_rem_existing_ipv4(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args( + dict(name="Ethernet1/1", ipv4="192.168.0.1/24", state="absent") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["interface Ethernet1/1", "no ip address 192.168.0.1/24", "exit"], + ) + + def test_nxos_l3_interface_rem_existing_ipv4_on_e11(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args( + dict(name="et1/1", ipv4="192.168.0.1/24", state="absent") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["interface Ethernet1/1", "no ip address 192.168.0.1/24", "exit"], + ) + + def test_nxos_l3_interface_rem_existing_ipv6(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args( + dict(name="Ethernet1/1", ipv6="2001:db8::1/124", state="absent") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "no ipv6 address 2001:db8::1/124", + "exit", + ], + ) + + def test_nxos_l3_interface_rem_existing_ipv4_and_ipv6(self): + self.mode = "ethernet_noshut_ipv4_ipv6" + set_module_args( + dict( + name="Ethernet1/1", + ipv4="192.168.0.1/24", + ipv6="2001:db8::1/124", + state="absent", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "no ip address 192.168.0.1/24", + "no ipv6 address 2001:db8::1/124", + "exit", + ], + ) + + # Rem when existing with multiple IPv6 + def test_nxos_l3_interface_multiple_ipv6_rem_first(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args( + dict(name="Ethernet1/1", ipv6="2001:db8::1/124", state="absent") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "no ipv6 address 2001:db8::1/124", + "exit", + ], + ) + + def test_nxos_l3_interface_multiple_ipv6_rem_last(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args( + dict(name="Ethernet1/1", ipv6="2001:db8:2::1/124", state="absent") + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "no ipv6 address 2001:db8:2::1/124", + "exit", + ], + ) + + # Rem when missing with aggregate + def test_nxos_l3_interface_rem_with_empty_aggregate(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args(dict(aggregate=[], state="absent")) + result = self.execute_module() + + def test_nxos_l3_interface_rem_missing_with_aggregate(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args( + dict( + state="absent", + aggregate=[ + dict( + name="Ethernet1/1", + ipv4="192.168.0.2/24", + ipv6="2001:db8::2/124", + ), + dict(name="Ethernet1/1", ipv6="2001:db8:1::2/124"), + dict(name="Ethernet1/1", ipv6="2001:db8:2::2/124"), + ], + ) + ) + result = self.execute_module() + + # Rem when existing with aggregate + def test_nxos_l3_interface_rem_existing_with_aggregate(self): + self.mode = "ethernet_noshut_multiple_ipv6" + set_module_args( + dict( + state="absent", + aggregate=[ + dict( + name="Ethernet1/1", + ipv4="192.168.0.1/24", + ipv6="2001:db8::1/124", + ), + dict(name="Ethernet1/1", ipv6="2001:db8:1::1/124"), + dict(name="Ethernet1/1", ipv6="2001:db8:2::1/124"), + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "interface Ethernet1/1", + "no ip address 192.168.0.1/24", + "no ipv6 address 2001:db8::1/124", + "exit", + "interface Ethernet1/1", + "no ipv6 address 2001:db8:1::1/124", + "exit", + "interface Ethernet1/1", + "no ipv6 address 2001:db8:2::1/124", + "exit", + ], + ) + + # Add itf only + def test_nxos_l3_interface_add_on_itf_only(self): + self.mode = "ethernet_noshut" + set_module_args(dict(name="Ethernet1/1")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["interface Ethernet1/1"]) + + # Add unknown interface + def test_nxos_l3_interface_add_on_unknown_itf(self): + self.mode = "ethernet_noshut" + set_module_args(dict(name="Ethernet1/2", ipv4="192.168.0.1/24")) + result = self.execute_module() + self.assertEqual(result["warnings"], ["Unknown interface Ethernet1/2"]) + + # Rem unknown interface + def test_nxos_l3_interface_rem_on_unknown_itf(self): + self.mode = "ethernet_noshut" + set_module_args( + dict(name="Ethernet1/2", ipv4="192.168.0.1/24", state="absent") + ) + result = self.execute_module() + self.assertEqual(result["warnings"], ["Unknown interface Ethernet1/2"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interfaces.py new file mode 100644 index 00000000..bacc0d4c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_l3_interfaces.py @@ -0,0 +1,1037 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + PropertyMock, +) +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_l3_interfaces +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.l3_interfaces.l3_interfaces import ( + L3_interfaces, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosL3InterfacesModule(TestNxosModule): + + module = nxos_l3_interfaces + + def setUp(self): + super(TestNxosL3InterfacesModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.l3_interfaces.l3_interfaces.L3_interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + def tearDown(self): + super(TestNxosL3InterfacesModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + + def load_fixtures(self, commands=None, device="N9K"): + self.mock_FACT_LEGACY_SUBSETS.return_value = dict() + self.get_resource_connection_config.return_value = None + self.edit_config.return_value = None + L3_interfaces.platform = PropertyMock(return_value=device) + + # --------------------------- + # L3_interfaces Test Cases + # --------------------------- + + # 'state' logic behaviors + # + # - 'merged' : Update existing device state with any differences in the play. + # - 'deleted' : Reset existing device state to default values. Ignores any + # play attrs other than 'name'. Scope is limited to interfaces + # in the play. + # - 'overridden': The play is the source of truth. Similar to replaced but the + # scope includes all interfaces; ie. it will also reset state + # on interfaces not found in the play. + # - 'replaced' : Scope is limited to the interfaces in the play. + + SHOW_CMD = "show running-config | section ^interface" + + def test_2(self): + # basic tests + existing = dedent( + """\ + interface mgmt0 + ip address 10.0.0.254/24 + interface Ethernet1/1 + ip address 10.1.1.1/24 + interface Ethernet1/2 + ip address 10.1.2.1/24 + interface Ethernet1/3 + ip address 10.1.3.1/24 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="mgmt0", ipv4=[{"address": "10.0.0.254/24"}]), + dict(name="Ethernet1/1", ipv4=[{"address": "192.168.1.1/24"}]), + dict(name="Ethernet1/2"), + # Eth1/3 not present! Thus overridden should set Eth1/3 to defaults; + # replaced should ignore Eth1/3. + ] + ) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1", "ip address 192.168.1.1/24"] + deleted = [ + "interface mgmt0", + "no ip address", + "interface Ethernet1/1", + "no ip address", + "interface Ethernet1/2", + "no ip address", + ] + replaced = [ + "interface Ethernet1/1", + "ip address 192.168.1.1/24", + "interface Ethernet1/2", + "no ip address", + ] + overridden = [ + "interface Ethernet1/1", + "ip address 192.168.1.1/24", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/3", + "no ip address", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_3(self): + # encap testing + existing = dedent( + """\ + interface mgmt0 + ip address 10.0.0.254/24 + interface Ethernet1/1.41 + encapsulation dot1q 4100 + ip address 10.1.1.1/24 + interface Ethernet1/1.42 + encapsulation dot1q 42 + interface Ethernet1/1.44 + encapsulation dot1q 44 + interface Ethernet1/1.45 + encapsulation dot1q 45 + ip address 10.5.5.5/24 + ipv6 address 10::5/128 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="mgmt0", ipv4=[{"address": "10.0.0.254/24"}]), + dict( + name="Ethernet1/1.41", + dot1q=41, + ipv4=[{"address": "10.2.2.2/24"}], + ), + dict(name="Ethernet1/1.42", dot1q=42), + dict( + name="Ethernet1/1.43", + dot1q=43, + ipv6=[{"address": "10::2/128"}], + ), + dict(name="Ethernet1/1.44"), + ] + ) + # Expected result commands for each 'state' + merged = [ + "interface Ethernet1/1.41", + "encapsulation dot1q 41", + "ip address 10.2.2.2/24", + "interface Ethernet1/1.43", + "encapsulation dot1q 43", + "ipv6 address 10::2/128", + ] + deleted = [ + "interface mgmt0", + "no ip address", + "interface Ethernet1/1.41", + "no encapsulation dot1q", + "no ip address", + "interface Ethernet1/1.42", + "no encapsulation dot1q", + "interface Ethernet1/1.44", + "no encapsulation dot1q", + ] + replaced = [ + "interface Ethernet1/1.41", + "encapsulation dot1q 41", + "ip address 10.2.2.2/24", + # 42 no chg + "interface Ethernet1/1.43", + "encapsulation dot1q 43", + "ipv6 address 10::2/128", + "interface Ethernet1/1.44", + "no encapsulation dot1q", + ] + overridden = [ + "interface Ethernet1/1.41", + "encapsulation dot1q 41", + "ip address 10.2.2.2/24", + # 42 no chg + "interface Ethernet1/1.44", + "no encapsulation dot1q", + "interface Ethernet1/1.45", + "no encapsulation dot1q", + "no ip address", + "no ipv6 address", + "interface Ethernet1/1.43", + "encapsulation dot1q 43", + "ipv6 address 10::2/128", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_4(self): + # IPv4-centric testing + existing = dedent( + """\ + interface mgmt0 + ip address 10.0.0.254/24 + interface Ethernet1/1 + no ip redirects + ip address 10.1.1.1/24 tag 11 + ip address 10.2.2.2/24 secondary tag 12 + ip address 10.3.3.3/24 secondary + ip address 10.4.4.4/24 secondary tag 14 + ip address 10.5.5.5/24 secondary tag 15 + ip address 10.6.6.6/24 secondary tag 16 + interface Ethernet1/2 + ip address 10.12.12.12/24 + interface Ethernet1/3 + ip address 10.13.13.13/24 + interface Ethernet1/5 + no ip redirects + ip address 10.15.15.15/24 + ip address 10.25.25.25/24 secondary + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="mgmt0", ipv4=[{"address": "10.0.0.254/24"}]), + dict( + name="Ethernet1/1", + ipv4=[ + { + "address": "10.1.1.1/24", + "secondary": True, + }, # prim->sec + { + "address": "10.2.2.2/24", + "secondary": True, + }, # rmv tag + {"address": "10.3.3.3/24", "tag": 3}, # become prim + { + "address": "10.4.4.4/24", + "secondary": True, + "tag": 14, + }, # no chg + { + "address": "10.5.5.5/24", + "secondary": True, + "tag": 55, + }, # chg tag + { + "address": "10.7.7.7/24", + "secondary": True, + "tag": 77, + }, + ], + ), # new ip + dict(name="Ethernet1/2"), + dict( + name="Ethernet1/4", + ipv4=[ + {"address": "10.40.40.40/24"}, + {"address": "10.41.41.41/24", "secondary": True}, + ], + ), + dict(name="Ethernet1/5"), + ] + ) + # Expected result commands for each 'state' + merged = [ + "interface Ethernet1/1", + "no ip address 10.5.5.5/24 secondary", + "no ip address 10.2.2.2/24 secondary", + "no ip address 10.3.3.3/24 secondary", + "ip address 10.3.3.3/24 tag 3", # Changes primary + "ip address 10.1.1.1/24 secondary", + "ip address 10.2.2.2/24 secondary", + "ip address 10.7.7.7/24 secondary tag 77", + "ip address 10.5.5.5/24 secondary tag 55", + "interface Ethernet1/4", + "ip address 10.40.40.40/24", + "ip address 10.41.41.41/24 secondary", + ] + deleted = [ + "interface mgmt0", + "no ip address", + "interface Ethernet1/1", + "no ip address", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/5", + "no ip address", + ] + replaced = [ + "interface Ethernet1/1", + "no ip address 10.5.5.5/24 secondary", + "no ip address 10.2.2.2/24 secondary", + "no ip address 10.3.3.3/24 secondary", + "ip address 10.3.3.3/24 tag 3", # Changes primary + "ip address 10.1.1.1/24 secondary", + "ip address 10.2.2.2/24 secondary", + "ip address 10.7.7.7/24 secondary tag 77", + "ip address 10.5.5.5/24 secondary tag 55", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/4", + "ip address 10.40.40.40/24", + "ip address 10.41.41.41/24 secondary", + "interface Ethernet1/5", + "no ip address", + ] + overridden = [ + "interface Ethernet1/1", + "no ip address 10.6.6.6/24 secondary", + "no ip address 10.5.5.5/24 secondary", + "no ip address 10.2.2.2/24 secondary", + "no ip address 10.3.3.3/24 secondary", + "ip address 10.3.3.3/24 tag 3", # Changes primary + "ip address 10.1.1.1/24 secondary", + "ip address 10.2.2.2/24 secondary", + "ip address 10.7.7.7/24 secondary tag 77", + "ip address 10.5.5.5/24 secondary tag 55", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/3", + "no ip address", + "interface Ethernet1/4", + "ip address 10.40.40.40/24", + "ip address 10.41.41.41/24 secondary", + "interface Ethernet1/5", + "no ip address", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_5(self): + # IPv6-centric testing + existing = dedent( + """\ + interface Ethernet1/1 + ipv6 address 10::1/128 + ipv6 address 10::2/128 tag 12 + ipv6 address 10::3/128 tag 13 + ipv6 address 10::4/128 tag 14 + interface Ethernet1/2 + ipv6 address 10::12/128 + interface Ethernet1/3 + ipv6 address 10::13/128 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict( + name="Ethernet1/1", + ipv6=[ + {"address": "10::1/128"}, # no chg + {"address": "10::3/128"}, # tag rmv + {"address": "10::4/128", "tag": 44}, # tag chg + {"address": "10::5/128"}, # new addr + {"address": "10::6/128", "tag": 66}, + ], + ), # new addr+tag + dict(name="Ethernet1/2"), + ] + ) + # Expected result commands for each 'state' + merged = [ + "interface Ethernet1/1", + "ipv6 address 10::4/128 tag 44", + "ipv6 address 10::5/128", + "ipv6 address 10::6/128 tag 66", + ] + deleted = [ + "interface Ethernet1/1", + "no ipv6 address", + "interface Ethernet1/2", + "no ipv6 address", + ] + replaced = [ + "interface Ethernet1/1", + "no ipv6 address 10::3/128", + "no ipv6 address 10::2/128", + "ipv6 address 10::4/128 tag 44", + "ipv6 address 10::3/128", + "ipv6 address 10::5/128", + "ipv6 address 10::6/128 tag 66", + "interface Ethernet1/2", + "no ipv6 address 10::12/128", + ] + overridden = [ + "interface Ethernet1/1", + "no ipv6 address 10::3/128", + "no ipv6 address 10::2/128", + "ipv6 address 10::4/128 tag 44", + "ipv6 address 10::3/128", + "ipv6 address 10::5/128", + "ipv6 address 10::6/128 tag 66", + "interface Ethernet1/2", + "no ipv6 address 10::12/128", + "interface Ethernet1/3", + "no ipv6 address", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + # + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + # + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_6(self): + # misc tests + existing = dedent( + """\ + interface Ethernet1/1 + ip address 10.1.1.1/24 + no ip redirects + ip unreachables + interface Ethernet1/2 + interface Ethernet1/3 + interface Ethernet1/4 + interface Ethernet1/5 + no ip redirects + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict( + name="Ethernet1/1", + redirects=True, + unreachables=False, + ipv4=[{"address": "192.168.1.1/24"}], + ), + dict(name="Ethernet1/2"), + dict( + name="Ethernet1/3", redirects=True, unreachables=False + ), # defaults + dict(name="Ethernet1/4", redirects=False, unreachables=True), + ] + ) + merged = [ + "interface Ethernet1/1", + "ip redirects", + "no ip unreachables", + "ip address 192.168.1.1/24", + "interface Ethernet1/4", + "no ip redirects", + "ip unreachables", + ] + deleted = [ + "interface Ethernet1/1", + "ip redirects", + "no ip unreachables", + "no ip address", + ] + replaced = [ + "interface Ethernet1/1", + "ip redirects", + "no ip unreachables", + "ip address 192.168.1.1/24", + "interface Ethernet1/4", + "no ip redirects", + "ip unreachables", + ] + overridden = [ + "interface Ethernet1/1", + "ip redirects", + "no ip unreachables", + "ip address 192.168.1.1/24", + "interface Ethernet1/5", + "ip redirects", + "interface Ethernet1/4", + "no ip redirects", + "ip unreachables", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_7(self): + # idempotence + existing = dedent( + """\ + interface Ethernet1/1 + ip address 10.1.1.1/24 + ip address 10.2.2.2/24 secondary tag 2 + ip address 10.3.3.3/24 secondary tag 3 + ip address 10.4.4.4/24 secondary + ipv6 address 10::1/128 + ipv6 address 10::2/128 tag 2 + no ip redirects + ip unreachables + interface Ethernet1/2 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict( + name="Ethernet1/1", + redirects=False, + unreachables=True, + ipv4=[ + {"address": "10.1.1.1/24"}, + { + "address": "10.2.2.2/24", + "secondary": True, + "tag": 2, + }, + { + "address": "10.3.3.3/24", + "secondary": True, + "tag": 3, + }, + {"address": "10.4.4.4/24", "secondary": True}, + ], + ipv6=[ + {"address": "10::1/128"}, + {"address": "10::2/128", "tag": 2}, + ], + ), + dict(name="Ethernet1/2"), + ] + ) + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False) + + # Modify output for deleted idempotence test + existing = dedent( + """\ + interface Ethernet1/1 + interface Ethernet1/2 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False) + + def test_8(self): + # no 'config' key in playbook + existing = dedent( + """\ + interface Ethernet1/1 + ip address 10.1.1.1/24 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict() + + for i in ["merged", "replaced", "overridden"]: + playbook["state"] = i + set_module_args(playbook, ignore_provider_arg) + self.execute_module(failed=True) + + deleted = ["interface Ethernet1/1", "no ip address"] + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + def test_9(self): + # Platform specific checks + # 'ip redirects' has platform-specific behaviors + existing = dedent( + """\ + interface Ethernet1/3 + ip address 10.13.13.13/24 + interface Ethernet1/5 + no ip redirects + ip address 10.15.15.15/24 + ip address 10.25.25.25/24 secondary + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[dict(name="Ethernet1/3"), dict(name="Ethernet1/5")] + ) + # Expected result commands for each 'state' + deleted = [ + "interface Ethernet1/3", + "no ip address", + "interface Ethernet1/5", + "no ip address", + "ip redirects", + ] + replaced = [ + "interface Ethernet1/3", + "no ip address", + "interface Ethernet1/5", + "no ip address", + "ip redirects", + ] + overridden = [ + "interface Ethernet1/3", + "no ip address", + "interface Ethernet1/5", + "no ip address", + "ip redirects", + ] + platform = "N3K" + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False, device=platform) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted, device=platform) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced, device=platform) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden, device=platform) + + def test_10(self): + # basic tests + existing = dedent( + """\ + interface mgmt0 + ip address 10.0.0.254/24 + interface Ethernet1/1 + ip address 10.1.1.1/24 + interface Ethernet1/2 + ip address 10.1.2.1/24 + evpn multisite fabric-tracking + interface Ethernet1/3 + ip address 10.1.3.1/24 + evpn multisite dci-tracking + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="mgmt0", ipv4=[{"address": "10.0.0.254/24"}]), + dict(name="Ethernet1/1", ipv4=[{"address": "192.168.1.1/24"}]), + dict(name="Ethernet1/2"), + # Eth1/3 not present! Thus overridden should set Eth1/3 to defaults; + # replaced should ignore Eth1/3. + ] + ) + # Expected result commands for each 'state' + merged = ["interface Ethernet1/1", "ip address 192.168.1.1/24"] + deleted = [ + "interface mgmt0", + "no ip address", + "interface Ethernet1/1", + "no ip address", + "interface Ethernet1/2", + "no ip address", + "no evpn multisite fabric-tracking", + ] + replaced = [ + "interface Ethernet1/1", + "ip address 192.168.1.1/24", + "interface Ethernet1/2", + "no ip address", + "no evpn multisite fabric-tracking", + ] + overridden = [ + "interface Ethernet1/1", + "ip address 192.168.1.1/24", + "interface Ethernet1/2", + "no ip address", + "no evpn multisite fabric-tracking", + "interface Ethernet1/3", + "no ip address", + "no evpn multisite dci-tracking", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_11(self): + # IPv4-centric testing + existing = dedent( + """\ + interface mgmt0 + ip address 10.0.0.254/24 + interface Ethernet1/1 + no ip redirects + ip address 10.1.1.1/24 tag 11 + ip address 10.2.2.2/24 secondary tag 12 + ip address 10.3.3.3/24 secondary + ip address 10.4.4.4/24 secondary tag 14 + ip address 10.5.5.5/24 secondary tag 15 + ip address 10.6.6.6/24 secondary tag 16 + interface Ethernet1/2 + ip address 10.12.12.12/24 + interface Ethernet1/3 + ip address 10.13.13.13/24 + interface Ethernet1/5 + no ip redirects + ip address 10.15.15.15/24 + ip address 10.25.25.25/24 secondary + evpn multisite fabric-tracking + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict(name="mgmt0", ipv4=[{"address": "10.0.0.254/24"}]), + dict( + name="Ethernet1/1", + ipv4=[ + { + "address": "10.1.1.1/24", + "secondary": True, + }, # prim->sec + { + "address": "10.2.2.2/24", + "secondary": True, + }, # rmv tag + {"address": "10.3.3.3/24", "tag": 3}, # become prim + { + "address": "10.4.4.4/24", + "secondary": True, + "tag": 14, + }, # no chg + { + "address": "10.5.5.5/24", + "secondary": True, + "tag": 55, + }, # chg tag + { + "address": "10.7.7.7/24", + "secondary": True, + "tag": 77, + }, + ], + ), # new ip + dict(name="Ethernet1/2"), + dict( + name="Ethernet1/4", + ipv4=[ + {"address": "10.40.40.40/24"}, + {"address": "10.41.41.41/24", "secondary": True}, + ], + evpn_multisite_tracking="dci-tracking", + ), + dict(name="Ethernet1/5"), + ] + ) + # Expected result commands for each 'state' + merged = [ + "interface Ethernet1/1", + "no ip address 10.5.5.5/24 secondary", + "no ip address 10.2.2.2/24 secondary", + "no ip address 10.3.3.3/24 secondary", + "ip address 10.3.3.3/24 tag 3", # Changes primary + "ip address 10.1.1.1/24 secondary", + "ip address 10.2.2.2/24 secondary", + "ip address 10.7.7.7/24 secondary tag 77", + "ip address 10.5.5.5/24 secondary tag 55", + "interface Ethernet1/4", + "ip address 10.40.40.40/24", + "ip address 10.41.41.41/24 secondary", + "evpn multisite dci-tracking", + ] + deleted = [ + "interface mgmt0", + "no ip address", + "interface Ethernet1/1", + "no ip address", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/5", + "no ip address", + "no evpn multisite fabric-tracking", + ] + replaced = [ + "interface Ethernet1/1", + "no ip address 10.5.5.5/24 secondary", + "no ip address 10.2.2.2/24 secondary", + "no ip address 10.3.3.3/24 secondary", + "ip address 10.3.3.3/24 tag 3", # Changes primary + "ip address 10.1.1.1/24 secondary", + "ip address 10.2.2.2/24 secondary", + "ip address 10.7.7.7/24 secondary tag 77", + "ip address 10.5.5.5/24 secondary tag 55", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/4", + "ip address 10.40.40.40/24", + "ip address 10.41.41.41/24 secondary", + "evpn multisite dci-tracking", + "interface Ethernet1/5", + "no ip address", + "no evpn multisite fabric-tracking", + ] + overridden = [ + "interface Ethernet1/1", + "no ip address 10.6.6.6/24 secondary", + "no ip address 10.5.5.5/24 secondary", + "no ip address 10.2.2.2/24 secondary", + "no ip address 10.3.3.3/24 secondary", + "ip address 10.3.3.3/24 tag 3", # Changes primary + "ip address 10.1.1.1/24 secondary", + "ip address 10.2.2.2/24 secondary", + "ip address 10.7.7.7/24 secondary tag 77", + "ip address 10.5.5.5/24 secondary tag 55", + "interface Ethernet1/2", + "no ip address", + "interface Ethernet1/3", + "no ip address", + "interface Ethernet1/4", + "ip address 10.40.40.40/24", + "ip address 10.41.41.41/24 secondary", + "evpn multisite dci-tracking", + "interface Ethernet1/5", + "no ip address", + "no evpn multisite fabric-tracking", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + def test_12(self): + # Use case specific + existing = dedent( + """\ + interface mgmt0 + ip address 10.0.0.254/24 + interface Vlan99 + no shutdown + ip address 192.168.1.1/24 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict( + name="Vlan99", + ipv4=[ + {"address": "192.168.1.1/24", "tag": 500} + ], # adding a tag + ) + ], + state="replaced", + ) + cmds = ["interface Vlan99", "ip address 192.168.1.1/24 tag 500"] + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=cmds) + + def test_12_gathered(self): + # check for parsing correct contexts + existing = dedent( + """\ + interface nve1 + no shutdown + source-interface loopback1 + interface Ethernet1/1 + description + ip address 192.168.1.1/24 + interface Ethernet1/2 + ip address 192.168.2.1/24 + interface loopback1 + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict(state="gathered") + gathered_facts = [ + {"name": "nve1"}, + {"name": "Ethernet1/1", "ipv4": [{"address": "192.168.1.1/24"}]}, + {"name": "Ethernet1/2", "ipv4": [{"address": "192.168.2.1/24"}]}, + {"name": "loopback1"}, + ] + set_module_args(playbook, ignore_provider_arg) + result = self.execute_module(changed=False) + self.assertEqual(result["gathered"], gathered_facts) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lacp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lacp_interfaces.py new file mode 100644 index 00000000..b9f69948 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lacp_interfaces.py @@ -0,0 +1,113 @@ +# (c) 2020 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + PropertyMock, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_lacp_interfaces +from .nxos_module import TestNxosModule, set_module_args + +ignore_provider_arg = True + + +class TestNxosLacpInterfacesModule(TestNxosModule): + + module = nxos_lacp_interfaces + + def setUp(self): + super(TestNxosLacpInterfacesModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.l3_interfaces.l3_interfaces.L3_interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + def tearDown(self): + super(TestNxosLacpInterfacesModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + + # --------------------------- + # Lacp_interfaces Test Cases + # --------------------------- + + SHOW_CMD = "show running-config | section ^interface" + + def test_lacp_mode_parse(self): + # basic tests + existing = dedent( + """\ + interface port-channel1 + switchport + switchport mode trunk + switchport trunk native vlan 5 + switchport trunk allowed vlan 10 + no lacp graceful-convergence + """ + ) + self.get_resource_connection_facts.return_value = { + self.SHOW_CMD: existing + } + playbook = dict( + config=[ + dict( + name="port-channel1", + convergence={"graceful": False}, + suspend_individual=True, + mode="delay", + ) + ] + ) + # Expected result commands for each 'state' + merged = [ + "interface port-channel1", + "lacp mode delay", + "lacp suspend-individual", + ] + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lldp_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lldp_interfaces.py new file mode 100644 index 00000000..843a766c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_lldp_interfaces.py @@ -0,0 +1,272 @@ +# +# (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_collections.cisco.nxos.plugins.modules import nxos_lldp_interfaces +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + MagicMock, +) +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + set_module_args, +) +from .nxos_module import TestNxosModule, load_fixture + + +class TestNxosLldpInterfacesModule(TestNxosModule): + + module = nxos_lldp_interfaces + + def setUp(self): + super(TestNxosLldpInterfacesModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.lldp_interfaces.lldp_interfaces.Lldp_interfaces.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_execute_show_command = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.lldp_interfaces.lldp_interfaces.Lldp_interfacesFacts.get_device_data" + ) + self.execute_show_command = self.mock_execute_show_command.start() + + def tearDown(self): + super(TestNxosLldpInterfacesModule, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_execute_show_command.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + output = """interface Ethernet1/1 + lldp receive + no lldp transmit + interface Ethernet1/2 + no lldp receive + lldp tlv-set vlan 12""" + return output + + self.execute_show_command.side_effect = load_from_file + + def test_nxos_lldp_interfaces_merged(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/3", + receive=False, + tlv_set=dict(vlan=123), + ) + ], + state="merged", + ) + ) + commands = [ + "interface Ethernet1/3", + "no lldp receive", + "lldp tlv-set vlan 123", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_lldp_interfaces_merged_idempotent(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + receive=False, + tlv_set=dict(vlan=12), + ), + dict(name="Ethernet1/1", receive=True, transmit=False), + ], + state="merged", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_lldp_interfaces_replaced(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + receive=True, + transmit=False, + tlv_set=dict(management_address="192.0.2.123"), + ) + ], + state="replaced", + ) + ) + commands = [ + "interface Ethernet1/2", + "lldp receive", + "no lldp transmit", + "no lldp tlv-set vlan 12", + "lldp tlv-set management-address 192.0.2.123", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_lldp_interfaces_replaced_idempotent(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + receive=False, + tlv_set=dict(vlan=12), + ), + dict(name="Ethernet1/1", receive=True, transmit=False), + ], + state="replaced", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_lldp_interfaces_overridden(self): + set_module_args( + dict( + config=[ + dict(name="Ethernet1/4", receive=True, transmit=False) + ], + state="overridden", + ) + ) + commands = [ + "interface Ethernet1/4", + "lldp receive", + "no lldp transmit", + "interface Ethernet1/1", + "lldp receive", + "lldp transmit", + "interface Ethernet1/2", + "lldp receive", + "no lldp tlv-set vlan 12", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_lldp_interfaces_overridden_idempotent(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + receive=False, + tlv_set=dict(vlan=12), + ), + dict(name="Ethernet1/1", receive=True, transmit=False), + ], + state="overridden", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_lldp_interfaces_deleted_intf(self): + set_module_args( + dict(config=[dict(name="Ethernet1/2")], state="deleted") + ) + commands = [ + "interface Ethernet1/2", + "lldp receive", + "no lldp tlv-set vlan 12", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_lldp_interfaces_deleted_all(self): + set_module_args(dict(state="deleted")) + commands = [ + "interface Ethernet1/2", + "lldp receive", + "no lldp tlv-set vlan 12", + "interface Ethernet1/1", + "lldp receive", + "lldp transmit", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_lldp_interfaces_rendered(self): + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/2", + receive=False, + tlv_set=dict(vlan=12), + ), + dict(name="Ethernet1/1", receive=True, transmit=False), + ], + state="rendered", + ) + ) + commands = [ + "interface Ethernet1/1", + "lldp receive", + "no lldp transmit", + "interface Ethernet1/2", + "no lldp receive", + "lldp tlv-set vlan 12", + ] + result = self.execute_module(changed=False) + self.assertEqual( + sorted(result["rendered"]), sorted(commands), result["rendered"] + ) + + def test_nxos_lldp_interfaces_parsed(self): + set_module_args( + dict( + running_config="""interface Ethernet1/1 + lldp receive + no lldp transmit + interface Ethernet1/2 + no lldp receive + lldp tlv-set vlan 12""", + state="parsed", + ) + ) + result = self.execute_module(changed=False) + compare_list = [ + {"name": "Ethernet1/1", "receive": True, "transmit": False}, + {"name": "Ethernet1/2", "receive": False, "tlv_set": {"vlan": 12}}, + ] + self.assertEqual(result["parsed"], compare_list, result["parsed"]) + + def test_nxos_lldp_interfaces_gathered(self): + set_module_args(dict(state="gathered")) + result = self.execute_module(changed=False) + compare_list = [ + {"name": "Ethernet1/1", "receive": True, "transmit": False}, + {"name": "Ethernet1/2", "receive": False, "tlv_set": {"vlan": 12}}, + ] + self.assertEqual(result["gathered"], compare_list, result["gathered"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_nxapi.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_nxapi.py new file mode 100644 index 00000000..ccdd0683 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_nxapi.py @@ -0,0 +1,100 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_nxapi +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosNxapiModule(TestNxosModule): + + module = nxos_nxapi + + def setUp(self): + super(TestNxosNxapiModule, self).setUp() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_nxapi.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_nxapi.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_capabilities = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_nxapi.get_capabilities" + ) + self.get_capabilities = self.mock_get_capabilities.start() + self.get_capabilities.return_value = { + "device_info": { + "network_os_platform": "N7K-C7018", + "network_os_version": "8.3(1)", + }, + "network_api": "cliconf", + } + + def tearDown(self): + super(TestNxosNxapiModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + self.mock_get_capabilities.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + module_name = self.module.__name__.rsplit(".", 1)[1] + + output = list() + for command in commands: + filename = str(command).split(" | ")[0].replace(" ", "_") + output.append(load_fixture(module_name, filename, device)) + return output + + self.run_commands.side_effect = load_from_file + self.load_config.return_value = None + + def test_nxos_nxapi_no_change(self): + set_module_args( + dict( + http=True, + https=False, + http_port=80, + https_port=443, + sandbox=False, + ) + ) + self.execute_module_devices(changed=False, commands=[]) + + def test_nxos_nxapi_disable(self): + set_module_args(dict(state="absent")) + self.execute_module_devices( + changed=True, commands=["no feature nxapi"] + ) + + def test_nxos_nxapi_no_http(self): + set_module_args(dict(https=True, http=False, https_port=8443)) + self.execute_module_devices( + changed=True, commands=["no nxapi http", "nxapi https port 8443"] + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf.py new file mode 100644 index 00000000..5cc4102a --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf.py @@ -0,0 +1,62 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_ospf +from .nxos_module import TestNxosModule, set_module_args + + +class TestNxosOspfModule(TestNxosModule): + + module = nxos_ospf + + def setUp(self): + super(TestNxosOspfModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_ospf.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_ospf.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosOspfModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_nxos_ospf_present(self): + set_module_args(dict(ospf=1, state="present")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["router ospf 1"]) + + def test_nxos_ospf_absent(self): + set_module_args(dict(ospf=1, state="absent")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_interfaces.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_interfaces.py new file mode 100644 index 00000000..305b46bb --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_interfaces.py @@ -0,0 +1,1572 @@ +# (c) 2020 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_ospf_interfaces + +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosOspfInterfacesModule(TestNxosModule): + + # Testing strategy + # ------------------ + # (a) The unit tests cover `merged` and `replaced` for every attribute. + # Since `overridden` is essentially `replaced` but at a larger + # scale, these indirectly cover `overridden` as well. + # (b) For linear attributes replaced is not valid and hence, those tests + # delete the attributes from the config subsection. + + module = nxos_ospf_interfaces + + def setUp(self): + super(TestNxosOspfInterfacesModule, self).setUp() + + self.mock_get_resource_connection = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module.get_resource_connection" + ) + self.get_resource_connection = ( + self.mock_get_resource_connection.start() + ) + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.ospf_interfaces.ospf_interfaces.Ospf_interfacesFacts.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosOspfInterfacesModule, self).tearDown() + self.get_resource_connection.stop() + self.get_config.stop() + + def test_nxos_ospf_interfaces_af_process_area_merged(self): + # test merged for config->af->processes->area + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip router ospf 100 area 1.1.1.1 secondaries none + interface Ethernet1/2 + no switchport + ip router ospf 101 area 2.2.2.2 + ipv6 router ospfv3 100 area 4.4.4.4 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + processes=[ + dict( + process_id="102", + area=dict(area_id="1.1.1.2"), + ) + ], + ), + dict( + afi="ipv6", + processes=[ + dict( + process_id="200", + area=dict(area_id="2.2.2.8"), + ) + ], + ), + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + processes=[ + dict( + process_id="101", + area=dict(area_id="2.2.2.3"), + ) + ], + ) + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict( + afi="ipv6", + processes=[ + dict( + process_id="300", + area=dict( + area_id="2.2.2.3", + secondaries="False", + ), + ) + ], + ) + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip router ospf 102 area 1.1.1.2", + "ipv6 router ospfv3 200 area 2.2.2.8", + "interface Ethernet1/2", + "ip router ospf 101 area 2.2.2.3", + "interface Ethernet1/3", + "ipv6 router ospfv3 300 area 2.2.2.3 secondaries none", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_af_process_area_replaced(self): + # test replaced for config->af->processes->area + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip router ospf 100 area 1.1.1.1 secondaries none + interface Ethernet1/2 + no switchport + ip router ospf 101 area 2.2.2.2 + ipv6 router ospfv3 100 area 4.4.4.4 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv6", + processes=[ + dict( + process_id="200", + area=dict(area_id="2.2.2.8"), + ) + ], + ) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + processes=[ + dict( + process_id="102", + area=dict(area_id="1.1.1.2"), + ) + ], + ) + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip router ospf 100 area 1.1.1.1 secondaries none", + "ipv6 router ospfv3 200 area 2.2.2.8", + "interface Ethernet1/2", + "no ip router ospf 101 area 2.2.2.2", + "ip router ospf 102 area 1.1.1.2", + "no ipv6 router ospfv3 100 area 4.4.4.4", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_af_process_multiareas_merged(self): + # test merged for config->af->processes->multiareas + # processes->multiareas is only valid for IPv6 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ipv6 router ospfv3 100 multi-area 1.1.1.1 + ipv6 router ospfv3 100 multi-area 1.1.1.2 + ipv6 router ospfv3 102 multi-area 2.2.2.1 + ipv6 router ospfv3 102 multi-area 2.2.2.2 + interface Ethernet1/2 + no switchport + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv6", + processes=[ + dict( + process_id="100", + multi_areas=["1.1.1.3"], + ), + dict( + process_id="200", + multi_areas=["3.3.3.3", "4.4.4.4"], + ), + ], + ) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv6", + processes=[ + dict( + process_id="109", + multi_areas=["5.5.5.5", "5.5.5.6"], + ) + ], + ) + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ipv6 router ospfv3 100 multi-area 1.1.1.3", + "ipv6 router ospfv3 200 multi-area 3.3.3.3", + "ipv6 router ospfv3 200 multi-area 4.4.4.4", + "interface Ethernet1/2", + "ipv6 router ospfv3 109 multi-area 5.5.5.5", + "ipv6 router ospfv3 109 multi-area 5.5.5.6", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_af_process_multiareas_replaced(self): + # test replaced for config->af->processes->multiareas + # processes->multiareas is only valid for IPv6 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ipv6 router ospfv3 100 multi-area 1.1.1.1 + ipv6 router ospfv3 100 multi-area 1.1.1.2 + ipv6 router ospfv3 102 multi-area 2.2.2.1 + ipv6 router ospfv3 102 multi-area 2.2.2.2 + interface Ethernet1/2 + no switchport + ipv6 router ospfv3 109 multi-area 5.5.5.5 + ipv6 router ospfv3 200 multi-area 4.2.2.1 + ipv6 router ospfv3 200 multi-area 4.2.2.2 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv6", + processes=[ + dict( + process_id="100", + multi_areas=["1.1.1.3"], + ), + dict( + process_id="102", + multi_areas=["2.2.2.2"], + ), + dict( + process_id="200", + multi_areas=["3.3.3.3", "4.4.4.4"], + ), + ], + ) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv6", + processes=[ + dict( + process_id="109", + multi_areas=["5.5.5.6"], + ) + ], + ) + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ipv6 router ospfv3 100 multi-area 1.1.1.1", + "no ipv6 router ospfv3 100 multi-area 1.1.1.2", + "no ipv6 router ospfv3 102 multi-area 2.2.2.1", + "ipv6 router ospfv3 100 multi-area 1.1.1.3", + "ipv6 router ospfv3 200 multi-area 3.3.3.3", + "ipv6 router ospfv3 200 multi-area 4.4.4.4", + "interface Ethernet1/2", + "no ipv6 router ospfv3 109 multi-area 5.5.5.5", + "no ipv6 router ospfv3 200 multi-area 4.2.2.1", + "no ipv6 router ospfv3 200 multi-area 4.2.2.2", + "ipv6 router ospfv3 109 multi-area 5.5.5.6", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_af_multiareas_merged(self): + # test merged for config->af->multiareas + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip router ospf multi-area 1.1.1.1 + ip router ospf multi-area 1.1.1.2 + ipv6 router ospfv3 multi-area 2.2.2.1 + ipv6 router ospfv3 multi-area 2.2.2.2 + interface Ethernet1/2 + no switchport + ipv6 router ospfv3 multi-area 5.5.5.5 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", multi_areas=["1.1.1.1", "1.1.1.3"] + ), + dict( + afi="ipv6", multi_areas=["3.3.3.3", "4.4.4.4"] + ), + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict(afi="ipv6", multi_areas=["5.5.5.6"]) + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip router ospf multi-area 1.1.1.3", + "ipv6 router ospfv3 multi-area 3.3.3.3", + "ipv6 router ospfv3 multi-area 4.4.4.4", + "interface Ethernet1/2", + "ipv6 router ospfv3 multi-area 5.5.5.6", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_af_multiareas_replaced(self): + # test replaced for config->af->multiareas + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip router ospf multi-area 1.1.1.1 + ip router ospf multi-area 1.1.1.2 + ipv6 router ospfv3 multi-area 2.2.2.1 + ipv6 router ospfv3 multi-area 2.2.2.2 + interface Ethernet1/2 + no switchport + ipv6 router ospfv3 multi-area 5.5.5.5 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", multi_areas=["1.1.1.1", "1.1.1.3"] + ), + dict( + afi="ipv6", multi_areas=["3.3.3.3", "4.4.4.4"] + ), + ], + ), + dict(name="Ethernet1/2"), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip router ospf multi-area 1.1.1.2", + "no ipv6 router ospfv3 multi-area 2.2.2.1", + "no ipv6 router ospfv3 multi-area 2.2.2.2", + "ip router ospf multi-area 1.1.1.3", + "ipv6 router ospfv3 multi-area 3.3.3.3", + "ipv6 router ospfv3 multi-area 4.4.4.4", + "interface Ethernet1/2", + "no ipv6 router ospfv3 multi-area 5.5.5.5", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_authentication_merged(self): + # test merged for config->af->authentication + # only valid for IPv4 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf authentication + interface Ethernet1/2 + no switchport + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + ip ospf authentication + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + authentication=dict( + key_chain="test-1", message_digest=True + ), + ) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", authentication=dict(null_auth=True) + ) + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict(afi="ipv4", authentication=dict(enable=True)) + ], + ), + dict( + name="Ethernet1/4", + address_family=[ + dict(afi="ipv4", authentication=dict(enable=False)) + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf authentication message-digest", + "ip ospf authentication key-chain test-1", + "interface Ethernet1/2", + "ip ospf authentication null", + "interface Ethernet1/3", + "ip ospf authentication", + "interface Ethernet1/4", + "no ip ospf authentication", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_authentication_replaced(self): + # test merged for config->af->authentication + # only valid for IPv4 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf authentication message-digest + ip ospf authentication key-chain test-1 + interface Ethernet1/2 + no switchport + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict(name="Ethernet1/1"), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", authentication=dict(null_auth=True) + ) + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict(afi="ipv4", authentication=dict(enable=True)) + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf authentication message-digest", + "no ip ospf authentication key-chain test-1", + "interface Ethernet1/2", + "ip ospf authentication null", + "interface Ethernet1/3", + "ip ospf authentication", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_authentication_key_merged(self): + # test merged for config->af->authentication_key + # only valid for IPv4 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf authentication-key 3 abc01d272be25d29 + interface Ethernet1/2 + no switchport + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + authentication_key=dict( + encryption=3, key="77840f9d4d882176" + ), + ) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + authentication_key=dict( + encryption=0, key="password" + ), + ) + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict( + afi="ipv4", + authentication_key=dict( + encryption=7, key="712090404011C031628" + ), + ) + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf authentication-key 3 77840f9d4d882176", + "interface Ethernet1/2", + "ip ospf authentication-key 0 password", + "interface Ethernet1/3", + "ip ospf authentication-key 7 712090404011C031628", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_authentication_key_replaced(self): + # test replaced for config->af->authentication_key + # only valid for IPv4 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf authentication-key 3 abc01d272be25d29 + interface Ethernet1/2 + no switchport + interface Ethernet1/3 + no switchport + ip ospf authentication-key 7 712090404011C031628 + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict(name="Ethernet1/1"), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + authentication_key=dict( + encryption=0, key="password" + ), + ) + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf authentication-key 3 abc01d272be25d29", + "interface Ethernet1/2", + "ip ospf authentication-key 0 password", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_message_digest_key_merged(self): + # test merged for config->af->message_digest_key + # only valid for IPv4 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d + interface Ethernet1/2 + no switchport + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + message_digest_key=dict( + key_id=101, + encryption=3, + key="abc01d272be25d29", + ), + ) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + message_digest_key=dict( + key_id=1, encryption=0, key="password" + ), + ) + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict( + afi="ipv4", + message_digest_key=dict( + key_id=2, + encryption=7, + key="712090404011C031628", + ), + ) + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf message-digest-key 101 md5 3 abc01d272be25d29", + "interface Ethernet1/2", + "ip ospf message-digest-key 1 md5 0 password", + "interface Ethernet1/3", + "ip ospf message-digest-key 2 md5 7 712090404011C031628", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_message_digest_key_replaced(self): + # test replaced for config->af->message_digest_key + # only valid for IPv4 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d + interface Ethernet1/2 + no switchport + ip ospf message-digest-key 1 md5 0 password + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict(name="Ethernet1/1"), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + message_digest_key=dict( + key_id=1, encryption=0, key="password1" + ), + ) + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d", + "interface Ethernet1/2", + "ip ospf message-digest-key 1 md5 0 password1", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_1_merged(self): + # test merged for config->af->cost, dead_interval, hello_interval + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf cost 100 + ospfv3 cost 120 + ip ospf dead-interval 2400 + ospfv3 dead-interval 1200 + ip ospf hello-interval 9000 + interface Ethernet1/2 + no switchport + ip ospf cost 110 + ip ospf dead-interval 3000 + ospfv3 hello-interval 8000 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict(afi="ipv4", cost=200), + dict( + afi="ipv6", + dead_interval=5000, + hello_interval=9000, + ), + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + cost=120, + dead_interval=3400, + hello_interval=8100, + ), + dict(afi="ipv6", cost=180, dead_interval=3000), + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf cost 200", + "ospfv3 dead-interval 5000", + "ospfv3 hello-interval 9000", + "interface Ethernet1/2", + "ip ospf cost 120", + "ip ospf dead-interval 3400", + "ospfv3 cost 180", + "ospfv3 dead-interval 3000", + "ip ospf hello-interval 8100", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_1_replaced(self): + # test replaced for config->af->cost, dead_interval, hello_interval + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf cost 100 + ospfv3 cost 120 + ip ospf dead-interval 2400 + ospfv3 dead-interval 1200 + ip ospf hello-interval 9000 + interface Ethernet1/2 + no switchport + ip ospf cost 110 + ip ospf dead-interval 3000 + ospfv3 hello-interval 8000 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict(afi="ipv4", cost=200, hello_interval=9000) + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict(afi="ipv6", cost=180, dead_interval=3000) + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf cost 200", + "no ospfv3 cost 120", + "no ip ospf dead-interval 2400", + "no ospfv3 dead-interval 1200", + "interface Ethernet1/2", + "no ip ospf cost 110", + "no ip ospf dead-interval 3000", + "no ospfv3 hello-interval 8000", + "ospfv3 cost 180", + "ospfv3 dead-interval 3000", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_2_merged(self): + # test merged for config->af->instance, mtu_ignore, network + # `instance` is only valid for IPv6 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ospfv3 instance 200 + interface Ethernet1/2 + no switchport + ip ospf mtu-ignore + ip ospf network broadcast + ospfv3 network point-to-point + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + mtu_ignore=True, + network="point-to-point", + ), + dict(afi="ipv6", instance=210), + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict(afi="ipv4", mtu_ignore=False), + dict(afi="ipv6", network="broadcast"), + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf mtu-ignore", + "ip ospf network point-to-point", + "ospfv3 instance 210", + "interface Ethernet1/2", + "no ip ospf mtu-ignore", + "ospfv3 network broadcast", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_2_replaced(self): + # test replaced for config->af->instance, mtu_ignore, network + # `instance` is only valid for IPv6 + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf mtu-ignore + ospfv3 instance 200 + interface Ethernet1/2 + no switchport + ip ospf mtu-ignore + ip ospf network broadcast + ospfv3 network point-to-point + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + mtu_ignore=False, + network="point-to-point", + ), + dict(afi="ipv6", instance=200), + ], + ), + dict(name="Ethernet1/2"), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf mtu-ignore", + "ip ospf network point-to-point", + "interface Ethernet1/2", + "no ip ospf mtu-ignore", + "no ip ospf network broadcast", + "no ospfv3 network point-to-point", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_3_merged(self): + # test merged for config->af->passive_interface, priority, retransmit_interval + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf passive-interface + ip ospf priority 120 + ospfv3 retransmit-interval 4800 + interface Ethernet1/2 + no switchport + ip ospf retransmit-interval 5000 + ospfv3 passive-interface + ospfv3 priority 140 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", + passive_interface=False, + retransmit_interval=8000, + ), + dict(afi="ipv6", passive_interface=True), + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict( + afi="ipv4", + passive_interface=True, + retransmit_interval=5000, + ) + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict( + afi="ipv4", + passive_interface=True, + priority=200, + ), + dict(afi="ipv6", retransmit_interval=5100), + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf passive-interface", + "ospfv3 passive-interface", + "ip ospf retransmit-interval 8000", + "interface Ethernet1/2", + "ip ospf passive-interface", + "interface Ethernet1/3", + "ip ospf passive-interface", + "ip ospf priority 200", + "ospfv3 retransmit-interval 5100", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_3_replaced(self): + # test merged for config->af->passive_interface, priority, retransmit_interval + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf passive-interface + ip ospf priority 120 + ospfv3 retransmit-interval 4800 + interface Ethernet1/2 + no switchport + ip ospf retransmit-interval 5000 + ospfv3 passive-interface + ospfv3 priority 140 + interface Ethernet1/3 + no switchport + ip ospf passive-interface + ip ospf priority 200 + ospfv3 retransmit-interval 5100 + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict(name="Ethernet1/1"), + dict( + name="Ethernet1/2", + address_family=[ + dict(afi="ipv4", retransmit_interval=5100), + dict( + afi="ipv6", + passive_interface=True, + priority=140, + ), + ], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf passive-interface", + "no ip ospf priority 120", + "no ospfv3 retransmit-interval 4800", + "interface Ethernet1/2", + "ip ospf retransmit-interval 5100", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_4_merged(self): + # test merged for config->af->shutdown, transmit_delay + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf shutdown + ospfv3 transmit-delay 200 + interface Ethernet1/2 + no switchport + ip ospf transmit-delay 210 + ospfv3 shutdown + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", shutdown=False, transmit_delay=210 + ), + dict(afi="ipv6", shutdown=True), + ], + ), + dict( + name="Ethernet1/2", + address_family=[ + dict(afi="ipv4", shutdown=True), + dict(afi="ipv6", transmit_delay=300), + ], + ), + dict( + name="Ethernet1/3", + address_family=[ + dict( + afi="ipv4", shutdown=True, transmit_delay=430 + ), + dict( + afi="ipv6", shutdown=True, transmit_delay=120 + ), + ], + ), + ], + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf shutdown", + "ip ospf transmit-delay 210", + "ospfv3 shutdown", + "interface Ethernet1/2", + "ip ospf shutdown", + "ospfv3 transmit-delay 300", + "interface Ethernet1/3", + "ip ospf shutdown", + "ip ospf transmit-delay 430", + "ospfv3 shutdown", + "ospfv3 transmit-delay 120", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_linear_args_4_replaced(self): + # test replaced for config->af->shutdown, transmit_delay + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf shutdown + ospfv3 transmit-delay 200 + interface Ethernet1/2 + no switchport + ip ospf transmit-delay 210 + ospfv3 shutdown + interface Ethernet1/3 + no switchport + ip ospf shutdown + ip ospf transmit-delay 430 + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict(name="Ethernet1/1"), + dict( + name="Ethernet1/2", + address_family=[dict(afi="ipv6", transmit_delay=300)], + ), + ], + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf shutdown", + "no ospfv3 transmit-delay 200", + "interface Ethernet1/2", + "no ospfv3 shutdown", + "no ip ospf transmit-delay 210", + "ospfv3 transmit-delay 300", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_parsed(self): + # test parsed + set_module_args( + dict( + running_config=dedent( + """\ + interface Ethernet1/1 + no switchport + ip router ospf 102 area 1.1.1.2 secondaries none + ipv6 router ospfv3 200 area 2.2.2.8 + interface Ethernet1/2 + no switchport + ipv6 router ospfv3 210 multi-area 3.3.3.3 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ), + state="parsed", + ), + ignore_provider_arg, + ) + parsed = [ + { + "name": "Ethernet1/1", + "address_family": [ + { + "afi": "ipv4", + "processes": [ + { + "process_id": "102", + "area": { + "area_id": "1.1.1.2", + "secondaries": False, + }, + } + ], + }, + { + "afi": "ipv6", + "processes": [ + { + "process_id": "200", + "area": {"area_id": "2.2.2.8"}, + } + ], + }, + ], + }, + { + "name": "Ethernet1/2", + "address_family": [ + { + "afi": "ipv6", + "processes": [ + {"process_id": "210", "multi_areas": ["3.3.3.3"]} + ], + } + ], + }, + {"name": "Ethernet1/3"}, + {"name": "Ethernet1/4"}, + ] + result = self.execute_module(changed=False) + self.assertEqual(result["parsed"], parsed) + + def test_nxos_ospf_interfaces_gathered(self): + # test gathered + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip router ospf 102 area 1.1.1.2 secondaries none + ipv6 router ospfv3 200 area 2.2.2.8 + interface Ethernet1/2 + no switchport + ipv6 router ospfv3 210 multi-area 3.3.3.3 + interface Ethernet1/3 + no switchport + interface Ethernet1/4 + no switchport + """ + ) + set_module_args(dict(state="gathered"), ignore_provider_arg) + gathered = [ + { + "name": "Ethernet1/1", + "address_family": [ + { + "afi": "ipv4", + "processes": [ + { + "process_id": "102", + "area": { + "area_id": "1.1.1.2", + "secondaries": False, + }, + } + ], + }, + { + "afi": "ipv6", + "processes": [ + { + "process_id": "200", + "area": {"area_id": "2.2.2.8"}, + } + ], + }, + ], + }, + { + "name": "Ethernet1/2", + "address_family": [ + { + "afi": "ipv6", + "processes": [ + {"process_id": "210", "multi_areas": ["3.3.3.3"]} + ], + } + ], + }, + {"name": "Ethernet1/3"}, + {"name": "Ethernet1/4"}, + ] + result = self.execute_module(changed=False) + self.assertEqual(result["gathered"], gathered) + + def test_nxos_ospf_interfaces_sanity(self): + # test gathered + self.get_config.return_value = dedent( + """ + """ + ) + set_module_args(dict(state="gathered"), ignore_provider_arg) + gathered = [] + result = self.execute_module(changed=False) + self.assertEqual(result["gathered"], gathered) + + def test_nxos_ospf_interfaces_overridden(self): + # test overriden + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf shutdown + ospfv3 transmit-delay 200 + interface Ethernet1/2 + no switchport + ip ospf transmit-delay 210 + ospfv3 shutdown + interface Ethernet1/3 + no switchport + ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict( + config=[ + dict( + name="Ethernet1/1", + address_family=[ + dict( + afi="ipv4", shutdown=False, transmit_delay=300 + ), + dict(afi="ipv6", shutdown=True), + ], + ) + ], + state="overridden", + ), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "ip ospf transmit-delay 300", + "no ip ospf shutdown", + "no ospfv3 transmit-delay 200", + "ospfv3 shutdown", + "interface Ethernet1/2", + "no ip ospf transmit-delay 210", + "no ospfv3 shutdown", + "interface Ethernet1/3", + "no ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_deleted(self): + # test deleted + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf shutdown + ospfv3 transmit-delay 200 + interface Ethernet1/2 + no switchport + ip ospf transmit-delay 210 + ospfv3 shutdown + interface Ethernet1/3 + no switchport + ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d + interface Ethernet1/4 + no switchport + """ + ) + set_module_args( + dict(config=[dict(name="Ethernet1/1")], state="deleted"), + ignore_provider_arg, + ) + commands = [ + "interface Ethernet1/1", + "no ip ospf shutdown", + "no ospfv3 transmit-delay 200", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospf_interfaces_deleted_all(self): + # test deleted + self.get_config.return_value = dedent( + """\ + interface Ethernet1/1 + no switchport + ip ospf shutdown + ospfv3 transmit-delay 200 + interface Ethernet1/2 + no switchport + ip ospf transmit-delay 210 + ospfv3 shutdown + interface Ethernet1/3 + no switchport + ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d + interface Ethernet1/4 + no switchport + """ + ) + set_module_args(dict(state="deleted"), ignore_provider_arg) + commands = [ + "interface Ethernet1/1", + "no ip ospf shutdown", + "no ospfv3 transmit-delay 200", + "interface Ethernet1/2", + "no ip ospf transmit-delay 210", + "no ospfv3 shutdown", + "interface Ethernet1/3", + "no ip ospf message-digest-key 101 md5 3 109a86e9d947cc5d", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_vrf.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_vrf.py new file mode 100644 index 00000000..75445330 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospf_vrf.py @@ -0,0 +1,116 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_ospf_vrf +from .nxos_module import TestNxosModule, set_module_args + + +class TestNxosOspfVrfModule(TestNxosModule): + + module = nxos_ospf_vrf + + def setUp(self): + super(TestNxosOspfVrfModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_ospf_vrf.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_ospf_vrf.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosOspfVrfModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_nxos_ospf_vrf_present(self): + set_module_args( + dict( + ospf=1, + vrf="test", + timer_throttle_spf_start=50, + timer_throttle_spf_hold=1000, + timer_throttle_spf_max=2000, + timer_throttle_lsa_start=60, + timer_throttle_lsa_hold=1100, + timer_throttle_lsa_max=3000, + bfd="enable", + state="present", + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + sorted(result["commands"]), + sorted( + [ + "router ospf 1", + "vrf test", + "timers throttle lsa 60 1100 3000", + "timers throttle spf 50 1000 2000", + "bfd", + ] + ), + ) + + def test_nxos_ospf_vrf_absent(self): + set_module_args(dict(ospf=1, vrf="test", state="absent")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_bfd_1(self): + self.get_config.return_value = "router ospf 1\n bfd\nrouter ospf 2" + # enable -> disable + set_module_args(dict(ospf=1, bfd="disable")) + self.execute_module(changed=True, commands=["router ospf 1", "no bfd"]) + + # disable -> enable + set_module_args(dict(ospf=2, bfd="enable")) + self.execute_module(changed=True, commands=["router ospf 2", "bfd"]) + + def test_bfd_2(self): + # enable idempotence + self.get_config.return_value = "router ospf 1\n bfd\nrouter ospf 2" + set_module_args(dict(ospf=1, bfd="enable")) + self.execute_module(changed=False) + + # disable idempotence + set_module_args(dict(ospf=2, bfd="disable")) + self.execute_module(changed=False) + + def test_bfd_3(self): + # absent tests + self.get_config.return_value = "router ospf 1\n bfd\nrouter ospf 2" + set_module_args(dict(ospf=1, state="absent")) + self.execute_module(changed=True, commands=["router ospf 1", "no bfd"]) + + # absent w/bfd disable + set_module_args(dict(ospf=2, state="absent")) + self.execute_module(changed=False) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv2.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv2.py new file mode 100644 index 00000000..0dc66489 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv2.py @@ -0,0 +1,588 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_ospfv2 + +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosOspfv2Module(TestNxosModule): + + module = nxos_ospfv2 + + def setUp(self): + super(TestNxosOspfv2Module, self).setUp() + + self.mock_get_resource_connection = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module.get_resource_connection" + ) + self.get_resource_connection = ( + self.mock_get_resource_connection.start() + ) + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.ospfv2.ospfv2.Ospfv2Facts.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosOspfv2Module, self).tearDown() + self.get_resource_connection.stop() + self.get_config.stop() + + def test_nxos_ospfv2_merged(self): + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="203.0.113.20", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap_1", + ), + dict( + protocol="direct", + route_map="direct-connect", + ), + ], + log_adjacency_changes=dict(detail=True), + ), + dict( + process_id="200", + router_id="198.51.100.1", + areas=[ + dict( + area_id="0.0.0.100", + filter_list=[ + dict( + route_map="rmap_1", direction="in" + ), + dict( + route_map="rmap_2", direction="out" + ), + ], + ranges=[ + dict(prefix="198.51.100.64/27"), + dict(prefix="198.51.100.96/27"), + ], + ), + dict( + area_id="0.0.0.101", + authentication=dict(message_digest=True), + ), + ], + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospf 100", + "router-id 203.0.113.20", + "redistribute eigrp 100 route-map rmap_1", + "redistribute direct route-map direct-connect", + "log-adjacency-changes detail", + "router ospf 200", + "router-id 198.51.100.1", + "area 0.0.0.100 filter-list route-map rmap_1 in", + "area 0.0.0.100 filter-list route-map rmap_2 out", + "area 0.0.0.100 range 198.51.100.64/27", + "area 0.0.0.100 range 198.51.100.96/27", + "area 0.0.0.101 authentication message-digest", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv2_merged_idempotent(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="203.0.113.20", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap_1", + ), + dict( + protocol="direct", + route_map="direct-connect", + ), + ], + ), + dict( + process_id="200", + router_id="198.51.100.1", + areas=[ + dict( + area_id="0.0.0.100", + filter_list=[ + dict( + route_map="rmap_1", direction="in" + ), + dict( + route_map="rmap_2", direction="out" + ), + ], + ranges=[ + dict(prefix="198.51.100.64/27"), + dict(prefix="198.51.100.96/27"), + ], + ), + dict( + area_id="0.0.0.101", + authentication=dict(message_digest=True), + ), + ], + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_ospfv2_merged_update(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="203.0.113.20", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap_2", + ) + ], + areas=[ + dict( + area_id="0.0.0.101", + stub=dict(no_summary=True), + ) + ], + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + + commands = [ + "router ospf 100", + "redistribute eigrp 100 route-map rmap_2", + "area 0.0.0.101 stub no-summary", + ] + + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv2_replaced(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="203.0.113.20", + areas=[ + dict( + area_id="0.0.0.101", + stub=dict(no_summary=True), + ) + ], + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospf 100", + "no redistribute eigrp 100 route-map rmap_1", + "no redistribute direct route-map direct-connect", + "area 0.0.0.101 stub no-summary", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv2_replaced_idempotent(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="203.0.113.20", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap_1", + ), + dict( + protocol="direct", + route_map="direct-connect", + ), + ], + ), + dict( + process_id="200", + router_id="198.51.100.1", + areas=[ + dict( + area_id="0.0.0.100", + filter_list=[ + dict( + route_map="rmap_1", direction="in" + ), + dict( + route_map="rmap_2", direction="out" + ), + ], + ranges=[ + dict(prefix="198.51.100.64/27"), + dict(prefix="198.51.100.96/27"), + ], + ), + dict( + area_id="0.0.0.101", + authentication=dict(message_digest=True), + ), + ], + ), + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_ospfv2_overridden(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict(process_id="300", router_id="203.0.113.20") + ] + ), + state="overridden", + ), + ignore_provider_arg, + ) + commands = [ + "no router ospf 100", + "no router ospf 200", + "router ospf 300", + "router-id 203.0.113.20", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv2_overridden_idempotent(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="203.0.113.20", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap_1", + ), + dict( + protocol="direct", + route_map="direct-connect", + ), + ], + ), + dict( + process_id="200", + router_id="198.51.100.1", + areas=[ + dict( + area_id="0.0.0.100", + filter_list=[ + dict( + route_map="rmap_1", direction="in" + ), + dict( + route_map="rmap_2", direction="out" + ), + ], + ranges=[ + dict(prefix="198.51.100.64/27"), + dict(prefix="198.51.100.96/27"), + ], + ), + dict( + area_id="0.0.0.101", + authentication=dict(message_digest=True), + ), + ], + ), + ] + ), + state="overridden", + ), + ignore_provider_arg, + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_ospfv2_deleted(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + router ospf 300 + router-id 192.0.168.102 + """ + ) + set_module_args( + dict( + config=dict( + processes=[dict(process_id="100"), dict(process_id="300")] + ), + state="deleted", + ), + ignore_provider_arg, + ) + commands = ["no router ospf 100", "no router ospf 300"] + + result = self.execute_module(changed=True) + self.assertEqual(sorted(result["commands"]), sorted(commands)) + + def test_nxos_ospfv2_deleted_idempotent(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + router ospf 300 + router-id 192.0.168.102 + """ + ) + set_module_args( + dict( + config=dict( + processes=[dict(process_id="400"), dict(process_id="500")] + ), + state="deleted", + ), + ignore_provider_arg, + ) + + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_ospfv2_deleted_all(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + redistribute eigrp 100 route-map rmap_1 + redistribute direct route-map direct-connect + router ospf 200 + router-id 198.51.100.1 + area 0.0.0.100 filter-list route-map rmap_1 in + area 0.0.0.100 filter-list route-map rmap_2 out + area 0.0.0.100 range 198.51.100.64/27 + area 0.0.0.100 range 198.51.100.96/27 + area 0.0.0.101 authentication message-digest + router ospf 300 + router-id 192.0.168.102 + """ + ) + set_module_args(dict(state="deleted"), ignore_provider_arg) + + commands = [ + "no router ospf 100", + "no router ospf 200", + "no router ospf 300", + ] + + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv2_process_id_word(self): + self.get_config.return_value = dedent( + """\ + router ospf 100 + router-id 203.0.113.20 + router ospf TEST-1 + router-id 198.51.100.1 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict(process_id="100", router_id="203.0.113.20"), + dict(process_id="TEST-1", router_id="198.51.100.1"), + dict(process_id="TEST-2", router_id="198.52.200.1"), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + + commands = ["router ospf TEST-2", "router-id 198.52.200.1"] + + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv3.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv3.py new file mode 100644 index 00000000..13f02582 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_ospfv3.py @@ -0,0 +1,2260 @@ +# (c) 2020 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_ospfv3 + +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosOspfv3Module(TestNxosModule): + + # Testing strategy + # ------------------ + # (a) The unit tests cover `merged` and `replaced` for every attribute. + # Since `overridden` is essentially `replaced` but at a larger + # scale, these indirectly cover `overridden` as well. + # (b) For linear attributes replaced is not valid and hence, those tests + # delete the attributes from the config subsection. + # (c) The argspec for VRFs is same as the top-level spec and the config logic + # is re-used. Hence, those attributes are not explictly covered. However, a + # combination of VRF + top-level spec + AF is tested. + + module = nxos_ospfv3 + + def setUp(self): + super(TestNxosOspfv3Module, self).setUp() + + self.mock_get_resource_connection = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.resource_module.get_resource_connection" + ) + self.get_resource_connection = ( + self.mock_get_resource_connection.start() + ) + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.ospfv3.ospfv3.Ospfv3Facts.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosOspfv3Module, self).tearDown() + self.get_resource_connection.stop() + self.get_config.stop() + + def test_nxos_ospfv3_af_areas_filter_list_merged(self): + # test merged for config->processes->af->areas->filter_list + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + area 1.1.1.1 default-cost 100 + area 1.1.1.1 filter-list route-map test-11 in + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + areas=[ + dict( + area_id="1.1.1.1", + filter_list=[ + dict( + route_map="test-1", + direction="in", + ), + dict( + route_map="test-2", + direction="out", + ), + ], + ), + dict( + area_id="1.1.1.2", + filter_list=[ + dict( + route_map="test-3", + direction="in", + ), + dict( + route_map="test-4", + direction="out", + ), + ], + ), + ], + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "area 1.1.1.1 filter-list route-map test-1 in", + "area 1.1.1.1 filter-list route-map test-2 out", + "area 1.1.1.2 filter-list route-map test-3 in", + "area 1.1.1.2 filter-list route-map test-4 out", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_areas_filter_list_replaced(self): + # test replaced for config->processes->af->areas->filter_list + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + area 1.1.1.4 filter-list route-map test-11 out + area 1.1.1.4 filter-list route-map test-12 in + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + areas=[ + dict( + area_id="1.1.1.1", + filter_list=[ + dict( + route_map="test-1", + direction="in", + ), + dict( + route_map="test-2", + direction="out", + ), + ], + ), + dict( + area_id="1.1.1.2", + filter_list=[ + dict( + route_map="test-3", + direction="in", + ), + dict( + route_map="test-4", + direction="out", + ), + ], + ), + ], + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no area 1.1.1.4 filter-list route-map test-11 out", + "no area 1.1.1.4 filter-list route-map test-12 in", + "area 1.1.1.1 filter-list route-map test-1 in", + "area 1.1.1.1 filter-list route-map test-2 out", + "area 1.1.1.2 filter-list route-map test-3 in", + "area 1.1.1.2 filter-list route-map test-4 out", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_areas_ranges_merged(self): + # test merged for config->processes->af->areas->rang + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + area 1.1.1.1 range 2001:db2::/32 + area 1.1.1.1 range 2001:db3::/32 cost 10 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + areas=[ + dict( + area_id="1.1.1.1", + ranges=[ + dict( + prefix="2001:db3::/32", + cost="20", + ) + ], + ), + dict( + area_id="1.1.1.2", + ranges=[ + dict( + prefix="2001:db4::/32", cost=11 + ), + dict( + prefix="2001:db5::/32", + not_advertise=True, + ), + dict( + prefix="2001:db7::/32", + not_advertise=True, + cost=18, + ), + ], + ), + ], + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "area 1.1.1.1 range 2001:db3::/32 cost 20", + "area 1.1.1.2 range 2001:db4::/32 cost 11", + "area 1.1.1.2 range 2001:db5::/32 not-advertise", + "area 1.1.1.2 range 2001:db7::/32 not-advertise cost 18", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_areas_ranges_replaced(self): + # test replaced for config->processes->af->areas->ranges + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + area 1.1.1.1 range 2001:db2::/32 + area 1.1.1.1 range 2001:db3::/32 cost 10 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + areas=[ + dict( + area_id="1.1.1.2", + ranges=[ + dict( + prefix="2001:db4::/32", cost=11 + ), + dict( + prefix="2001:db5::/32", + not_advertise=True, + ), + dict( + prefix="2001:db7::/32", + not_advertise=True, + cost=18, + ), + ], + ) + ], + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no area 1.1.1.1 range 2001:db2::/32", + "no area 1.1.1.1 range 2001:db3::/32", + "area 1.1.1.2 range 2001:db4::/32 cost 11", + "area 1.1.1.2 range 2001:db5::/32 not-advertise", + "area 1.1.1.2 range 2001:db7::/32 not-advertise cost 18", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_areas_default_cost_merged(self): + # test merged for config->processes->af->areas->default_cost + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + area 1.1.1.1 default-cost 10 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + areas=[ + dict(area_id="1.1.1.1", default_cost=12), + dict(area_id="1.1.1.2", default_cost=200), + ], + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "area 1.1.1.1 default-cost 12", + "area 1.1.1.2 default-cost 200", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_areas_default_cost_replaced(self): + # test merged for config->processes->af->areas->default_cost + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + area 1.1.1.1 default-cost 10 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + areas=[ + dict(area_id="1.1.1.2", default_cost=200) + ], + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no area 1.1.1.1 default-cost 10", + "area 1.1.1.2 default-cost 200", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_default_information_merged(self): + # test merged for config->processes->af->default_information + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + default-information originate + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + default_information=dict( + originate=dict( + always=True, route_map="test-2" + ) + ), + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "default-information originate always route-map test-2", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_default_information_merged_2(self): + # test merged for config->processes->af->default_information->set + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + default-information originate always route-map test-2 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + default_information=dict( + originate=dict(set=False) + ), + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no default-information originate", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_default_information_replaced(self): + # test replaced for config->processes->af->default_information + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + default-information originate always test-2 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + default_information=dict( + originate=dict(set=True) + ), + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "default-information originate", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_distance_merged(self): + # test merged for config->processes->af->distance + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + distance 20 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", safi="unicast", distance=35 + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "distance 35", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_distance_replaced(self): + # test replaced for config->processes->af->distance + # `distance` is a linear attribute so replaced test + # can only be removal of this attribute + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + distance 20 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict(afi="ipv6", safi="unicast"), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no distance 20", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_maximum_paths_merged(self): + # test merged for config->processes->af->maximum_paths + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + maximum-paths 18 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", safi="unicast", maximum_paths=27 + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "maximum-paths 27", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_maximum_paths_replaced(self): + # test replaced for config->processes->af->maximum_paths + # `maximum_paths` is a linear attribute so replaced test + # can only be removal of this attribute + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + maximum-paths 18 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict(afi="ipv6", safi="unicast"), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no maximum-paths 18", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_redistribute_merged(self): + # test merged for config->processes->af->redistribute + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + redistribute eigrp 100 route-map test-17 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="test-1", + ), + dict( + protocol="eigrp", + id="101", + route_map="test-2", + ), + dict( + protocol="bgp", + id="65563", + route_map="test-3", + ), + dict( + protocol="static", route_map="test-4" + ), + ], + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "redistribute eigrp 100 route-map test-1", + "redistribute eigrp 101 route-map test-2", + "redistribute bgp 65563 route-map test-3", + "redistribute static route-map test-4", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_redistribute_replaced(self): + # test replaced for config->processes->af->redistribute + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + redistribute eigrp 100 route-map test-1 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + redistribute=[ + dict( + protocol="eigrp", + id="101", + route_map="test-2", + ), + dict( + protocol="bgp", + id="65563", + route_map="test-3", + ), + dict( + protocol="static", route_map="test-4" + ), + ], + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no redistribute eigrp 100 route-map test-1", + "redistribute eigrp 101 route-map test-2", + "redistribute bgp 65563 route-map test-3", + "redistribute static route-map test-4", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_summary_address_merged(self): + # test merged for config->processes->af->summary_address + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + summary-address 2001:db2::/32 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + summary_address=[ + dict(prefix="2001:db2::/32", tag=19), + dict( + prefix="2001:db3::/32", + not_advertise=True, + ), + dict(prefix="2001:db4::/32"), + ], + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "summary-address 2001:db2::/32 tag 19", + "summary-address 2001:db3::/32 not-advertise", + "summary-address 2001:db4::/32", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_summary_address_replaced(self): + # test replaced for config->processes->af->summary_address + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + summary-address 2001:db2::/32 tag 19 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + summary_address=[ + dict( + prefix="2001:db3::/32", + not_advertise=True, + ) + ], + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no summary-address 2001:db2::/32 tag 19", + "summary-address 2001:db3::/32 not-advertise", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_table_map_merged(self): + # test merged for config->processes->af->table_map + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + summary-address 2001:db2::/32 tag 19 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + table_map=dict(name="test-1", filter=True), + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "table-map test-1 filter", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_table_map_replaced(self): + # test replaced for config->processes->af->table_map + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map test-1 filter + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + table_map=dict(name="test-2"), + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "table-map test-2", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_timers_merged(self): + # test merged for config->processes->af->timers + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + timers throttle spf 1000 20 2800 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + timers=dict( + throttle=dict( + spf=dict( + initial_spf_delay=1100, + max_wait_time=2805, + ) + ) + ), + ), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "timers throttle spf 1100 20 2805", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_af_timers_replaced(self): + # test replaced for config->processes->af->timers + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + timers throttle spf 1000 20 2800 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict(afi="ipv6", safi="unicast"), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no timers throttle spf 1000 20 2800", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_areas_nssa_merged(self): + # test merged for config->processes->areas->nssa + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + area 1.1.1.1 nssa no-redistribution default-information-originate + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + areas=[ + dict( + area_id="1.1.1.1", + nssa=dict(no_summary=True), + ), + dict(area_id="1.1.1.2", nssa=dict(set=True)), + dict( + area_id="1.1.1.3", + nssa=dict( + default_information_originate=True, + no_summary=True, + no_redistribution=True, + route_map="test-1", + translate=dict( + type7=dict( + always=True, supress_fa=True + ) + ), + ), + ), + ], + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "area 1.1.1.1 nssa no-summary no-redistribution default-information-originate", + "area 1.1.1.2 nssa", + "area 1.1.1.3 nssa translate type7 always supress-fa", + "area 1.1.1.3 nssa no-summary no-redistribution default-information-originate route-map test-1", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_areas_nssa_merged_2(self): + # test merged for config->processes->areas->nssa->set + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + area 1.1.1.1 nssa no-summary + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + areas=[ + dict(area_id="1.1.1.1", nssa=dict(set=False)) + ], + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = ["router ospfv3 100", "no area 1.1.1.1 nssa"] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_areas_nssa_replaced(self): + # test replaced for config->processes->areas->nssa + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + area 1.1.1.1 nssa no-summary no-redistribution default-information-originate + area 1.1.1.3 nssa translate type7 always supress-fa + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + areas=[ + dict( + area_id="1.1.1.3", + nssa=dict( + default_information_originate=True, + no_summary=True, + no_redistribution=True, + route_map="test-1", + ), + ) + ], + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "no area 1.1.1.1 nssa", + "no area 1.1.1.3 nssa translate type7 always supress-fa", + "area 1.1.1.3 nssa no-summary no-redistribution default-information-originate route-map test-1", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_areas_stub_merged(self): + # test merged for config->processes->areas->stub + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + area 1.1.1.3 stub + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + areas=[ + dict( + area_id="1.1.1.3", + stub=dict(no_summary=True), + ) + ], + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = ["router ospfv3 100", "area 1.1.1.3 stub no-summary"] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_areas_stub_merged_2(self): + # test merged for config->processes->areas->stub->set + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + area 1.1.1.3 stub + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + areas=[ + dict(area_id="1.1.1.3", stub=dict(set=False)), + dict( + area_id="1.1.1.4", + stub=dict(no_summary=True), + ), + ], + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "no area 1.1.1.3 stub", + "area 1.1.1.4 stub no-summary", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_areas_stub_replaced(self): + # test replaced for config->processes->areas->stub + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + area 1.1.1.3 stub no-summary + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict(process_id="100", areas=[dict(area_id="1.1.1.3")]) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = ["router ospfv3 100", "no area 1.1.1.3 stub"] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_autocost_flush_route_isolate_merged(self): + # test merged for config->processes->autocost,flush_routes, isolate + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + auto-cost reference-bandwidth 300 Mbps + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + auto_cost=dict( + reference_bandwidth=100, unit="Gbps" + ), + flush_routes=True, + isolate=True, + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "auto-cost reference-bandwidth 100 Gbps", + "flush-routes", + "isolate", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_autocost_flush_route_isolate_replaced(self): + # test merged for config->processes->autocost,flush_routes, isolate + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + auto-cost reference-bandwidth 300 Mbps + flush-routes + """ + ) + set_module_args( + dict( + config=dict(processes=[dict(process_id="100", isolate=True)]), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "no auto-cost reference-bandwidth 300 Mbps", + "no flush-routes", + "isolate", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_log_adjacency_changes_name_lookup_passive_interface_merged( + self + ): + # test merged for config->processes->log_adjacency_changes, name_lookup, passive_interface + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + log-adjacency-changes + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + log_adjacency_changes=dict(detail=True), + name_lookup=True, + passive_interface=dict(default=True), + ), + dict( + process_id="102", + log_adjacency_changes=dict(log=True), + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "log-adjacency-changes detail", + "name-lookup", + "passive-interface default", + "router ospfv3 102", + "log-adjacency-changes", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_log_adjacency_changes_name_lookup_passive_interface_replaced( + self + ): + # test replaced for config->processes->log_adjacency_changes, name_lookup, passive_interface + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + log-adjacency-changes detail + name-lookup + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + passive_interface=dict(default=True), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "no log-adjacency-changes detail", + "no name-lookup", + "passive-interface default", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_max_lsa_router_id_merged(self): + # test merged for config->processes->max_lsa, router_id + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + router-id 192.168.1.100 + max-lsa 4200 85 ignore-count 10 reset-time 120 + router ospfv3 102 + max-lsa 4200 85 ignore-time 120 ignore-count 12 reset-time 300 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + router_id="192.168.1.100", + max_lsa=dict( + max_non_self_generated_lsa=4200, + threshold=85, + ignore_count=100, + reset_time=138, + ), + ), + dict( + process_id="102", + router_id="192.168.2.102", + max_lsa=dict( + max_non_self_generated_lsa=4200, + threshold=85, + ignore_time=200, + ignore_count=20, + reset_time=120, + ), + ), + dict( + process_id="103", + max_lsa=dict( + max_non_self_generated_lsa=4200, + warning_only=True, + ), + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "max-lsa 4200 85 ignore-count 100 reset-time 138", + "router ospfv3 102", + "router-id 192.168.2.102", + "max-lsa 4200 85 ignore-time 200 ignore-count 20 reset-time 120", + "router ospfv3 103", + "max-lsa 4200 warning-only", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_max_lsa_router_id_replaced(self): + # test replaced for config->processes->max_lsa, router_id + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + router-id 192.168.1.100 + max-lsa 4200 85 ignore-count 10 reset-time 120 + router ospfv3 102 + max-lsa 4200 85 ignore-time 120 ignore-count 12 reset-time 300 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + max_lsa=dict( + max_non_self_generated_lsa=4200, + threshold=85, + warning_only=True, + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "no router-id 192.168.1.100", + "max-lsa 4200 85 warning-only", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_graceful_restart_merged(self): + # test merged for config->processes->graceful_restart + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + no graceful-restart + router ospfv3 102 + no graceful-restart planned-only + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + graceful_restart=dict( + grace_period=50, helper_disable=True + ), + ), + dict( + process_id="102", + graceful_restart=dict(planned_only=True), + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "graceful-restart grace-period 50", + "graceful-restart helper-disable", + "router ospfv3 102", + "graceful-restart planned-only", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_graceful_restart_replaced(self): + # test replaced for config->processes->graceful_restart + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + graceful-restart grace-period 50 + graceful-restart helper-disable + router ospfv3 102 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + graceful_restart=dict(grace_period=10), + ), + dict( + process_id="102", + graceful_restart=dict(helper_disable=True), + ), + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "graceful-restart grace-period 10", + "no graceful-restart helper-disable", + "router ospfv3 102", + "graceful-restart helper-disable", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_max_metric_merged(self): + # test merged for config->processes->max_metric + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + max-metric router-lsa external-lsa 1900 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + max_metric=dict( + router_lsa=dict( + external_lsa=dict(max_metric_value=2000), + stub_prefix_lsa=True, + on_startup=dict(set=True), + ) + ), + ), + dict( + process_id="102", + max_metric=dict( + router_lsa=dict( + inter_area_prefix_lsa=dict( + max_metric_value=1800 + ) + ) + ), + ), + dict( + process_id="103", + max_metric=dict( + router_lsa=dict( + on_startup=dict( + wait_period=1200, + wait_for_bgp_asn=65563, + ), + inter_area_prefix_lsa=dict(set=True), + ) + ), + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "max-metric router-lsa external-lsa 2000 stub-prefix-lsa on-startup", + "router ospfv3 102", + "max-metric router-lsa inter-area-prefix-lsa 1800", + "router ospfv3 103", + "max-metric router-lsa on-startup 1200 wait-for bgp 65563 inter-area-prefix-lsa", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_max_metric_merged_2(self): + # test merged for config->processes->max_metric->set + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + max-metric router-lsa inter-area-prefix-lsa 1800 + router ospfv3 103 + max-metric router-lsa on-startup 1200 wait-for bgp 65563 inter-area-prefix-lsa + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + max_metric=dict(router_lsa=dict(set=False)), + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = ["router ospfv3 100", "no max-metric router-lsa"] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_max_metric_replaced(self): + # test replaced for config->processes->max_metric + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + router ospfv3 102 + max-metric router-lsa inter-area-prefix-lsa 1800 + router ospfv3 103 + max-metric router-lsa on-startup 1200 wait-for bgp 65563 inter-area-prefix-lsa + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + max_metric=dict( + router_lsa=dict( + external_lsa=dict(max_metric_value=2000), + stub_prefix_lsa=True, + on_startup=dict(set=True), + ) + ), + ), + dict(process_id="102"), + dict(process_id="103"), + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "max-metric router-lsa external-lsa 2000 stub-prefix-lsa on-startup", + "router ospfv3 102", + "no max-metric router-lsa", + "router ospfv3 103", + "no max-metric router-lsa", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_timers_shutdown_merged(self): + # test merged for config->processes->timers, shutdown + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + timers lsa-group-pacing 190 + shutdown + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + timers=dict( + lsa_arrival=1200, + lsa_group_pacing=210, + throttle=dict( + lsa=dict( + start_interval=100, + hold_interval=70, + max_interval=1500, + ) + ), + ), + shutdown=False, + ) + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "timers lsa-arrival 1200", + "timers lsa-group-pacing 210", + "timers throttle lsa 100 70 1500", + "no shutdown", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_timers_shutdown_replaced(self): + # test replaced for config->processes->timers, shutdown + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + timers lsa-arrival 800 + timers lsa-group-pacing 210 + timers throttle lsa 100 70 1500 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + timers=dict(lsa_arrival=1200), + shutdown=True, + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "timers lsa-arrival 1200", + "no timers lsa-group-pacing 210", + "no timers throttle lsa 100 70 1500", + "shutdown", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_vrf_merged(self): + # test merged for config->processes->vrf + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + vrf blue + area 1.1.1.1 nssa + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + vrfs=[ + dict( + vrf="blue", + areas=[ + dict( + area_id="1.1.1.1", + nssa=dict(no_summary=True), + ), + dict( + area_id="1.1.1.2", + nssa=dict(set=True), + ), + ], + ), + dict( + vrf="red", + areas=[ + dict( + area_id="1.1.1.3", + nssa=dict( + default_information_originate=True, + no_summary=True, + no_redistribution=True, + route_map="test-1", + translate=dict( + type7=dict( + always=True, + supress_fa=True, + ) + ), + ), + ) + ], + ), + ], + ), + dict( + process_id="103", + vrfs=[ + dict( + vrf="red", + max_metric=dict( + router_lsa=dict( + on_startup=dict( + wait_period=1200, + wait_for_bgp_asn=65563, + ), + inter_area_prefix_lsa=dict( + set=True + ), + ) + ), + ) + ], + ), + dict( + process_id="104", + vrfs=[ + dict( + vrf="red", + timers=dict( + lsa_arrival=1200, + lsa_group_pacing=210, + throttle=dict( + lsa=dict( + start_interval=100, + hold_interval=70, + max_interval=1500, + ) + ), + ), + shutdown=True, + ) + ], + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "vrf blue", + "area 1.1.1.1 nssa no-summary", + "area 1.1.1.2 nssa", + "vrf red", + "area 1.1.1.3 nssa translate type7 always supress-fa", + "area 1.1.1.3 nssa no-summary no-redistribution default-information-originate route-map test-1", + "router ospfv3 103", + "vrf red", + "max-metric router-lsa on-startup 1200 wait-for bgp 65563 inter-area-prefix-lsa", + "router ospfv3 104", + "vrf red", + "timers lsa-arrival 1200", + "timers lsa-group-pacing 210", + "timers throttle lsa 100 70 1500", + "shutdown", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_vrf_replaced(self): + # test replaced for config->processes->vrf + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + vrf blue + area 1.1.1.1 nssa no-summary + area 1.1.1.2 nssa + vrf red + area 1.1.1.3 nssa translate type7 always supress-fa + area 1.1.1.3 nssa no-summary no-redistribution default-information-originate route-map test-1 + router ospfv3 103 + vrf red + max-metric router-lsa on-startup 1200 wait-for bgp 65563 inter-area-prefix-lsa + router ospfv3 104 + vrf red + timers lsa-arrival 1200 + timers lsa-group-pacing 210 + timers throttle lsa 100 70 1500 + shutdown + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + vrfs=[ + dict( + vrf="blue", + areas=[ + dict( + area_id="1.1.1.1", + nssa=dict( + no_summary=True, + translate=dict( + type7=dict( + always=True, + supress_fa=True, + ) + ), + ), + ) + ], + ) + ], + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "vrf blue", + "area 1.1.1.1 nssa no-summary", + "no area 1.1.1.2 nssa", + "area 1.1.1.1 nssa translate type7 always supress-fa", + "no vrf red", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_top_spec_af_vrf_merged(self): + # test merged for every nested level + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap1", + ) + ], + ), + vrfs=[ + dict(vrf="blue", router_id="10.0.0.2"), + dict( + vrf="red", + areas=[ + dict( + area_id="1.1.1.1", + nssa=dict(set=True), + ) + ], + ), + ], + ), + dict( + process_id="103", + vrfs=[dict(vrf="red", shutdown=True)], + ), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "redistribute eigrp 100 route-map rmap1", + "vrf blue", + "router-id 10.0.0.2", + "vrf red", + "area 1.1.1.1 nssa", + "router ospfv3 103", + "vrf red", + "shutdown", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_top_spec_af_vrf_replaced(self): + # test replaced for every nested level + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + redistribute eigrp 100 route-map rmap1 + vrf blue + router-id 10.0.0.2 + vrf red + area 1.1.1.1 nssa + router ospfv3 103 + vrf red + shutdown + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap1", + ) + ], + ), + ) + ] + ), + state="replaced", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no table-map map1 filter", + "no vrf blue", + "no vrf red", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_top_spec_af_vrf_overridden(self): + # test overridden for every nested level + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + redistribute eigrp 100 route-map rmap1 + vrf blue + router-id 10.0.0.2 + vrf red + area 1.1.1.1 nssa + router ospfv3 103 + vrf red + shutdown + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict( + process_id="100", + address_family=dict( + afi="ipv6", + safi="unicast", + redistribute=[ + dict( + protocol="eigrp", + id="100", + route_map="rmap2", + ) + ], + ), + ) + ] + ), + state="overridden", + ), + ignore_provider_arg, + ) + commands = [ + "router ospfv3 100", + "address-family ipv6 unicast", + "no table-map map1 filter", + "redistribute eigrp 100 route-map rmap2", + "no vrf blue", + "no vrf red", + "no router ospfv3 103", + ] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_top_spec_af_vrf_deleted(self): + # test overridden for every nested level + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + redistribute eigrp 100 route-map rmap1 + vrf blue + router-id 10.0.0.2 + vrf red + area 1.1.1.1 nssa + router ospfv3 103 + vrf red + shutdown + """ + ) + set_module_args( + dict( + config=dict(processes=[dict(process_id="100")]), + state="deleted", + ), + ignore_provider_arg, + ) + commands = ["no router ospfv3 100"] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_top_spec_af_vrf_deleted_all(self): + # test overridden for every nested level + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + redistribute eigrp 100 route-map rmap1 + vrf blue + router-id 10.0.0.2 + vrf red + area 1.1.1.1 nssa + router ospfv3 103 + vrf red + shutdown + """ + ) + set_module_args(dict(state="deleted"), ignore_provider_arg) + commands = ["no router ospfv3 100", "no router ospfv3 103"] + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) + + def test_nxos_ospfv3_parsed(self): + # test parsed + set_module_args( + dict( + running_config=dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + redistribute eigrp 100 route-map rmap1 + vrf blue + router-id 10.0.0.2 + vrf red + area 1.1.1.1 nssa + router ospfv3 103 + vrf red + shutdown + """ + ), + state="parsed", + ), + ignore_provider_arg, + ) + parsed = { + "processes": [ + { + "process_id": "100", + "address_family": { + "table_map": {"name": "map1", "filter": True}, + "redistribute": [ + { + "protocol": "eigrp", + "id": "100", + "route_map": "rmap1", + } + ], + "afi": "ipv6", + "safi": "unicast", + }, + "vrfs": [ + {"vrf": "blue", "router_id": "10.0.0.2"}, + { + "vrf": "red", + "areas": [ + {"area_id": "1.1.1.1", "nssa": {"set": True}} + ], + }, + ], + }, + { + "process_id": "103", + "vrfs": [{"vrf": "red", "shutdown": True}], + }, + ] + } + result = self.execute_module(changed=False) + self.assertEqual(set(result["parsed"]), set(parsed)) + + def test_nxos_ospfv3_gathered(self): + # test gathered + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + address-family ipv6 unicast + table-map map1 filter + redistribute eigrp 100 route-map rmap1 + vrf blue + router-id 10.0.0.2 + vrf red + area 1.1.1.1 nssa + router ospfv3 103 + vrf red + shutdown + """ + ) + set_module_args(dict(state="gathered"), ignore_provider_arg) + gathered = { + "processes": [ + { + "process_id": "100", + "address_family": { + "table_map": {"name": "map1", "filter": True}, + "redistribute": [ + { + "protocol": "eigrp", + "id": "100", + "route_map": "rmap1", + } + ], + "afi": "ipv6", + "safi": "unicast", + }, + "vrfs": [ + {"vrf": "blue", "router_id": "10.0.0.2"}, + { + "vrf": "red", + "areas": [ + {"area_id": "1.1.1.1", "nssa": {"set": True}} + ], + }, + ], + }, + { + "process_id": "103", + "vrfs": [{"vrf": "red", "shutdown": True}], + }, + ] + } + result = self.execute_module(changed=False) + self.assertEqual(set(result["gathered"]), set(gathered)) + + def test_nxos_ospfv3_process_id_word(self): + self.get_config.return_value = dedent( + """\ + router ospfv3 100 + router-id 203.0.113.20 + router ospfv3 TEST-1 + router-id 198.51.100.1 + """ + ) + set_module_args( + dict( + config=dict( + processes=[ + dict(process_id="100", router_id="203.0.113.20"), + dict(process_id="TEST-1", router_id="198.51.100.1"), + dict(process_id="TEST-2", router_id="198.52.200.1"), + ] + ), + state="merged", + ), + ignore_provider_arg, + ) + + commands = ["router ospfv3 TEST-2", "router-id 198.52.200.1"] + + result = self.execute_module(changed=True) + self.assertEqual(set(result["commands"]), set(commands)) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_overlay_global.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_overlay_global.py new file mode 100644 index 00000000..4ec52692 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_overlay_global.py @@ -0,0 +1,62 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_overlay_global +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosOverlayGlobalModule(TestNxosModule): + + module = nxos_overlay_global + + def setUp(self): + super(TestNxosOverlayGlobalModule, self).setUp() + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_overlay_global.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_overlay_global.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosOverlayGlobalModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "", "nxos_overlay_global_config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_overlay_global_up(self): + set_module_args(dict(anycast_gateway_mac="a.a.a")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["fabric forwarding anycast-gateway-mac 000A.000A.000A"], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim.py new file mode 100644 index 00000000..66fe0162 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim.py @@ -0,0 +1,107 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_pim +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosPimModule(TestNxosModule): + + module = nxos_pim + + def setUp(self): + super(TestNxosPimModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosPimModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_nxos_pim_1(self): + # Add/ Modify + self.get_config.return_value = load_fixture("nxos_pim", "config.cfg") + set_module_args(dict(ssm_range="233.0.0.0/8")) + self.execute_module( + changed=True, commands=["ip pim ssm range 233.0.0.0/8"] + ) + + def test_nxos_pim_2(self): + # Remove existing values + self.get_config.return_value = load_fixture("nxos_pim", "config.cfg") + set_module_args(dict(bfd="disable", ssm_range="none")) + self.execute_module( + changed=True, commands=["no ip pim bfd", "ip pim ssm range none"] + ) + + def test_nxos_pim_3(self): + # bfd None (disable)-> enable + self.get_config.return_value = None + set_module_args(dict(bfd="enable")) + self.execute_module(changed=True, commands=["ip pim bfd"]) + + # bfd None (disable) -> disable + set_module_args(dict(bfd="disable")) + self.execute_module(changed=False) + + # ssm None to 'default' + set_module_args(dict(ssm_range="default")) + self.execute_module(changed=False) + + def test_nxos_pim_4(self): + # SSM 'none' + self.get_config.return_value = load_fixture("nxos_pim", "config.cfg") + set_module_args(dict(ssm_range="none")) + self.execute_module(changed=True, commands=["ip pim ssm range none"]) + + def test_nxos_pim_5(self): + # SSM 'default' + self.get_config.return_value = load_fixture("nxos_pim", "config.cfg") + set_module_args(dict(ssm_range="default")) + self.execute_module( + changed=True, commands=["no ip pim ssm range none"] + ) + + # SSM 'default' idempotence + self.get_config.return_value = None + set_module_args(dict(ssm_range="default")) + self.execute_module(changed=False) + + def test_nxos_pim_6(self): + # Idempotence + self.get_config.return_value = load_fixture("nxos_pim", "config.cfg") + set_module_args(dict(bfd="enable", ssm_range="127.0.0.0/31")) + self.execute_module(changed=False, commands=[]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_interface.py new file mode 100644 index 00000000..d03f0471 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_interface.py @@ -0,0 +1,265 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_pim_interface +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosIPInterfaceModule(TestNxosModule): + + module = nxos_pim_interface + + def setUp(self): + super(TestNxosIPInterfaceModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestNxosIPInterfaceModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=""): + module_name = self.module.__name__.rsplit(".", 1)[1] + + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for command in commands: + if type(command) == dict: + command = command["command"] + filename = ( + str(command) + .split(" | ")[0] + .replace(" ", "_") + .replace("/", "_") + ) + output.append(load_fixture(module_name, filename)) + return output + + self.get_config.return_value = load_fixture(module_name, "config.cfg") + self.load_config.return_value = None + self.run_commands.side_effect = load_from_file + + def test_nxos_pim_interface_present(self): + set_module_args( + dict( + interface="eth2/1", + dr_prio=10, + hello_interval=40, + sparse=True, + border=False, + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface eth2/1", + "ip pim dr-priority 10", + "ip pim hello-interval 40000", + "ip pim sparse-mode", + ], + ) + + def test_nxos_pim_interface_jp(self): + set_module_args( + dict( + interface="eth2/1", + jp_policy_in="JPIN", + jp_policy_out="JPOUT", + jp_type_in="routemap", + jp_type_out="routemap", + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface eth2/1", + "ip pim jp-policy JPOUT out", + "ip pim jp-policy JPIN in", + ], + ) + + def test_nxos_pim_interface_default(self): + set_module_args(dict(interface="eth2/1", state="default")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_pim_interface_ip_absent(self): + set_module_args(dict(interface="eth2/1", state="absent")) + self.execute_module(changed=False, commands=[]) + + +class TestNxosPimInterfaceBfdModule(TestNxosModule): + + module = nxos_pim_interface + + def setUp(self): + super(TestNxosPimInterfaceBfdModule, self).setUp() + + self.mock_get_interface_mode = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.get_interface_mode" + ) + self.get_interface_mode = self.mock_get_interface_mode.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_interface.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestNxosPimInterfaceBfdModule, self).tearDown() + self.mock_get_interface_mode.stop() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=""): + self.load_config.return_value = None + + def test_bfd_1(self): + # default (None) -> enable + self.get_config.return_value = None + set_module_args(dict(interface="eth2/1", bfd="enable")) + self.execute_module( + changed=True, commands=["interface eth2/1", "ip pim bfd-instance"] + ) + + # default (None) -> disable + set_module_args(dict(interface="eth2/1", bfd="disable")) + self.execute_module( + changed=True, + commands=["interface eth2/1", "ip pim bfd-instance disable"], + ) + + # default (None) -> default (None) (idempotence) + set_module_args(dict(interface="eth2/1", bfd="default")) + self.execute_module(changed=False) + + # default (None) -> interface state 'default' + set_module_args(dict(interface="Ethernet9/3", state="default")) + self.execute_module(changed=False) + + # default (None) -> interface state 'absent' + set_module_args(dict(interface="Ethernet9/3", state="absent")) + self.execute_module(changed=False) + + def test_bfd_2(self): + # From disable + self.get_config.return_value = """ + interface Ethernet9/2 + ip pim bfd-instance disable + """ + # disable -> enable + set_module_args(dict(interface="Ethernet9/2", bfd="enable")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/2", "ip pim bfd-instance"], + ) + + # disable -> disable (idempotence) + set_module_args(dict(interface="Ethernet9/2", bfd="disable")) + self.execute_module(changed=False) + + # disable -> default (None) + set_module_args(dict(interface="Ethernet9/2", bfd="default")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/2", "no ip pim bfd-instance"], + ) + # disable -> interface state 'default' + set_module_args(dict(interface="Ethernet9/3", state="default")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/3", "no ip pim bfd-instance"], + ) + + # disable -> interface state 'absent' + set_module_args(dict(interface="Ethernet9/3", state="absent")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/3", "no ip pim bfd-instance"], + ) + + def test_bfd_3(self): + # From enable + self.get_config.return_value = """ + interface Ethernet9/2 + ip pim bfd-instance + """ + # enable -> disabled + set_module_args(dict(interface="Ethernet9/3", bfd="disable")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/3", "ip pim bfd-instance disable"], + ) + + # enable -> enable (idempotence) + set_module_args(dict(interface="Ethernet9/3", bfd="enable")) + self.execute_module(changed=False) + + # enable -> default (None) + set_module_args(dict(interface="Ethernet9/3", bfd="default")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/3", "no ip pim bfd-instance"], + ) + + # enable -> interface state 'default' + set_module_args(dict(interface="Ethernet9/3", state="default")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/3", "no ip pim bfd-instance"], + ) + + # enable -> interface state 'absent' + set_module_args(dict(interface="Ethernet9/3", state="absent")) + self.execute_module( + changed=True, + commands=["interface Ethernet9/3", "no ip pim bfd-instance"], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_rp_address.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_rp_address.py new file mode 100644 index 00000000..ebff3a47 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_pim_rp_address.py @@ -0,0 +1,75 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_pim_rp_address +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosPimRpAddressModule(TestNxosModule): + + module = nxos_pim_rp_address + + def setUp(self): + super(TestNxosPimRpAddressModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_rp_address.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_pim_rp_address.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosPimRpAddressModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_pim_rp_address", "config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_pim_rp_address(self): + set_module_args(dict(rp_address="5.6.7.8")) + self.execute_module( + changed=True, commands=["ip pim rp-address 5.6.7.8"] + ) + + def test_nxos_pim_rp_address_no_change(self): + set_module_args(dict(rp_address="1.2.3.4")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_pim_rp_address_absent(self): + set_module_args(dict(rp_address="1.2.3.4", state="absent")) + self.execute_module( + changed=True, commands=["no ip pim rp-address 1.2.3.4"] + ) + + def test_nxos_pim_rp_address_absent_no_change(self): + set_module_args(dict(rp_address="5.6.7.8", state="absent")) + self.execute_module(changed=False, commands=[]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_route.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_route.py new file mode 100644 index 00000000..55cf040d --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_route.py @@ -0,0 +1,126 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_static_route +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosStaticRouteModule(TestNxosModule): + + module = nxos_static_route + + def setUp(self): + super(TestNxosStaticRouteModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_static_route.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_static_route.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosStaticRouteModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "", "nxos_static_route.cfg" + ) + self.load_config.return_value = None + + def test_nxos_static_route_present(self): + set_module_args(dict(prefix="192.168.20.64/24", next_hop="192.0.2.3")) + self.execute_module( + changed=True, commands=["ip route 192.168.20.0/24 192.0.2.3"] + ) + + def test_nxos_static_route_present_no_defaults(self): + set_module_args( + dict( + prefix="192.168.20.64/24", + next_hop="192.0.2.3", + route_name="testing", + pref=100, + ) + ) + self.execute_module( + changed=True, + commands=["ip route 192.168.20.0/24 192.0.2.3 name testing 100"], + ) + + def test_nxos_static_route_present_vrf(self): + set_module_args( + dict(prefix="192.168.20.64/24", next_hop="192.0.2.3", vrf="test") + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "vrf context test", + "ip route 192.168.20.0/24 192.0.2.3", + ], + ) + + def test_nxos_static_route_no_change(self): + set_module_args(dict(prefix="10.10.30.64/24", next_hop="1.2.4.8")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_static_route_absent(self): + set_module_args( + dict(prefix="10.10.30.12/24", next_hop="1.2.4.8", state="absent") + ) + self.execute_module( + changed=True, commands=["no ip route 10.10.30.0/24 1.2.4.8"] + ) + + def test_nxos_static_route_absent_no_change(self): + set_module_args( + dict( + prefix="192.168.20.6/24", next_hop="192.0.2.3", state="absent" + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_static_route_absent_vrf(self): + set_module_args( + dict( + prefix="10.11.12.13/14", + next_hop="15.16.17.18", + vrf="test", + state="absent", + ) + ) + self.execute_module( + changed=True, + sort=False, + commands=[ + "vrf context test", + "no ip route 10.8.0.0/14 15.16.17.18", + ], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_routes.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_routes.py new file mode 100644 index 00000000..2f632289 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_static_routes.py @@ -0,0 +1,531 @@ +# +# (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_collections.cisco.nxos.plugins.modules import nxos_static_routes +from ansible_collections.cisco.nxos.tests.unit.compat.mock import ( + patch, + MagicMock, +) +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + set_module_args, +) +from .nxos_module import TestNxosModule, load_fixture + + +class TestNxosStaticRoutesModule(TestNxosModule): + + module = nxos_static_routes + + def setUp(self): + super(TestNxosStaticRoutesModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.network.Config.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.static_routes.static_routes.Static_routes.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_execute_show_command = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.static_routes.static_routes.Static_routesFacts.get_device_data" + ) + self.execute_show_command = self.mock_execute_show_command.start() + + def tearDown(self): + super(TestNxosStaticRoutesModule, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_execute_show_command.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + non_vrf_data = [ + "ip route 192.0.2.16/28 192.0.2.24 name initial_route" + ] + vrf_data = [ + "vrf context test\n ip route 192.0.2.96/28 192.0.2.122 vrf dest_vrf\n ipv6 route 2001:db8:12::/32 2001:db8::1001 name ipv6_route 3\n" + ] + + output = non_vrf_data + vrf_data + return output + + self.execute_show_command.side_effect = load_from_file + + def test_nxos_static_routes_merged(self): + set_module_args( + dict( + config=[ + dict( + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.32/28", + next_hops=[ + dict( + forward_router_address="192.0.2.40", + interface="Ethernet1/2", + admin_distance=5, + ) + ], + ) + ], + ) + ] + ) + ], + state="merged", + ) + ) + commands = [ + "vrf context default", + "ip route 192.0.2.32/28 Ethernet1/2 192.0.2.40 5", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_merged_idempotent(self): + set_module_args( + dict( + config=[ + dict( + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.16/28", + next_hops=[ + dict( + forward_router_address="192.0.2.24", + route_name="initial_route", + ) + ], + ) + ], + ) + ] + ) + ], + state="merged", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_static_routes_replaced(self): + set_module_args( + dict( + config=[ + dict( + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.16/28", + next_hops=[ + dict( + forward_router_address="192.0.2.50", + tag=12, + route_name="replaced_route", + ) + ], + ) + ], + ) + ] + ) + ], + state="replaced", + ) + ) + commands = [ + "vrf context default", + "no ip route 192.0.2.16/28 192.0.2.24 name initial_route", + "ip route 192.0.2.16/28 192.0.2.50 name replaced_route tag 12", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_replaced_idempotent(self): + set_module_args( + dict( + config=[ + dict( + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.16/28", + next_hops=[ + dict( + forward_router_address="192.0.2.24", + route_name="initial_route", + ) + ], + ) + ], + ) + ] + ) + ], + state="replaced", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_static_routes_overridden(self): + set_module_args( + dict( + config=[ + dict( + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.112/28", + next_hops=[ + dict( + forward_router_address="192.0.2.68", + route_name="overridden_route", + dest_vrf="end_vrf", + ) + ], + ) + ], + ) + ] + ) + ], + state="overridden", + ) + ) + commands = [ + "vrf context default", + "no ip route 192.0.2.16/28 192.0.2.24 name initial_route", + "ip route 192.0.2.112/28 192.0.2.68 vrf end_vrf name overridden_route", + "vrf context test", + "no ipv6 route 2001:db8:12::/32 2001:db8::1001 name ipv6_route 3", + "no ip route 192.0.2.96/28 192.0.2.122 vrf dest_vrf", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_overridden_idempotent(self): + set_module_args( + dict( + config=[ + dict( + vrf="test", + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.96/28", + next_hops=[ + dict( + forward_router_address="192.0.2.122", + dest_vrf="dest_vrf", + ) + ], + ) + ], + ) + ], + ), + dict( + address_families=[ + dict( + afi="ipv4", + routes=[ + dict( + dest="192.0.2.16/28", + next_hops=[ + dict( + forward_router_address="192.0.2.24", + route_name="initial_route", + ) + ], + ) + ], + ) + ] + ), + ], + state="overridden", + ) + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_static_routes_deletedvrf(self): + set_module_args(dict(config=[dict(vrf="test")], state="deleted")) + commands = [ + "vrf context test", + "no ip route 192.0.2.96/28 192.0.2.122 vrf dest_vrf", + "no ipv6 route 2001:db8:12::/32 2001:db8::1001 name ipv6_route 3", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_deletedafi(self): + set_module_args( + dict( + config=[dict(address_families=[dict(afi="ipv4")])], + state="deleted", + ) + ) + commands = [ + "vrf context default", + "no ip route 192.0.2.16/28 192.0.2.24 name initial_route", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_deleteddest(self): + set_module_args( + dict( + config=[ + dict( + vrf="test", + address_families=[ + dict( + afi="ipv4", routes=[dict(dest="192.0.2.96/28")] + ) + ], + ) + ], + state="deleted", + ) + ) + commands = [ + "vrf context test", + "no ip route 192.0.2.96/28 192.0.2.122 vrf dest_vrf", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_deletedroute(self): + set_module_args( + dict( + config=[ + dict( + vrf="test", + address_families=[ + dict( + afi="ipv6", + routes=[ + dict( + dest="2001:db8:12::/32", + next_hops=[ + dict( + forward_router_address="2001:db8::1001", + route_name="ipv6_route", + admin_distance=3, + ) + ], + ) + ], + ) + ], + ) + ], + state="deleted", + ) + ) + commands = [ + "vrf context test", + "no ipv6 route 2001:db8:12::/32 2001:db8::1001 name ipv6_route 3", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_static_routes_rendered(self): + set_module_args( + dict( + config=[ + dict( + vrf="testvrf", + address_families=[ + dict( + afi="ipv6", + routes=[ + dict( + dest="1200:10::/64", + next_hops=[ + dict( + forward_router_address="2048:ae12::/64", + interface="Eth1/4", + admin_distance=5, + ) + ], + ) + ], + ) + ], + ) + ], + state="rendered", + ) + ) + commands = [ + "vrf context testvrf", + "ipv6 route 1200:10::/64 Ethernet1/4 2048:ae12::/64 5", + ] + result = self.execute_module(changed=False) + self.assertEqual( + sorted(result["rendered"]), sorted(commands), result["rendered"] + ) + + def test_nxos_static_routes_parsed(self): + set_module_args( + dict( + running_config="""ip route 192.0.2.16/28 192.0.2.24 name initial_route + vrf context test + ip route 192.0.2.96/28 192.0.2.122 vrf dest_vrf + ipv6 route 2001:db8:12::/32 2001:db8::1001 name ipv6_route 3""", + state="parsed", + ) + ) + result = self.execute_module(changed=False) + compare_list = [ + { + "vrf": "test", + "address_families": [ + { + "routes": [ + { + "dest": "192.0.2.96/28", + "next_hops": [ + { + "dest_vrf": "dest_vrf", + "forward_router_address": "192.0.2.122", + } + ], + } + ], + "afi": "ipv4", + }, + { + "routes": [ + { + "dest": "2001:db8:12::/32", + "next_hops": [ + { + "route_name": "ipv6_route", + "forward_router_address": "2001:db8::1001", + "admin_distance": 3, + } + ], + } + ], + "afi": "ipv6", + }, + ], + }, + { + "address_families": [ + { + "routes": [ + { + "dest": "192.0.2.16/28", + "next_hops": [ + { + "route_name": "initial_route", + "forward_router_address": "192.0.2.24", + } + ], + } + ], + "afi": "ipv4", + } + ] + }, + ] + self.assertEqual(result["parsed"], compare_list, result["parsed"]) + + def test_nxos_static_routes_gathered(self): + set_module_args(dict(config=[], state="gathered")) + result = self.execute_module(changed=False) + compare_list = [ + { + "vrf": "test", + "address_families": [ + { + "routes": [ + { + "dest": "192.0.2.96/28", + "next_hops": [ + { + "dest_vrf": "dest_vrf", + "forward_router_address": "192.0.2.122", + } + ], + } + ], + "afi": "ipv4", + }, + { + "routes": [ + { + "dest": "2001:db8:12::/32", + "next_hops": [ + { + "route_name": "ipv6_route", + "forward_router_address": "2001:db8::1001", + "admin_distance": 3, + } + ], + } + ], + "afi": "ipv6", + }, + ], + }, + { + "address_families": [ + { + "routes": [ + { + "dest": "192.0.2.16/28", + "next_hops": [ + { + "route_name": "initial_route", + "forward_router_address": "192.0.2.24", + } + ], + } + ], + "afi": "ipv4", + } + ] + }, + ] + self.assertEqual(result["gathered"], compare_list, result["gathered"]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_system.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_system.py new file mode 100644 index 00000000..aa6bc1f3 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_system.py @@ -0,0 +1,208 @@ +# +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_system +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosSystemModule(TestNxosModule): + + module = nxos_system + + def setUp(self): + super(TestNxosSystemModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_system.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_system.load_config" + ) + self.load_config = self.mock_load_config.start() + + def tearDown(self): + super(TestNxosSystemModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_system", "config.cfg", device=device + ) + self.load_config.return_value = None + + def test_nxos_system_hostname_changed(self): + set_module_args(dict(hostname="foo")) + commands = ["hostname foo"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_domain_lookup(self): + set_module_args(dict(domain_lookup=True)) + commands = ["ip domain-lookup"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_missing_vrf(self): + domain_name = dict(name="example.com", vrf="example") + set_module_args(dict(domain_name=domain_name)) + self.execute_module(failed=True) + + def test_nxos_system_domain_name(self): + set_module_args(dict(domain_name=["example.net"])) + commands = [ + "no ip domain-name ansible.com", + "vrf context management", + "no ip domain-name eng.ansible.com", + "exit", + "ip domain-name example.net", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_domain_name_vrf_only(self): + set_module_args( + dict( + domain_name=[ + {"name": "abc.com", "vrf": "test"}, + {"name": "xyz.com", "vrf": "test2"}, + ] + ) + ) + commands = [] + self.execute_module( + changed=False, commands=commands, device="vrf_only" + ) + + def test_nxos_system_domain_name_complex(self): + domain_name = dict(name="example.net", vrf="management") + set_module_args(dict(domain_name=[domain_name])) + commands = [ + "no ip domain-name ansible.com", + "vrf context management", + "no ip domain-name eng.ansible.com", + "exit", + "vrf context management", + "ip domain-name example.net", + "exit", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_domain_search(self): + set_module_args(dict(domain_search=["example.net"])) + commands = [ + "vrf context management", + "no ip domain-list ansible.com", + "exit", + "vrf context management", + "no ip domain-list redhat.com", + "exit", + "no ip domain-list ansible.com", + "no ip domain-list redhat.com", + "ip domain-list example.net", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_domain_search_complex(self): + domain_search = dict(name="example.net", vrf="management") + set_module_args(dict(domain_search=[domain_search])) + commands = [ + "vrf context management", + "no ip domain-list ansible.com", + "exit", + "vrf context management", + "no ip domain-list redhat.com", + "exit", + "no ip domain-list ansible.com", + "no ip domain-list redhat.com", + "vrf context management", + "ip domain-list example.net", + "exit", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_name_servers(self): + set_module_args(dict(name_servers=["1.2.3.4", "8.8.8.8"])) + commands = [ + "no ip name-server 172.26.1.1", + "vrf context management", + "no ip name-server 8.8.8.8", + "exit", + "vrf context management", + "no ip name-server 172.26.1.1", + "exit", + "ip name-server 1.2.3.4", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_name_servers_complex(self): + name_servers = dict(server="1.2.3.4", vrf="management") + set_module_args(dict(name_servers=[name_servers])) + commands = [ + "no ip name-server 8.8.8.8", + "no ip name-server 172.26.1.1", + "vrf context management", + "no ip name-server 8.8.8.8", + "exit", + "vrf context management", + "no ip name-server 172.26.1.1", + "exit", + "vrf context management", + "ip name-server 1.2.3.4", + "exit", + ] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_system_mtu(self): + set_module_args(dict(system_mtu=2000)) + commands = ["system jumbomtu 2000"] + self.execute_module(changed=True, commands=commands) + + def test_nxos_system_state_absent(self): + set_module_args(dict(state="absent")) + commands = [ + "no hostname", + "no ip domain-name ansible.com", + "vrf context management", + "no ip domain-name eng.ansible.com", + "exit", + "no ip domain-list ansible.com", + "no ip domain-list redhat.com", + "vrf context management", + "no ip domain-list ansible.com", + "exit", + "vrf context management", + "no ip domain-list redhat.com", + "exit", + "no ip name-server 8.8.8.8", + "no ip name-server 172.26.1.1", + "vrf context management", + "no ip name-server 8.8.8.8", + "exit", + "vrf context management", + "no ip name-server 172.26.1.1", + "exit", + "no system jumbomtu", + ] + self.execute_module(changed=True, commands=commands) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_telemetry.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_telemetry.py new file mode 100644 index 00000000..0895af96 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_telemetry.py @@ -0,0 +1,1834 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_telemetry +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + NxosCmdRef, +) +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.telemetry.telemetry import ( + Telemetry, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +# TBD: These imports / import checks are only needed as a workaround for +# shippable, which fails this test due to import yaml & import ordereddict. +import pytest +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos import ( + nxosCmdRef_import_check, +) + +msg = nxosCmdRef_import_check() +ignore_provider_arg = True + + +@pytest.mark.skipif(len(msg), reason=msg) +class TestNxosTelemetryModule(TestNxosModule): + + module = nxos_telemetry + + def setUp(self): + super(TestNxosTelemetryModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.telemetry.telemetry.Telemetry.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_execute_show_command = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos.NxosCmdRef.execute_show_command" + ) + self.execute_show_command = self.mock_execute_show_command.start() + + self.mock_get_platform_shortname = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.nxos.NxosCmdRef.get_platform_shortname" + ) + self.get_platform_shortname = self.mock_get_platform_shortname.start() + + def tearDown(self): + super(TestNxosTelemetryModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_execute_show_command.stop() + self.get_platform_shortname.stop() + + def load_fixtures(self, commands=None, device=""): + self.mock_FACT_LEGACY_SUBSETS.return_value = dict() + self.get_resource_connection_config.return_value = "Connection" + self.get_resource_connection_facts.return_value = "Connection" + self.edit_config.return_value = None + + # --------------------------- + # Telemetry Global Test Cases + # --------------------------- + + def test_tms_global_merged_n9k(self): + # Assumes feature telemetry is disabled + # TMS global config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + config=dict( + certificate={ + "key": "/bootflash/sample.key", + "hostname": "server.example.com", + }, + compression="gzip", + source_interface="Ethernet2/1", + vrf="blue", + ) + ), + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "certificate /bootflash/sample.key server.example.com", + "destination-profile", + "use-compression gzip", + "source-interface Ethernet2/1", + "use-vrf blue", + ], + ) + + def test_tms_global_checkmode_n9k(self): + # Assumes feature telemetry is disabled + # TMS global config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + _ansible_check_mode=True, + config=dict( + certificate={ + "key": "/bootflash/sample.key", + "hostname": "server.example.com", + }, + compression="gzip", + source_interface="Ethernet2/1", + vrf="blue", + ), + ), + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "certificate /bootflash/sample.key server.example.com", + "destination-profile", + "use-compression gzip", + "source-interface Ethernet2/1", + "use-vrf blue", + ], + ) + + def test_tms_global_merged2_n9k(self): + # Assumes feature telemetry is disabled + # TMS global config is not present. + # Configure only vrf + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + set_module_args(dict(config=dict(vrf="blue")), ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "destination-profile", + "use-vrf blue", + ], + ) + + def test_tms_global_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # TMS global config is present. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + config=dict( + certificate={ + "key": "/bootflash/server.key", + "hostname": "localhost", + }, + compression="gzip", + source_interface="loopback55", + vrf="management", + ) + ), + ignore_provider_arg, + ) + self.execute_module(changed=False) + + def test_tms_global_change_cert_n9k(self): + # Assumes feature telemetry is enabled + # TMS global config is present + # Change certificate + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + config=dict( + certificate={ + "key": "/bootflash/server.key", + "hostname": "my_host", + }, + compression="gzip", + source_interface="loopback55", + vrf="management", + ) + ), + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "certificate /bootflash/server.key my_host", + ], + ) + + def test_tms_global_change_interface_n9k(self): + # Assumes feature telemetry is enabled + # TMS global config is present + # Change interface + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + config=dict( + certificate={ + "key": "/bootflash/server.key", + "hostname": "localhost", + }, + compression="gzip", + source_interface="Ethernet8/1", + vrf="management", + ) + ), + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "destination-profile", + "source-interface Ethernet8/1", + ], + ) + + def test_tms_global_change_several_n9k(self): + # Assumes feature telemetry is enabled + # TMS global config is present + # Change source_interface, vrf and cert + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + config=dict( + certificate={ + "key": "/bootflash/server_5.key", + "hostname": "my_host", + }, + compression="gzip", + source_interface="Ethernet8/1", + vrf="blue", + ) + ), + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "certificate /bootflash/server_5.key my_host", + "destination-profile", + "source-interface Ethernet8/1", + "use-vrf blue", + ], + ) + + # ------------------------------ + # Telemetry DestGroup Test Cases + # ------------------------------ + + def test_tms_destgroup_input_validation_1(self): + # Mandatory parameter 'id' missing. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + } + } + ], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert "Parameter under is required" in str( + testdata["msg"] + ) + assert testdata["failed"] + + def test_tms_destgroup_input_validation_2(self): + # Parameter 'destination' is not a dict. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [{"id": "88", "destination": "192.168.1.1"}], "destination_groups" + ) + set_module_args(args, ignore_provider_arg) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert ( + "Parameter under must be a dict" + in str(testdata["msg"]) + ) + assert testdata["failed"] + + def test_tms_destgroup_input_validation_3(self): + # Parameter 'destination' is not a dict. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [{"id": "88", "ip": "192.168.1.1", "port": "5001"}], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert "Playbook entry contains unrecongnized parameters" in str( + testdata["msg"] + ) + assert testdata["failed"] + + def test_tms_destgroup_merged_n9k(self): + # Assumes feature telemetry is enabled + # TMS destgroup config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "88", + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "88", + "destination": { + "ip": "192.168.1.2", + "port": "6001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "99", + "destination": { + "ip": "192.168.1.2", + "port": "6001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "99", + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + ], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "destination-group 88", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + "ip address 192.168.1.2 port 6001 protocol grpc encoding gpb", + "destination-group 99", + "ip address 192.168.1.2 port 6001 protocol grpc encoding gpb", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + ], + ) + + def test_tms_destgroup_checkmode_n9k(self): + # Assumes feature telemetry is enabled + # TMS destgroup config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "88", + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + } + ], + "destination_groups", + state="merged", + check_mode=True, + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "destination-group 88", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + ], + ) + + def test_tms_destgroup_merged2_n9k(self): + # Assumes feature telemetry is enabled + # TMS destgroup config is not present. + # Configure only identifier + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args([{"id": "88"}], "destination_groups") + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "destination-group 88", + ], + ) + + def test_tms_destgroup_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # TMS destgroup config is not present. + # Configure only identifier + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "destination": { + "ip": "192.168.0.2", + "port": "60001", + "protocol": "grpc", + "encoding": "gpb", + }, + } + ], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_destgroup_idempotent2_n9k(self): + # Assumes feature telemetry is enabled + # TMS destgroup config is not present. + # Configure only identifier + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args([{"id": "2"}], "destination_groups") + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_destgroup_merged_aggregate_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # TMS destgroup config is present. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "destination": { + "ip": "192.168.0.1", + "port": "50001", + "protocol": "gRPC", + "encoding": "gpb", + }, + }, + { + "id": "10", + "destination": { + "ip": "192.168.0.1", + "port": "50001", + "protocol": "gRPC", + "encoding": "gpb", + }, + }, + ], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_destgroup_change_n9k(self): + # TMS destgroup config is not present. + # Change protocol and encoding for dest group 2 + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "destination": { + "ip": "192.168.0.1", + "port": "50001", + "protocol": "http", + "encoding": "JSON", + }, + }, + { + "id": "10", + "destination": { + "ip": "192.168.0.1", + "port": "50001", + "protocol": "gRPC", + "encoding": "gpb", + }, + }, + ], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "destination-group 2", + "ip address 192.168.0.1 port 50001 protocol http encoding json", + ], + ) + + def test_tms_destgroup_add_n9k(self): + # TMS destgroup config is not present. + # Add destinations to destgroup 10 + # Add new destgroup 55 and 56 + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "10", + "destination": { + "ip": "192.168.0.1", + "port": "50001", + "protocol": "gRPC", + "encoding": "gpb", + }, + }, + { + "id": "10", + "destination": { + "ip": "192.168.0.10", + "port": "50001", + "protocol": "gRPC", + "encoding": "gpb", + }, + }, + { + "id": "55", + "destination": { + "ip": "192.168.0.2", + "port": "50001", + "protocol": "gRPC", + "encoding": "gpb", + }, + }, + {"id": "56"}, + ], + "destination_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "destination-group 10", + "ip address 192.168.0.10 port 50001 protocol grpc encoding gpb", + "destination-group 55", + "ip address 192.168.0.2 port 50001 protocol grpc encoding gpb", + "destination-group 56", + ], + ) + + # -------------------------------- + # Telemetry SensorGroup Test Cases + # -------------------------------- + + def test_tms_sensorgroup_merged_n9k(self): + # Assumes feature telemetry is enabled + # TMS sensorgroup config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + td55_name = ( + "sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11]" + ) + td55_fc = ( + 'or(eq(ethpmPhysIf.operSt,"down"),eq(ethpmPhysIf.operSt,"up"))' + ) + args = build_args( + [ + { + "id": "2", + "data_source": "NX-API", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "foo", + "filter_condition": "foo", + }, + }, + { + "id": "2", + "data_source": "NX-API", + "path": { + "name": "sys/bgp/inst", + "depth": "unbounded", + "query_condition": "foo", + "filter_condition": "foo", + }, + }, + { + "id": "55", + "data_source": "DME", + "path": { + "name": td55_name, + "depth": 0, + "query_condition": "foo", + "filter_condition": "foo", + }, + }, + { + "id": "55", + "data_source": "DME", + "path": { + "name": "sys/ospf", + "depth": 0, + "query_condition": "foo", + "filter_condition": td55_fc, + }, + }, + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 2", + "data-source NX-API", + "path sys/bgp depth 0 query-condition foo filter-condition foo", + "path sys/bgp/inst depth unbounded query-condition foo filter-condition foo", + "sensor-group 55", + "data-source DME", + "path sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11] depth 0 query-condition foo filter-condition foo", + 'path sys/ospf depth 0 query-condition foo filter-condition or(eq(ethpmPhysIf.operSt,"down"),eq(ethpmPhysIf.operSt,"up"))', + ], + ) + + def test_tms_sensorgroup_input_validation_1(self): + # Mandatory parameter 'id' missing. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "data_source": "DME", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert "Parameter under is required" in str( + testdata["msg"] + ) + assert testdata["failed"] + + def test_tms_sensorgroup_input_validation_2(self): + # Path present but mandatory 'name' key is not + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "DME", + "path": { + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert ( + "Parameter under requires key" + in str(testdata["msg"]) + ) + assert testdata["failed"] + + def test_tms_sensorgroup_resource_key_n9k(self): + # TMS sensorgroup config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args([{"id": "77"}], "sensor_groups") + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=["feature telemetry", "telemetry", "sensor-group 77"], + ) + + def test_tms_sensorgroup_merged_variable_args1_n9k(self): + # TMS sensorgroup config is not present. + # Only path key name provided + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [{"id": "77", "data_source": "DME", "path": {"name": "sys/bgp"}}], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source DME", + "path sys/bgp", + ], + ) + + def test_tms_sensorgroup_merged_variable_args2_n9k(self): + # TMS sensorgroup config is not present. + # Only path keys name and depth provided + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "DME", + "path": {"name": "sys/bgp", "depth": 0}, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source DME", + "path sys/bgp depth 0", + ], + ) + + def test_tms_sensorgroup_merged_variable_args3_n9k(self): + # TMS sensorgroup config is not present. + # Only path keys name, depth and query_condition provided + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "DME", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + }, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source DME", + "path sys/bgp depth 0 query-condition query_condition_xyz", + ], + ) + + def test_tms_sensorgroup_merged_variable_args4_n9k(self): + # TMS sensorgroup config is not present. + # Only path keys name, depth and filter_condition provided + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "DME", + "path": { + "name": "sys/bgp", + "depth": 0, + "filter_condition": "filter_condition_xyz", + }, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source DME", + "path sys/bgp depth 0 filter-condition filter_condition_xyz", + ], + ) + + def test_tms_sensorgroup_merged_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # TMS sensorgroup config is not present. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "data_source": "DME", + "path": { + "name": "sys/ospf", + "depth": 0, + "query_condition": "qc", + "filter_condition": "fc", + }, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_sensorgroup_quotes_merged_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # TMS sensorgroup config is present with quotes in NX-API path. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K_SGs.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "data_source": "NX-API", + "path": { + "name": '"show mac address-table count"', + "depth": 2, + }, + }, + { + "id": "3", + "data_source": "NX-API", + "path": {"name": '"show interface ethernet1/1-52"'}, + }, + {"id": "1", "path": {"name": "sys/procsys", "depth": 1}}, + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_sensorgroup_vxlan_idempotent_n9k(self): + # TMS sensorgroup config present. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [{"id": "56", "data_source": "DME", "path": {"name": "vxlan"}}], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_sensorgroup_idempotent_variable1_n9k(self): + # TMS sensorgroup config is present with path key name. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "data_source": "DME", + "path": { + "name": "sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11]" + }, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_sensorgroup_idempotent_variable2_n9k(self): + # TMS sensorgroup config is present with path key name and depth. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "2", + "data_source": "DME", + "path": {"name": "boo", "depth": 0}, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_sensorgroup_idempotent_resource_key_n9k(self): + # TMS sensorgroup config is present resource key only. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args([{"id": "55"}], "sensor_groups") + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_sensorgroup_present_path_environment_n9k(self): + # TMS sensorgroup config is not present. + # Path name 'environment' test + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "YANG", + "path": {"name": "environment"}, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source YANG", + "path environment", + ], + ) + + def test_tms_sensorgroup_present_path_interface_n9k(self): + # TMS sensorgroup config is not present. + # Path name 'interface' test + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "NATIVE", + "path": {"name": "interface"}, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source NATIVE", + "path interface", + ], + ) + + def test_tms_sensorgroup_present_path_interface_n9k(self): + # TMS sensorgroup config is not present. + # Path name 'resources' test + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": "77", + "data_source": "NX-API", + "path": {"name": "resources"}, + } + ], + "sensor_groups", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "sensor-group 77", + "data-source NX-API", + "path resources", + ], + ) + + # --------------------------------- + # Telemetry Subscription Test Cases + # --------------------------------- + + def test_tms_subscription_merged_n9k(self): + # TMS subscription config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + { + "id": 5, + "destination_group": 55, + "sensor_group": {"id": 1, "sample_interval": 1000}, + }, + { + "id": 88, + "destination_group": 3, + "sensor_group": {"id": 4, "sample_interval": 2000}, + }, + ], + "subscriptions", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "subscription 5", + "dst-grp 55", + "snsr-grp 1 sample-interval 1000", + "subscription 88", + "dst-grp 3", + "snsr-grp 4 sample-interval 2000", + ], + ) + + def test_tms_subscription_merged_idempotent_n9k(self): + # TMS subscription config is not present. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + {"id": 3}, + { + "id": 7, + "destination_group": 10, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + { + "id": 5, + "destination_group": 2, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + ], + "subscriptions", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_subscription_merged_change1_n9k(self): + # TMS subscription config present. + # Change sample interval for sensor group 2 + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + {"id": 3}, + { + "id": 7, + "destination_group": 10, + "sensor_group": {"id": 2, "sample_interval": 3000}, + }, + { + "id": 5, + "destination_group": 2, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + ], + "subscriptions", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "subscription 7", + "snsr-grp 2 sample-interval 3000", + ], + ) + + def test_tms_subscription_add_n9k(self): + # TMS subscription config present. + # Add new destination_group and sensor_group to subscription 5 + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + args = build_args( + [ + {"id": 3}, + { + "id": 7, + "destination_group": 10, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + { + "id": 5, + "destination_group": 2, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + { + "id": 5, + "destination_group": 7, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + { + "id": 5, + "destination_group": 8, + "sensor_group": {"id": 9, "sample_interval": 1000}, + }, + { + "id": 5, + "destination_group": 9, + "sensor_group": {"id": 10, "sample_interval": 1000}, + }, + ], + "subscriptions", + ) + set_module_args(args, ignore_provider_arg) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "subscription 5", + "dst-grp 7", + "dst-grp 8", + "dst-grp 9", + "snsr-grp 9 sample-interval 1000", + "snsr-grp 10 sample-interval 1000", + ], + ) + + def test_telemetry_full_n9k(self): + # Assumes feature telemetry is disabled + # TMS global config is not present. + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + set_module_args( + { + "state": "merged", + "config": { + "certificate": { + "key": "/bootflash/sample.key", + "hostname": "server.example.com", + }, + "compression": "gzip", + "source_interface": "Ethernet2/1", + "vrf": "blue", + "destination_groups": [ + { + "id": "88", + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "88", + "destination": { + "ip": "192.168.1.2", + "port": "6001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "99", + "destination": { + "ip": "192.168.1.2", + "port": "6001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "99", + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + ], + "sensor_groups": [ + { + "id": "77", + "data_source": "DME", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + }, + { + "id": "99", + "data_source": "DME", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + }, + ], + "subscriptions": [ + { + "id": 5, + "destination_group": 88, + "sensor_group": { + "id": 77, + "sample_interval": 1000, + }, + }, + { + "id": 5, + "destination_group": 99, + "sensor_group": { + "id": 77, + "sample_interval": 1000, + }, + }, + { + "id": 88, + "destination_group": 99, + "sensor_group": { + "id": 99, + "sample_interval": 2000, + }, + }, + ], + }, + }, + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "feature telemetry", + "telemetry", + "certificate /bootflash/sample.key server.example.com", + "destination-profile", + "use-compression gzip", + "source-interface Ethernet2/1", + "use-vrf blue", + "destination-group 88", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + "ip address 192.168.1.2 port 6001 protocol grpc encoding gpb", + "destination-group 99", + "ip address 192.168.1.2 port 6001 protocol grpc encoding gpb", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + "sensor-group 77", + "data-source DME", + "path sys/bgp depth 0 query-condition query_condition_xyz filter-condition filter_condition_xyz", + "sensor-group 99", + "data-source DME", + "path sys/bgp depth 0 query-condition query_condition_xyz filter-condition filter_condition_xyz", + "subscription 5", + "dst-grp 88", + "dst-grp 99", + "snsr-grp 77 sample-interval 1000", + "subscription 88", + "dst-grp 99", + "snsr-grp 99 sample-interval 2000", + ], + ) + + def test_telemetry_deleted_input_validation_n9k(self): + # State is 'deleted' and 'config' key present. + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + state="deleted", + config=dict( + certificate={ + "key": "/bootflash/server.key", + "hostname": "localhost", + }, + compression="gzip", + source_interface="loopback55", + vrf="management", + ), + ), + ignore_provider_arg, + ) + with pytest.raises(AnsibleFailJson) as errinfo: + self.execute_module() + testdata = errinfo.value.args[0] + assert ( + "Remove config key from playbook when state is " + in str(testdata["msg"]) + ) + assert testdata["failed"] + + def test_telemetry_deleted_n9k(self): + # Assumes feature telemetry is enabled + # TMS global config is present. + # Make absent with all playbook keys provided + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args(dict(state="deleted"), ignore_provider_arg) + self.execute_module(changed=True, commands=["no telemetry"]) + + def test_telemetry_deleted_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # TMS global config is present. + # Make absent with all playbook keys provided + self.execute_show_command.return_value = None + self.get_platform_shortname.return_value = "N9K" + set_module_args(dict(state="deleted"), ignore_provider_arg) + self.execute_module(changed=False) + + def test_tms_replaced1_n9k(self): + # Assumes feature telemetry is enabled + # Modify global config and remove everything else + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + dict( + state="replaced", + config=dict( + certificate={ + "key": "/bootflash/sample.key", + "hostname": "server.example.com", + }, + compression="gzip", + vrf="blue", + ), + ), + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "no subscription 3", + "no subscription 4", + "no subscription 5", + "no subscription 6", + "no subscription 7", + "no sensor-group 2", + "no sensor-group 55", + "no sensor-group 56", + "no destination-group 2", + "no destination-group 10", + "certificate /bootflash/sample.key server.example.com", + "destination-profile", + "no source-interface loopback55", + "use-vrf blue", + ], + ) + + def test_tms_replaced2_n9k(self): + # Assumes feature telemetry is enabled + # Remove/default all global config + # Modify destination-group 10, add 11 and 99, remove 2 + # Modify sensor-group 55, 56 + # remove all subscriptions + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + { + "state": "replaced", + "config": { + "destination_groups": [ + { + "id": 10, + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": 11, + "destination": { + "ip": "192.168.1.2", + "port": "6001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": 99, + "destination": { + "ip": "192.168.1.2", + "port": "6001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": "99", + "destination": { + "ip": "192.168.1.1", + "port": "5001", + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + ], + "sensor_groups": [ + { + "id": 55, + "data_source": "NX-API", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + }, + { + "id": "56", + "data_source": "NX-API", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + }, + ], + }, + }, + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "no subscription 3", + "no subscription 5", + "no subscription 4", + "no subscription 7", + "no subscription 6", + "sensor-group 56", + "no data-source DME", + "no path environment", + "no path interface", + "no path resources", + "no path vxlan", + "no sensor-group 2", + "destination-group 10", + "no ip address 192.168.0.1 port 50001 protocol grpc encoding gpb", + "no ip address 192.168.0.2 port 60001 protocol grpc encoding gpb", + "no destination-group 2", + "destination-group 11", + "ip address 192.168.1.2 port 6001 protocol grpc encoding gpb", + "destination-group 10", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + "destination-group 99", + "ip address 192.168.1.2 port 6001 protocol grpc encoding gpb", + "ip address 192.168.1.1 port 5001 protocol grpc encoding gpb", + "sensor-group 55", + "data-source NX-API", + "path sys/bgp depth 0 query-condition query_condition_xyz filter-condition filter_condition_xyz", + "sensor-group 56", + "data-source NX-API", + "path sys/bgp depth 0 query-condition query_condition_xyz filter-condition filter_condition_xyz", + "no certificate /bootflash/server.key localhost", + "no destination-profile", + ], + ) + + def test_tms_replaced3_n9k(self): + # Assumes feature telemetry is enabled + # Modify vrf global config, remove default all other global config. + # destination-group 2 destination '192.168.0.1' idempotent + # destination-group 2 destination '192.168.0.2' remove + # remove all other destination-groups + # Modify sensor-group 55 and delete all others + # Modify subscription 7, add 10 and delete all others + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + { + "state": "replaced", + "config": { + "vrf": "blue", + "destination_groups": [ + { + "id": 2, + "destination": { + "ip": "192.168.0.1", + "port": 50001, + "protocol": "GRPC", + "encoding": "GPB", + }, + } + ], + "sensor_groups": [ + { + "id": 55, + "data_source": "NX-API", + "path": { + "name": "sys/bgp", + "depth": 0, + "query_condition": "query_condition_xyz", + "filter_condition": "filter_condition_xyz", + }, + } + ], + "subscriptions": [ + { + "id": 7, + "destination_group": 10, + "sensor_group": { + "id": 55, + "sample_interval": 1000, + }, + }, + { + "id": 10, + "destination_group": 2, + "sensor_group": { + "id": 55, + "sample_interval": 1000, + }, + }, + ], + }, + }, + ignore_provider_arg, + ) + self.execute_module( + changed=True, + commands=[ + "telemetry", + "no subscription 3", + "no subscription 5", + "no subscription 4", + "subscription 7", + "no snsr-grp 2 sample-interval 1000", + "no subscription 6", + "no sensor-group 56", + "no sensor-group 2", + "no destination-group 10", + "destination-group 2", + "no ip address 192.168.0.2 port 60001 protocol grpc encoding gpb", + "sensor-group 55", + "data-source NX-API", + "path sys/bgp depth 0 query-condition query_condition_xyz filter-condition filter_condition_xyz", + "subscription 10", + "dst-grp 2", + "snsr-grp 55 sample-interval 1000", + "subscription 7", + "snsr-grp 55 sample-interval 1000", + "no certificate /bootflash/server.key localhost", + "destination-profile", + "no use-compression gzip", + "no source-interface loopback55", + "use-vrf blue", + ], + ) + + def test_tms_replaced_idempotent_n9k(self): + # Assumes feature telemetry is enabled + # Modify vrf global config, remove default all other global config. + # destination-group 2 destination '192.168.0.1' idempotent + # destination-group 2 destination '192.168.0.2' remove + # remove all other destination-groups + # Modify sensor-group 55 and delete all others + # Modify subscription 7, add 10 and delete all others + self.execute_show_command.return_value = load_fixture( + "nxos_telemetry", "N9K.cfg" + ) + self.get_platform_shortname.return_value = "N9K" + set_module_args( + { + "state": "replaced", + "config": { + "certificate": { + "key": "/bootflash/server.key", + "hostname": "localhost", + }, + "compression": "gzip", + "vrf": "management", + "source_interface": "loopback55", + "destination_groups": [ + { + "id": 2, + "destination": { + "ip": "192.168.0.1", + "port": 50001, + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": 2, + "destination": { + "ip": "192.168.0.2", + "port": 60001, + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": 10, + "destination": { + "ip": "192.168.0.1", + "port": 50001, + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + { + "id": 10, + "destination": { + "ip": "192.168.0.2", + "port": 60001, + "protocol": "GRPC", + "encoding": "GPB", + }, + }, + ], + "sensor_groups": [ + { + "id": 2, + "data_source": "DME", + "path": {"name": "boo", "depth": 0}, + }, + { + "id": 2, + "path": { + "name": "sys/ospf", + "depth": 0, + "query_condition": "qc", + "filter_condition": "fc", + }, + }, + {"id": 2, "path": {"name": "interfaces", "depth": 0}}, + {"id": 2, "path": {"name": "sys/bgp"}}, + { + "id": 2, + "path": { + "name": "sys/bgp/inst", + "depth": 0, + "query_condition": "foo", + "filter_condition": "foo", + }, + }, + { + "id": 2, + "path": { + "name": "sys/bgp/inst/dom-default/peer-[10.10.10.11]/ent-[10.10.10.11]" + }, + }, + { + "id": 2, + "path": { + "name": "sys/bgp/inst/dom-default/peer-[20.20.20.11]/ent-[20.20.20.11]" + }, + }, + { + "id": 2, + "path": { + "name": "too", + "depth": 0, + "filter_condition": "foo", + }, + }, + {"id": 55}, + {"id": 56, "data_source": "DME"}, + {"id": 56, "path": {"name": "environment"}}, + {"id": 56, "path": {"name": "interface"}}, + {"id": 56, "path": {"name": "resources"}}, + {"id": 56, "path": {"name": "vxlan"}}, + ], + "subscriptions": [ + {"id": 3}, + { + "id": 4, + "destination_group": 2, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + {"id": 5, "destination_group": 2}, + { + "id": 5, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + {"id": 6, "destination_group": 10}, + { + "id": 7, + "destination_group": 10, + "sensor_group": {"id": 2, "sample_interval": 1000}, + }, + ], + }, + }, + ignore_provider_arg, + ) + self.execute_module(changed=False, commands=[]) + + +def build_args(data, type, state=None, check_mode=None): + if state is None: + state = "merged" + if check_mode is None: + check_mode = False + args = { + "state": state, + "_ansible_check_mode": check_mode, + "config": {type: data}, + } + return args diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_user.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_user.py new file mode 100644 index 00000000..62620129 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_user.py @@ -0,0 +1,104 @@ +# (c) 2020 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_user +from .nxos_module import TestNxosModule, set_module_args + +ignore_provider_arg = True + + +class TestNxosUserModule(TestNxosModule): + + module = nxos_user + + def setUp(self): + super(TestNxosUserModule, self).setUp() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_user.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_user.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_user.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_get_device_info = patch( + "ansible_collections.cisco.nxos.plugins.cliconf.nxos.Cliconf.get_device_info" + ) + self.get_device_info = self.mock_get_device_info.start() + + def tearDown(self): + super(TestNxosUserModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + self.mock_get_config.stop() + self.mock_get_device_info.stop() + + def test_mds(self): + self.get_config.return_value = "" + self.run_commands.return_value = [ + { + "TABLE_template": { + "ROW_template": [ + { + "usr_name": "admin", + "expire_date": "this user account has no expiry date", + "TABLE_role": { + "ROW_role": {"role": "network-admin"} + }, + }, + { + "usr_name": "ansible-test-1", + "expire_date": "this user account has no expiry date", + "TABLE_role": {"ROW_role": [{"role": "priv-10"}]}, + }, + ] + } + } + ] + self.get_device_info.return_value = { + "network_os": "nxos", + "network_os_version": "8.4(2b)", + "network_os_model": 'MDS 9148S 16G 48 FC (1 Slot) Chassis ("2/4/8/16 Gbps FC/Supervisor")', + "network_os_hostname": "sw109-Mini", + "network_os_image": "bootflash:///m9100-s5ek9-mz.8.4.2b.bin", + "network_os_platform": "DS-C9710", + } + set_module_args( + dict(name="ansible-test-2", configured_password="ansible") + ) + self.execute_module( + changed=True, + commands=[ + "username ansible-test-2", + "username ansible-test-2 password ansible", + ], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlan.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlan.py new file mode 100644 index 00000000..0ba5a783 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlan.py @@ -0,0 +1,235 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import json + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vlan +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVlanModule(TestNxosModule): + + module = nxos_vlan + + def setUp(self): + super(TestNxosVlanModule, self).setUp() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vlan.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vlan.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vlan.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_get_capabilities = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vlan.get_capabilities" + ) + self.get_capabilities = self.mock_get_capabilities.start() + self.get_capabilities.return_value = { + "device_info": {"network_os_platform": "N9K-9000v"}, + "network_api": "cliconf", + } + + def tearDown(self): + super(TestNxosVlanModule, self).tearDown() + self.mock_run_commands.stop() + self.mock_load_config.stop() + self.mock_get_config.stop() + self.mock_get_capabilities.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + obj = json.loads(item) + command = obj["command"] + except ValueError: + command = item + filename = "%s.txt" % str(command).split(" | ")[0].replace( + " ", "_" + ) + output.append(load_fixture("nxos_vlan", filename)) + return output + + def agg_load_from_file(*args, **kwargs): + """Load vlan output for aggregate/purge tests""" + return [load_fixture("nxos_vlan", "agg_show_vlan_brief.txt")] + + if "_agg_" in self._testMethodName: + self.run_commands.side_effect = agg_load_from_file + else: + self.run_commands.side_effect = load_from_file + + self.load_config.return_value = None + self.get_config.return_value = load_fixture("nxos_vlan", "config.cfg") + + def test_nxos_vlan_agg_1(self): + # Aggregate: vlan 4/5 exist -> Add 6 + set_module_args( + dict( + aggregate=[ + {"name": "_5_", "vlan_id": 5}, + {"name": "_6_", "vlan_id": 6}, + ] + ) + ) + self.execute_module( + changed=True, + commands=[ + "vlan 6", + "name _6_", + "state active", + "no shutdown", + "exit", + ], + ) + + def test_nxos_vlan_agg_2(self): + # Aggregate: vlan 4/5 exist -> Add none (idempotence) + set_module_args( + dict( + aggregate=[ + {"name": "_5_", "vlan_id": 5}, + {"name": "_4_", "vlan_id": 4}, + ] + ) + ) + self.execute_module(changed=False) + + def test_nxos_vlan_agg_3(self): + # Aggregate/Purge: vlan 4/5 exist -> Add 6, Purge 4 + set_module_args( + dict( + aggregate=[ + {"name": "_5_", "vlan_id": 5}, + {"name": "_6_", "vlan_id": 6}, + ], + purge=True, + ) + ) + self.execute_module( + changed=True, + commands=[ + "vlan 6", + "name _6_", + "state active", + "no shutdown", + "exit", + "no vlan 4", + ], + ) + + def test_nxos_vlan_agg_4(self): + # Aggregate/Purge: vlan 4/5 exist -> Purge None (idempotence) + set_module_args( + dict( + aggregate=[ + {"name": "_5_", "vlan_id": 5}, + {"name": "_4_", "vlan_id": 4}, + ] + ) + ) + self.execute_module(changed=False) + + def test_nxos_vlan_agg_5(self): + # Purge with Single Vlan: vlan 4/5 exist -> Add 6, Purge 4/5 + set_module_args(dict(vlan_id=6, name="_6_", purge=True)) + self.execute_module( + changed=True, + commands=[ + "vlan 6", + "name _6_", + "state active", + "no shutdown", + "exit", + "no vlan 4", + "no vlan 5", + ], + ) + + def test_nxos_vlan_agg_6(self): + # Purge All: vlan 4/5 exist -> Purge 4/5 + set_module_args(dict(vlan_id=1, purge=True)) + self.execute_module(changed=True, commands=["no vlan 4", "no vlan 5"]) + + def test_nxos_vlan_range(self): + set_module_args(dict(vlan_range="6-10")) + self.execute_module( + changed=True, + commands=["vlan 6", "vlan 7", "vlan 8", "vlan 9", "vlan 10"], + ) + + def test_nxos_vlan_range_absent(self): + set_module_args(dict(vlan_range="1-5", state="absent")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["no vlan 1"]) + + def test_nxos_vlan_id(self): + set_module_args(dict(vlan_id="15", state="present")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["vlan 15", "state active", "no shutdown", "exit"], + ) + + def test_nxos_vlan_id_absent(self): + set_module_args(dict(vlan_id="1", state="absent")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["no vlan 1"]) + + def test_nxos_vlan_named_vlan(self): + set_module_args(dict(vlan_id="15", name="WEB")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["vlan 15", "name WEB", "state active", "no shutdown", "exit"], + ) + + def test_nxos_vlan_shut_down(self): + set_module_args(dict(vlan_id="1", admin_state="down")) + result = self.execute_module(changed=True) + self.assertEqual(result["commands"], ["vlan 1", "shutdown", "exit"]) + + def test_nxos_vlan_no_change(self): + set_module_args( + dict( + vlan_id="1", + name="default", + vlan_state="active", + admin_state="up", + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlans.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlans.py new file mode 100644 index 00000000..955da390 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vlans.py @@ -0,0 +1,294 @@ +# (c) 2019 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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from textwrap import dedent +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.tests.unit.modules.utils import ( + AnsibleFailJson, +) +from ansible_collections.cisco.nxos.plugins.modules import nxos_vlans +from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.vlans.vlans import ( + Vlans, +) +from .nxos_module import TestNxosModule, load_fixture, set_module_args + +ignore_provider_arg = True + + +class TestNxosVlansModule(TestNxosModule): + + module = nxos_vlans + + def setUp(self): + super(TestNxosVlansModule, self).setUp() + + self.mock_FACT_LEGACY_SUBSETS = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.facts.FACT_LEGACY_SUBSETS" + ) + self.FACT_LEGACY_SUBSETS = self.mock_FACT_LEGACY_SUBSETS.start() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base.get_resource_connection" + ) + self.get_resource_connection_config = ( + self.mock_get_resource_connection_config.start() + ) + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection" + ) + self.get_resource_connection_facts = ( + self.mock_get_resource_connection_facts.start() + ) + + self.mock_edit_config = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.vlans.vlans.Vlans.edit_config" + ) + self.edit_config = self.mock_edit_config.start() + + self.mock_get_device_data = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.facts.vlans.vlans.VlansFacts.get_device_data" + ) + self.get_device_data = self.mock_get_device_data.start() + + self.mock_get_platform = patch( + "ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.config.vlans.vlans.Vlans.get_platform" + ) + self.get_platform = self.mock_get_platform.start() + + def tearDown(self): + super(TestNxosVlansModule, self).tearDown() + self.mock_FACT_LEGACY_SUBSETS.stop() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_platform.stop() + + def prepare(self, test=""): + if test == "_no_facts": + self.get_device_data.side_effect = self.load_from_file_no_facts + else: + self.get_device_data.side_effect = self.load_from_file + self.get_platform.return_value = "N9K-NXOSv" + + def load_from_file(self, *args, **kwargs): + cmd = args[1] + filename = str(cmd).split(" | ")[0].replace(" ", "_") + return load_fixture("nxos_vlans", filename) + + def load_from_file_no_facts(self, *args, **kwargs): + cmd = args[1] + filename = str(cmd).split(" | ")[0].replace(" ", "_") + filename += "_no_facts" + return load_fixture("nxos_vlans", filename) + + def test_1(self): + """ + **NOTE** This config is for reference only! See fixtures files for real data. + vlan 1,3-5,8 + vlan 3 + name test-vlan3 + !Note:vlan 4 is present with default settings + vlan 5 + shutdown + name test-changeme + mode fabricpath + state suspend + vn-segment 942 + !Note:vlan 7 is not present + vlan 8 + shutdown + name test-changeme-not + state suspend + """ + self.prepare() + self.get_platform.return_value = "N7K-Cxxx" + + playbook = dict( + config=[ + dict(vlan_id=4), + dict(vlan_id=5, mapped_vni=555, mode="ce"), + dict( + vlan_id=7, mapped_vni=777, name="test-vlan7", enabled=False + ), + dict(vlan_id="8", state="active", name="test-changeme-not") + # vlan 3 is not present in playbook. + ] + ) + + merged = [ + # Update existing device states with any differences in the playbook. + "vlan 5", + "vn-segment 555", + "mode ce", + "vlan 7", + "vn-segment 777", + "name test-vlan7", + "shutdown", + "vlan 8", + "state active", + ] + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=merged) + + self.get_platform.return_value = "N9K-NXOSv" + deleted = [ + # Reset existing device state to default values. Scope is limited to + # objects in the play when the 'config' key is specified. For vlans + # this means deleting each vlan listed in the playbook and ignoring + # any play attrs other than 'vlan_id'. + "no vlan 4", + "no vlan 5", + "no vlan 8", + ] + playbook["state"] = "deleted" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + self.get_platform.return_value = "N5K-Cxxx" + overridden = [ + # The play is the source of truth. Similar to replaced but the scope + # includes all objects on the device; i.e. it will also reset state + # on objects not found in the play. + "no vlan 1", + "no vlan 3", + "vlan 5", + "mode ce", + "vn-segment 555", + "no state", + "no shutdown", + "no name", + "vlan 8", + "no shutdown", + "state active", + "vlan 7", + "name test-vlan7", + "shutdown", + "vn-segment 777", + ] + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=overridden) + + self.get_platform.return_value = "N7K-NXOSv" + replaced = [ + # Scope is limited to objects in the play. + # replaced should ignore existing vlan 3. + "vlan 5", + "mode ce", + "vn-segment 555", + "no state", + "no shutdown", + "no name", + "vlan 7", + "shutdown", + "name test-vlan7", + "vn-segment 777", + "vlan 8", + "no shutdown", + "state active", + ] + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_2(self): + # Test when no 'config' key is used in playbook. + self.prepare() + deleted = [ + "no vlan 1", + "no vlan 3", + "no vlan 4", + "no vlan 5", + "no vlan 8", + ] + playbook = dict(state="deleted") + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=deleted) + + for test_state in ["merged", "replaced", "overridden"]: + set_module_args(dict(state=test_state), ignore_provider_arg) + self.execute_module(failed=True) + + def test_3(self): + # Test no facts returned + self.prepare(test="_no_facts") + playbook = dict(state="deleted") + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=False) + + def test_4(self): + self.prepare() + # Misc tests to hit codepaths highlighted by code coverage tool as missed. + playbook = dict(config=[dict(vlan_id=8, enabled=True)]) + replaced = [ + # Update existing device states with any differences in the playbook. + "vlan 8", + "no shutdown", + "no state", + "no name", + ] + playbook["state"] = "replaced" + playbook["_ansible_check_mode"] = True + set_module_args(playbook, ignore_provider_arg) + self.execute_module(changed=True, commands=replaced) + + def test_5(self): + """ + Idempotency test + """ + + self.prepare() + playbook = dict( + config=[ + dict(vlan_id=1, name="default", enabled=True), + dict(vlan_id=3, name="test-vlan3", enabled=True), + dict(vlan_id=4, enabled=True), + dict( + vlan_id=5, + name="test-changeme", + mapped_vni=942, + state="suspend", + enabled=False, + ), + dict( + vlan_id=8, + name="test-changeme-not", + state="suspend", + enabled=False, + ), + ] + ) + + playbook["state"] = "merged" + set_module_args(playbook, ignore_provider_arg) + r = self.execute_module(changed=False) + + playbook["state"] = "overridden" + set_module_args(playbook, ignore_provider_arg) + r = self.execute_module(changed=False) + + playbook["state"] = "replaced" + set_module_args(playbook, ignore_provider_arg) + r = self.execute_module(changed=False) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc.py new file mode 100644 index 00000000..5c862732 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc.py @@ -0,0 +1,235 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vpc +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVpcModule(TestNxosModule): + + module = nxos_vpc + + def setUp(self): + super(TestNxosVpcModule, self).setUp() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vpc.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vpc.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vpc.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestNxosVpcModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for command in commands: + filename = str(command).split(" | ")[0].replace(" ", "_") + output.append(load_fixture("nxos_vpc", filename)) + return output + + def vrf_load_from_file(*args, **kwargs): + """Load vpc output for vrf tests""" + module, commands = args + output = list() + for command in commands: + filename = "vrf_test_" + str(command).split(" | ")[0].replace( + " ", "_" + ) + output.append(load_fixture("nxos_vpc", filename)) + return output + + self.load_config.return_value = None + if device == "_vrf_test": + self.run_commands.side_effect = vrf_load_from_file + else: + self.run_commands.side_effect = load_from_file + + def test_nxos_vpc_present(self): + set_module_args( + dict( + domain=100, + role_priority=32667, + system_priority=2000, + pkl_dest="192.168.100.4", + pkl_src="10.1.100.20", + peer_gw=True, + auto_recovery=True, + ) + ) + self.execute_module( + changed=True, + commands=[ + "vpc domain 100", + "terminal dont-ask", + "role priority 32667", + "system-priority 2000", + "peer-keepalive destination 192.168.100.4 source 10.1.100.20", + "peer-gateway", + "auto-recovery", + ], + ) + + def test_nxos_vpc_vrf_1(self): + # No vrf -> vrf 'default' + set_module_args( + dict( + domain=100, + pkl_dest="192.168.1.1", + pkl_src="10.1.1.1", + pkl_vrf="default", + ) + ) + self.execute_module( + changed=True, + commands=[ + "vpc domain 100", + "peer-keepalive destination 192.168.1.1 source 10.1.1.1 vrf default", + ], + ) + + def test_nxos_vpc_vrf_2(self): + # vrf 'my_vrf'-> vrf 'test-vrf' + # All pkl commands should be present + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args( + dict( + domain=100, + pkl_dest="192.168.1.1", + pkl_src="10.1.1.1", + pkl_vrf="test-vrf", + ) + ) + self.execute_module( + changed=True, + device="_vrf_test", + commands=[ + "vpc domain 100", + "peer-keepalive destination 192.168.1.1 source 10.1.1.1 vrf test-vrf", + ], + ) + + def test_nxos_vpc_vrf_3(self): + # vrf 'my_vrf' -> vrf 'obviously-different-vrf' + # Existing pkl_src should be retained even though playbook does not specify it + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args( + dict( + domain=100, + pkl_dest="192.168.1.1", + pkl_vrf="obviously-different-vrf", + ) + ) + self.execute_module( + changed=True, + device="_vrf_test", + commands=[ + "vpc domain 100", + "peer-keepalive destination 192.168.1.1 source 10.1.1.1 vrf obviously-different-vrf", + ], + ) + + def test_nxos_vpc_vrf_4(self): + # vrf 'my_vrf'-> vrf 'management' + # 'management' is the default value for vrf, it will not nvgen + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args( + dict(domain=100, pkl_dest="192.168.1.1", pkl_vrf="management") + ) + self.execute_module( + changed=True, + device="_vrf_test", + commands=[ + "vpc domain 100", + "peer-keepalive destination 192.168.1.1 source 10.1.1.1 vrf management", + ], + ) + + def test_nxos_vpc_vrf_5(self): + # vrf 'my_vrf' -> vrf 'my_vrf' (idempotence) + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args( + dict( + domain=100, + pkl_dest="192.168.1.1", + pkl_src="10.1.1.1", + pkl_vrf="my_vrf", + ) + ) + self.execute_module(changed=False, device="_vrf_test") + + def test_nxos_vpc_vrf_6(self): + # vrf 'my_vrf' -> absent tests + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args(dict(domain=100, state="absent")) + self.execute_module( + changed=True, + device="_vrf_test", + commands=["terminal dont-ask", "no vpc domain 100"], + ) + + def test_nxos_vpc_vrf_7(self): + # dest 192.168.1.1 source 10.1.1.1 vrf my_vrf -> (dest only) (idempotence) + # pkl_src/pkl_vrf not in playbook but exists on device. + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args(dict(domain=100, pkl_dest="192.168.1.1")) + self.execute_module(changed=False, device="_vrf_test") + + def test_nxos_vpc_vrf_8(self): + # dest 192.168.1.1 source 10.1.1.1 vrf my_vrf -> (optional vrf) (idempotence) + # pkl_src not in playbook but exists on device. + self.get_config.return_value = load_fixture( + "nxos_vpc", "vrf_test_vpc_config" + ) + set_module_args( + dict(domain=100, pkl_dest="192.168.1.1", pkl_vrf="my_vrf") + ) + self.execute_module(changed=False, device="_vrf_test") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc_interface.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc_interface.py new file mode 100644 index 00000000..82d84524 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vpc_interface.py @@ -0,0 +1,81 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vpc_interface +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVpcModule(TestNxosModule): + + module = nxos_vpc_interface + + def setUp(self): + super(TestNxosVpcModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vpc_interface.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vpc_interface.get_config" + ) + self.get_config = self.mock_get_config.start() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vpc_interface.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestNxosVpcModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + for command in commands: + filename = str(command).split(" | ")[0].replace(" ", "_") + output.append(load_fixture("nxos_vpc_interface", filename)) + return output + + self.run_commands.side_effect = load_from_file + self.load_config.return_value = None + + def test_nxos_vpc_interface_absent(self): + set_module_args(dict(portchannel=10, vpc=100, state="absent")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["interface port-channel10", "no vpc"] + ) + + def test_nxos_vpc_interface_present(self): + set_module_args(dict(portchannel=20, vpc=200, state="present")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], ["interface port-channel20", "vpc 200"] + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf.py new file mode 100644 index 00000000..58631038 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf.py @@ -0,0 +1,91 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vrf +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVrfModule(TestNxosModule): + + module = nxos_vrf + + def setUp(self): + super(TestNxosVrfModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vrf.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_run_commands = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vrf.run_commands" + ) + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestNxosVrfModule, self).tearDown() + self.mock_load_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=""): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for command in commands: + if isinstance(command, dict): + command = command["command"] + filename = str(command).split(" | ")[0].replace(" ", "_") + output.append(load_fixture("nxos_vrf", filename)) + return output + + self.load_config.return_value = None + self.run_commands.side_effect = load_from_file + + def test_nxos_vrf_present(self): + set_module_args(dict(vrf="ntc", state="present", admin_state="up")) + self.execute_module( + changed=True, commands=["vrf context ntc", "no shutdown", "exit"] + ) + + def test_nxos_vrf_present_no_change(self): + set_module_args( + dict(vrf="management", state="present", admin_state="up") + ) + self.execute_module(changed=False, commands=[]) + + def test_nxos_vrf_absent(self): + set_module_args(dict(vrf="management", state="absent")) + self.execute_module( + changed=True, commands=["no vrf context management"] + ) + + def test_nxos_vrf_absent_no_change(self): + set_module_args(dict(vrf="ntc", state="absent")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_vrf_default(self): + set_module_args(dict(vrf="default")) + result = self.execute_module(failed=True) + self.assertEqual(result["msg"], "cannot use default as name of a VRF") diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf_af.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf_af.py new file mode 100644 index 00000000..c68c6f40 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vrf_af.py @@ -0,0 +1,1090 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vrf_af +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVrfafModule(TestNxosModule): + + module = nxos_vrf_af + + def setUp(self): + super(TestNxosVrfafModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vrf_af.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vrf_af.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosVrfafModule, self).tearDown() + self.mock_load_config.stop() + self.mock_get_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_vrf_af", "config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_vrf_af_present_current_non_existing(self): + set_module_args(dict(vrf="vrf0", afi="ipv4", state="present")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["vrf context vrf0", "address-family ipv4 unicast"], + ) + + def test_nxos_vrf_af_present_current_existing(self): + set_module_args(dict(vrf="vrf1", afi="ipv4", state="present")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_absent_current_non_existing(self): + set_module_args(dict(vrf="vrf0", afi="ipv4", state="absent")) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_absent_current_existing(self): + set_module_args(dict(vrf="vrf1", afi="ipv4", state="absent")) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["vrf context vrf1", "no address-family ipv4 unicast"], + ) + + def test_nxos_vrf_af_auto_evpn_route_target_present_current_existing(self): + set_module_args( + dict(vrf="vrf11", afi="ipv4", route_target_both_auto_evpn=True) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_auto_evpn_route_target_present_current_non_existing( + self + ): + set_module_args( + dict(vrf="vrf10", afi="ipv4", route_target_both_auto_evpn=True) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf10", + "address-family ipv4 unicast", + "route-target both auto evpn", + ], + ) + + def test_nxos_vrf_af_auto_evpn_route_target_absent_current_existing(self): + set_module_args( + dict(vrf="vrf11", afi="ipv4", route_target_both_auto_evpn=False) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf11", + "address-family ipv4 unicast", + "no route-target both auto evpn", + ], + ) + + def test_nxos_vrf_af_auto_evpn_route_target_absent_current_non_existing( + self + ): + set_module_args( + dict(vrf="vrf1", afi="ipv4", route_target_both_auto_evpn=False) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_import_present_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target import 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_default_direction_present_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[{"rt": "65000:1000", "state": "present"}], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target import 65000:1000", + "route-target export 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_import_present_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_default_direction_present_current_existing( + self + ): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[{"rt": "65000:1000", "state": "present"}], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_multi_import_present_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "import", + "state": "present", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target import 65000:1000", + "route-target import 65001:1000", + "route-target import 65002:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_import_present_current_existing( + self + ): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "import", + "state": "present", + }, + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_import_absent_current_non_existing(self): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "absent", + } + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_import_absent_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "absent", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target import 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_import_absent_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "absent", + }, + { + "rt": "65001:1000", + "direction": "import", + "state": "absent", + }, + { + "rt": "65002:1000", + "direction": "import", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_multi_import_absent_current_existing( + self + ): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "absent", + }, + { + "rt": "65001:1000", + "direction": "import", + "state": "absent", + }, + { + "rt": "65002:1000", + "direction": "import", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target import 65000:1000", + "no route-target import 65001:1000", + "no route-target import 65002:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_import_absent_current_mix(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "import", + "state": "absent", + }, + { + "rt": "65003:1000", + "direction": "import", + "state": "present", + }, + { + "rt": "65004:1000", + "direction": "import", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target import 65002:1000", + "route-target import 65003:1000", + ], + ) + + def test_nxos_vrf_af_route_target_export_present_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target export 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_export_present_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_multi_export_present_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "export", + "state": "present", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target export 65000:1000", + "route-target export 65001:1000", + "route-target export 65002:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_export_present_current_existing( + self + ): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "export", + "state": "present", + }, + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_export_absent_current_non_existing(self): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "absent", + } + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_export_absent_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "absent", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target export 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_export_absent_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "absent", + }, + { + "rt": "65001:1000", + "direction": "export", + "state": "absent", + }, + { + "rt": "65002:1000", + "direction": "export", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_multi_export_absent_current_existing( + self + ): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "absent", + }, + { + "rt": "65001:1000", + "direction": "export", + "state": "absent", + }, + { + "rt": "65002:1000", + "direction": "export", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target export 65000:1000", + "no route-target export 65001:1000", + "no route-target export 65002:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_export_absent_current_mix(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "export", + "state": "absent", + }, + { + "rt": "65003:1000", + "direction": "export", + "state": "present", + }, + { + "rt": "65004:1000", + "direction": "export", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target export 65002:1000", + "route-target export 65003:1000", + ], + ) + + def test_nxos_vrf_af_route_target_both_present_current_non_existing(self): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target import 65000:1000", + "route-target export 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_both_present_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_multi_both_present_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "both", + "state": "present", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target import 65000:1000", + "route-target export 65000:1000", + "route-target import 65001:1000", + "route-target export 65001:1000", + "route-target import 65002:1000", + "route-target export 65002:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_both_present_current_existing( + self + ): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "both", + "state": "present", + }, + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_both_absent_current_non_existing(self): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "absent", + } + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_both_absent_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "absent", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target import 65000:1000", + "no route-target export 65000:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_both_absent_current_non_existing( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "absent", + }, + { + "rt": "65001:1000", + "direction": "both", + "state": "absent", + }, + { + "rt": "65002:1000", + "direction": "both", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=False) + self.assertEqual(result["commands"], []) + + def test_nxos_vrf_af_route_target_multi_both_absent_current_existing(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "absent", + }, + { + "rt": "65001:1000", + "direction": "both", + "state": "absent", + }, + { + "rt": "65002:1000", + "direction": "both", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target import 65000:1000", + "no route-target export 65000:1000", + "no route-target import 65001:1000", + "no route-target export 65001:1000", + "no route-target import 65002:1000", + "no route-target export 65002:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_both_absent_current_mix(self): + set_module_args( + dict( + vrf="vrf21", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "both", + "state": "absent", + }, + { + "rt": "65003:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65004:1000", + "direction": "both", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf21", + "address-family ipv4 unicast", + "no route-target import 65002:1000", + "no route-target export 65002:1000", + "route-target import 65003:1000", + "route-target export 65003:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_both_current_only_import_or_export( + self + ): + set_module_args( + dict( + vrf="vrf31", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65001:1000", + "direction": "both", + "state": "present", + }, + { + "rt": "65002:1000", + "direction": "both", + "state": "absent", + }, + { + "rt": "65003:1000", + "direction": "both", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf31", + "address-family ipv4 unicast", + "route-target export 65000:1000", + "route-target import 65001:1000", + "no route-target import 65002:1000", + "no route-target export 65003:1000", + ], + ) + + def test_nxos_vrf_af_route_target_multi_direction_current_only_import_or_export( + self + ): + set_module_args( + dict( + vrf="vrf31", + afi="ipv4", + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + }, + {"rt": "65001:1000", "state": "present"}, + { + "rt": "65002:1000", + "direction": "export", + "state": "absent", + }, + { + "rt": "65003:1000", + "direction": "export", + "state": "absent", + }, + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf31", + "address-family ipv4 unicast", + "route-target export 65000:1000", + "route-target import 65001:1000", + "no route-target export 65003:1000", + ], + ) + + def test_nxos_vrf_af_auto_evpn_route_target_and_manual_route_target(self): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + route_target_both_auto_evpn=True, + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + [ + "vrf context vrf1", + "address-family ipv4 unicast", + "route-target both auto evpn", + "route-target import 65000:1000", + "route-target export 65000:1000", + ], + ) + + def test_nxos_vrf_af_auto_evpn_route_target_and_manual_route_targets_with_absent_vrf( + self + ): + set_module_args( + dict( + vrf="vrf1", + afi="ipv4", + state="absent", + route_target_both_auto_evpn=True, + route_targets=[ + { + "rt": "65000:1000", + "direction": "both", + "state": "present", + } + ], + ) + ) + result = self.execute_module(changed=True) + self.assertEqual( + result["commands"], + ["vrf context vrf1", "no address-family ipv4 unicast"], + ) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep.py new file mode 100644 index 00000000..e0011c15 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep.py @@ -0,0 +1,105 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vxlan_vtep +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVxlanVtepVniModule(TestNxosModule): + + module = nxos_vxlan_vtep + + def setUp(self): + super(TestNxosVxlanVtepVniModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vxlan_vtep.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vxlan_vtep.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosVxlanVtepVniModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_vxlan_vtep", "config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_vxlan_vtep(self): + set_module_args( + dict(interface="nve1", description="simple description") + ) + self.execute_module( + changed=True, + commands=[ + "interface nve1", + "terminal dont-ask", + "description simple description", + ], + ) + + def test_nxos_vxlan_vtep_present_no_change(self): + set_module_args(dict(interface="nve1")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_vxlan_vtep_absent(self): + set_module_args(dict(interface="nve1", state="absent")) + self.execute_module(changed=True, commands=["no interface nve1"]) + + def test_nxos_vxlan_vtep_absent_no_change(self): + set_module_args(dict(interface="nve2", state="absent")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_vxlan_vtep_multisite(self): + set_module_args( + dict( + interface="nve1", + multisite_border_gateway_interface="Loopback10", + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface nve1", + "terminal dont-ask", + "multisite border-gateway interface loopback10", + ], + ) + + def test_nxos_vxlan_vtep_multisite_exists(self): + set_module_args( + dict( + interface="nve1", + multisite_border_gateway_interface="Loopback1", + ) + ) + self.execute_module(changed=False, commands=[]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep_vni.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep_vni.py new file mode 100644 index 00000000..638c2a76 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/network/nxos/test_nxos_vxlan_vtep_vni.py @@ -0,0 +1,119 @@ +# (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 . + +# Make coding more python3-ish + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible_collections.cisco.nxos.plugins.modules import nxos_vxlan_vtep_vni +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosVxlanVtepVniModule(TestNxosModule): + + module = nxos_vxlan_vtep_vni + + def setUp(self): + super(TestNxosVxlanVtepVniModule, self).setUp() + + self.mock_load_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vxlan_vtep_vni.load_config" + ) + self.load_config = self.mock_load_config.start() + + self.mock_get_config = patch( + "ansible_collections.cisco.nxos.plugins.modules.nxos_vxlan_vtep_vni.get_config" + ) + self.get_config = self.mock_get_config.start() + + def tearDown(self): + super(TestNxosVxlanVtepVniModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None, device=""): + self.get_config.return_value = load_fixture( + "nxos_vxlan_vtep_vni", "config.cfg" + ) + self.load_config.return_value = None + + def test_nxos_vxlan_vtep_vni_present_no_change(self): + set_module_args(dict(interface="nve1", vni=6000)) + self.execute_module(changed=False, commands=[]) + + def test_nxos_vxlan_vtep_vni(self): + set_module_args(dict(interface="nve1", vni=5000)) + self.execute_module( + changed=True, commands=["interface nve1", "member vni 5000"] + ) + + def test_nxos_vxlan_vtep_vni_absent(self): + set_module_args(dict(interface="nve1", vni=6000, state="absent")) + self.execute_module( + changed=True, commands=["interface nve1", "no member vni 6000"] + ) + + def test_nxos_vxlan_vtep_vni_absent_no_change(self): + set_module_args(dict(interface="nve2", vni=6000, state="absent")) + self.execute_module(changed=False, commands=[]) + + def test_nxos_vxlan_vtep_vni_multi_ingress_repl(self): + set_module_args( + dict( + interface="nve1", + vni=5000, + multisite_ingress_replication="enable", + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface nve1", + "member vni 5000", + "multisite ingress-replication", + ], + ) + + def test_nxos_vxlan_vtep_vni_multi_ingress_repl_opt(self): + set_module_args( + dict( + interface="nve1", + vni=5000, + multisite_ingress_replication="optimized", + ) + ) + self.execute_module( + changed=True, + commands=[ + "interface nve1", + "member vni 5000", + "multisite ingress-replication optimized", + ], + ) + + def test_nxos_vxlan_vtep_vni_multi_ingress_repl_opt_exists(self): + set_module_args( + dict( + interface="nve1", + vni=6000, + multisite_ingress_replication="optimized", + ) + ) + self.execute_module(changed=False, commands=[]) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/utils.py b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/utils.py new file mode 100644 index 00000000..dbfae764 --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/modules/utils.py @@ -0,0 +1,51 @@ +from __future__ import absolute_import, division, print_function + +__metaclass__ = type +import json + +from ansible_collections.cisco.nxos.tests.unit.compat import unittest +from ansible_collections.cisco.nxos.tests.unit.compat.mock import patch +from ansible.module_utils import basic +from ansible.module_utils._text import to_bytes + + +def set_module_args(args): + if "_ansible_remote_tmp" not in args: + args["_ansible_remote_tmp"] = "/tmp" + if "_ansible_keep_remote_files" not in args: + args["_ansible_keep_remote_files"] = False + + args = json.dumps({"ANSIBLE_MODULE_ARGS": args}) + basic._ANSIBLE_ARGS = to_bytes(args) + + +class AnsibleExitJson(Exception): + pass + + +class AnsibleFailJson(Exception): + pass + + +def exit_json(*args, **kwargs): + if "changed" not in kwargs: + kwargs["changed"] = False + raise AnsibleExitJson(kwargs) + + +def fail_json(*args, **kwargs): + kwargs["failed"] = True + raise AnsibleFailJson(kwargs) + + +class ModuleTestCase(unittest.TestCase): + def setUp(self): + self.mock_module = patch.multiple( + basic.AnsibleModule, exit_json=exit_json, fail_json=fail_json + ) + self.mock_module.start() + self.mock_sleep = patch("time.sleep") + self.mock_sleep.start() + set_module_args({}) + self.addCleanup(self.mock_module.stop) + self.addCleanup(self.mock_sleep.stop) diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/requirements.txt b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/requirements.txt new file mode 100644 index 00000000..a9772bea --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tests/unit/requirements.txt @@ -0,0 +1,42 @@ +boto3 +placebo +pycrypto +passlib +pypsrp +python-memcached +pytz +pyvmomi +redis +requests +setuptools > 0.6 # pytest-xdist installed via requirements does not work with very old setuptools (sanity_ok) +unittest2 ; python_version < '2.7' +importlib ; python_version < '2.7' +netaddr +ipaddress +netapp-lib +solidfire-sdk-python + +# requirements for F5 specific modules +f5-sdk ; python_version >= '2.7' +f5-icontrol-rest ; python_version >= '2.7' +deepdiff + +# requirement for Fortinet specific modules +pyFMG + +# requirement for aci_rest module +xmljson + +# requirement for winrm connection plugin tests +pexpect + +# requirement for the linode module +linode-python # APIv3 +linode_api4 ; python_version > '2.6' # APIv4 + +# requirement for the gitlab module +python-gitlab +httmock + +# requirment for kubevirt modules +openshift ; python_version >= '2.7' diff --git a/collections-debian-merged/ansible_collections/cisco/nxos/tox.ini b/collections-debian-merged/ansible_collections/cisco/nxos/tox.ini new file mode 100644 index 00000000..a46d4a0c --- /dev/null +++ b/collections-debian-merged/ansible_collections/cisco/nxos/tox.ini @@ -0,0 +1,31 @@ +[tox] +minversion = 1.4.2 +envlist = linters +skipsdist = True + +[testenv] +deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt + +[testenv:black] +install_command = pip install {opts} {packages} +commands = + black -v -l79 {toxinidir} + +[testenv:linters] +install_command = pip install {opts} {packages} +commands = + black -v -l79 --diff --check {toxinidir} + flake8 {posargs} + +[testenv:venv] +commands = {posargs} + +[flake8] +# E123, E125 skipped as they are invalid PEP-8. + +show-source = True +ignore = E123,E125,E203,E402,E501,E741,F401,F811,F841,W503 +max-line-length = 160 +builtins = _ +exclude = .git,.tox,tests/unit/compat/ -- cgit v1.2.3